用Xpose完美實現(xiàn)電話錄音,支持android 8.1.0

前言

電話錄音是android逆向產(chǎn)品中一個非常重要的功能禁添,同時它也是一個比較難以處理的模塊。難點有3:
1.在正向應用中桨踪,我們通過RECORD_AUDIO權(quán)限得到的錄音只能聽到自己的聲音老翘,對方的聲音完全聽不到,這是谷歌對電話模塊的特殊處理锻离,增強用戶隱私。
2.在正向應用中,電話有三種狀態(tài)揉稚,

CALL_STATE_IDLE  空閑態(tài)(沒有通話活動)
CALL_STATE_RINGING 包括響鈴炼七,第三方來電等待
CALL_STATE_OFFHOOK 包括撥號中,接通虱朵,掛起 3個狀態(tài)

這里我們可以知道莉炉,如果不做其他的特殊處理,你記錄的錄音是包含撥打時候的嘟嘟聲碴犬,所以獲取接通那一刻狀態(tài)即 active狀態(tài)非常關(guān)鍵絮宁。
3.運營商的問題》可能有些朋友覺得很奇怪绍昂,這個跟運營商也有關(guān)系,是不是在扯淡偿荷。稍安勿躁窘游,有用過電信卡的朋友可能知道,只要你撥出去了跳纳,你的通話界面就開始從00:00開始計時了忍饰,而移動聯(lián)通則不會。據(jù)我觀察棒旗,好像跟機型有關(guān)系喘批,極少數(shù)手機在撥通后才開始計時撩荣。聰明的你可能發(fā)現(xiàn)問題了,我的思路就是從撥號界面出現(xiàn)00:00就開始計時饶深,針對電信就特殊處理一下餐曹。

硬件及環(huán)境

裝好xposed的華為8c,android 系統(tǒng)版本:8.1.0

對xpose不熟怎么辦

xpose入門非常簡單敌厘,有正向開發(fā)的經(jīng)驗將會非常容易台猴。我寫了一個xpose模塊庫,在你手機裝好xpose后俱两,就可以直接運行該庫了饱狂,也可以在HookMain中定制你的代碼,在編碼逆向代碼時宪彩,請牢記你代碼會運行在哪個進程休讳。
Github地址:https://github.com/twangithub/XposedBase

實現(xiàn)功能

在文章的開始列出了實現(xiàn)功能的難點,下面我直接祭出核心代碼并標示注解尿孔。
電話的狀態(tài):

public static final int PRECISE_CALL_STATE_IDLE =           0; //通話空閑
public static final int PRECISE_CALL_STATE_ACTIVE =         1; //正在通話(活動中)
public static final int PRECISE_CALL_STATE_HOLDING =        2; //通話掛起(例如我和多個人通話,其中一個通話在活動,而其它通話就會進入掛起狀態(tài))
public static final int PRECISE_CALL_STATE_DIALING =        3; //撥號開始
public static final int PRECISE_CALL_STATE_ALERTING =       4; //正在呼出(提醒對方接電話)
public static final int PRECISE_CALL_STATE_INCOMING =       5; //對方來電
public static final int PRECISE_CALL_STATE_WAITING =        6; //第三方來電等待(例如我正在和某人通話,而其他人打入時就會就進入等待狀態(tài))
public static final int PRECISE_CALL_STATE_DISCONNECTED =   7; //掛斷完成
public static final int PRECISE_CALL_STATE_DISCONNECTING =  8; //正在掛斷

① hook android framework層android.telephony包下的核心類俊柔,獲取撥打過來的電話號碼

XposedHelpers.findAndHookMethod("android.telephony.PhoneNumberUtils", loadPkgParam.classLoader, "normalizeNumber", String.class,
                    new XC_MethodHook() {
                   
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            String number = (String) param.args[0];
                            if (null != number) {
                                String phonenumber = number.toString().trim();
                                LogUtils.d("獲取對方電話號碼=" + phonenumber.trim().replace(" ", ""));
                            }
                        }
                    });

② 同樣在該包下活合,獲取電話撥打的狀態(tài)雏婶。這里有一個很重要的注意點,對于電信卡是無法獲取active的狀態(tài)白指,所以只能采用別的方法留晚,但是撥號是知道的,這里為了區(qū)分是呼入還是呼出提前記錄一下該值告嘲。

Class PreciseCallState = XposedHelpers.findClass("android.telephony.PreciseCallState",loadPkgParam.classLoader);
            XposedHelpers.findAndHookMethod(PreciseCallState, "getForegroundCallState", new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    int result = (int) param.getResult();
                    LogUtils.d("電話狀態(tài):" + result); //對應上面8個狀態(tài)
                }
            });

③ 那什么時候開始錄音呢, 我們可以從撥打電話的界面下手错维,撥通后,從00:00開始計時橄唬,而且計時有一個遞增的數(shù)值需五,所以有兩種解決方式。這兩種方式在電信卡接通后重新開始計時都要特殊處理一下轧坎,不過這些已經(jīng)是小問題了宏邮。
1.用00:00的方式, 這個api通用性較低,很多機型可能不支持

XposedHelpers.findAndHookMethod("com.android.incallui.view.CallCardStateInfoView",
                    mLpp.classLoader,"setCallElapsedTime", boolean.class, String.class,
                    new XC_MethodHook() {

                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            String callRecordTime = (String) param.args[1];
                            //判斷callRecordTime 出現(xiàn)00:00并開始錄音操作
                        }
                    });

2.用計時增長的方式(本例采用)缸血,能適用于較多機型蜜氨,實際已測試為準

XposedHelpers.findAndHookMethod("com.android.incallui.CallCardFragment",
                    loadPkgParam.classLoader, "setPrimaryCallElapsedTimeLong", boolean.class, long.class,
                    new XC_MethodHook() {
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            long mElapsed = (long) param.args[1];
                            //針對電信: 經(jīng)過多次驗證發(fā)現(xiàn) mElapsed 的值幾乎是小于1000的,第二次的話肯定比上一次小,極少數(shù)情況在接通后mElapsed的值大于1000.
                            //錄音處理
                            
                    }
});
                

④ 如何能錄到對方的聲音

正向應用我們只能獲取MediaRecorder.AudioSource.MIC捎泻,考慮到我們適用xpose的時候能指定任意進程飒炎,
所以在錄音的時候找一個有這樣的權(quán)限的進程即可,本例中采用的是com.android.incallui
并把錄音源指定為 MediaRecorder.AudioSource.VOICE_CALL笆豁。

最后

以上就是實現(xiàn)電話錄音最核心的代碼(可別小看了以上幾行代碼郎汪,逆向一個api并加以驗證要花不少時間)赤赊。而且我在做的過程中所踩的坑也在注釋中標明。需要注意的是煞赢,逆向代碼很難有通用性抛计,原因是android每個版本代碼都可能會改變,而且手機廠商還會對ROM代碼進行修改照筑。所以吹截,逆向都是針對特定的機型。如果你對逆向感興趣凝危,或者有什么問題想交流波俄,方便的話可以加我微信(tuhuan32005)。謝謝 _ !

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛾默,一起剝皮案震驚了整個濱河市懦铺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌支鸡,老刑警劉巖阀趴,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苍匆,居然都是意外死亡,警方通過查閱死者的電腦和手機棚菊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門浸踩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人统求,你說我怎么就攤上這事检碗。” “怎么了码邻?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵折剃,是天一觀的道長。 經(jīng)常有香客問我像屋,道長怕犁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任己莺,我火速辦了婚禮奏甫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凌受。我一直安慰自己阵子,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布胜蛉。 她就那樣靜靜地躺著挠进,像睡著了一般色乾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上领突,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天暖璧,我揣著相機與錄音,去河邊找鬼攘须。 笑死漆撞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的于宙。 我是一名探鬼主播浮驳,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捞魁!你這毒婦竟也來了至会?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谱俭,失蹤者是張志新(化名)和其女友劉穎奉件,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昆著,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡县貌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凑懂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煤痕。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖接谨,靈堂內(nèi)的尸體忽然破棺而出摆碉,到底是詐尸還是另有隱情,我是刑警寧澤脓豪,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布巷帝,位于F島的核電站,受9級特大地震影響扫夜,放射性物質(zhì)發(fā)生泄漏楞泼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一笤闯、第九天 我趴在偏房一處隱蔽的房頂上張望现拒。 院中可真熱鬧,春花似錦望侈、人聲如沸印蔬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侥猬。三九已至例驹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間退唠,已是汗流浹背鹃锈。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞧预,地道東北人屎债。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像垢油,于是被迫代替她去往敵國和親盆驹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Newly renovated studio apartment available for rent in CB...
    Crystal52閱讀 380評論 0 0
  • 一個配置 Spring Bean 的 xml 文件經(jīng)常能看到如下代碼: 看不懂這一堆東西滩愁,是會吃了沒文化的的虧的躯喇。...
    何狗帶閱讀 209評論 0 0
  • 爸爸昨天顧車把包裹拉到車站,凖備打郵便硝枉。今天領我們娘四個趕往本汐火車站廉丽,還隨跟幾個親戚,鄰居送行妻味。五人走進站臺聽見...
    岳麗穎閱讀 234評論 0 3
  • 紅云沉沉沉欲墜 問幾何回 待落葉成堆 風雨未來奈何睡 昏暗庭簾偷月垂 多少故顏付流水 胭脂花蕊 錦城暮色頹 尋樂青...
    FTHEG閱讀 403評論 0 0
  • 頁腳置底(Sticky footer) 就是讓網(wǎng)頁的footer部分始終在瀏覽器窗口的底部正压。 當網(wǎng)頁內(nèi)容足夠長以至...
    Hi小胡閱讀 507評論 0 6