為了安全起見,一些應(yīng)用會利用自身的簽名信息對應(yīng)用做一層防護粮揉,為了防止應(yīng)用被二次打包操作,在之前已經(jīng)介紹了很多關(guān)于應(yīng)用簽名校驗爆破的方法抚笔,一條基本原則不能忘:全局搜索”signature”字符串扶认,這里可以在Jadx打開apk搜索,也可以在IDA中打開so搜索都可以殊橙。找到這信息之后可以手動的修改校驗邏輯辐宾,但是這個法則有個問題,就是如果一個應(yīng)用在代碼中很多地方都做了簽名校驗膨蛮,比如以前介紹的一篇爆破游戲文章:Android中爆破應(yīng)用簽名信息案例分析叠纹,那時候就會發(fā)現(xiàn),應(yīng)用在很多地方都做了簽名校驗敞葛,當(dāng)時的解決辦法是一個一個地方修改誉察,這樣會感覺操作非常繁瑣,所以本人就發(fā)明了一個比較好的辦法惹谐,就是直接hook應(yīng)用的pms服務(wù)持偏,攔截其獲取簽名的方法,然后替換正確的簽名信息即可氨肌。這個技術(shù)得益于之前介紹的技術(shù):Android中免root進行hook應(yīng)用自身的系統(tǒng)服務(wù)鸿秆,這個技術(shù)原理非常簡單,就是借助于動態(tài)代理技術(shù)+反射機制即可怎囚。而這個技術(shù)正好可以用于這次自動爆破功能卿叽,我們只需要在程序的入口處添加這段hook代碼即可。關(guān)于這個技術(shù)恳守,在上一篇的文章中已經(jīng)實踐過了:Android中爆破應(yīng)用簽名校驗的新姿勢考婴。在那篇文章中我結(jié)尾說到了,這樣的操作步驟可以完全自動化井誉,所以這篇文章就把這個操作步驟變成自動化蕉扮,開發(fā)一款一鍵化操作工具,我將其命名為:kill_signed_tools(簡稱:kstools);
二颗圣、工具流程開發(fā)
在介紹這個工具開發(fā)之前喳钟,我們還必須了解一個知識點,就是我在之前開發(fā)的一個自動注入代碼工具icodetools的原理在岂,不了解的同學(xué)可以去查看這篇文章:Android中自動注入代碼工具icodetools原理解析奔则,主要利用asm技術(shù)和dex2jar工具進行操作的。因為本文我們需要在應(yīng)用的入口插入hook代碼蔽午,所以也需要這樣類似操作易茬。原理和準備工作已經(jīng)介紹完了,下面開始正式的開發(fā)流程:
第一步:獲取應(yīng)用正確簽名信息
因為我們在后面hook代碼之后攔截簽名方法,得返回應(yīng)用本身正確的簽名信息抽莱,所以得在第一步中就要獲取應(yīng)用簽名信息范抓,這個網(wǎng)上有很多代碼可以直接獲取apk文件的簽名信息,這里不多說了食铐。
第二步:獲取應(yīng)用入口信息
這個需要借助AXMLPrinter.jar工具來進行解析apk文件中的AndroidManifest.xml文件信息匕垫,然后獲取程序入口,這里采用PullXML解析方式虐呻,需要注意的是:應(yīng)用的入口一般有兩處象泵,一個是自定義的Application,一個是啟動Activity斟叼。所以這里解析的時候偶惠,優(yōu)先判斷有沒有自定義的Application入口,如果沒有朗涩,就獲取啟動的Activity即可忽孽。找到入口之后一定要獲取入口類的完整名稱即:包名+類名。
第三步:插入hook功能代碼
借助于icodetools工具馋缅,以及第二步中獲取到的程序入口類信息扒腕,開始動態(tài)插入hook代碼,這里需要注意的是:最好是在attachBaseContext方法中進行添加即可萤悴,如果入口類沒有實現(xiàn)這個方法瘾腰,可以在onCreate方法中添加,但是一定要在方法的第一行代碼處添加覆履。插入的asm代碼也很簡單蹋盆,可以利用Bytecode插件進行查看即可:
我們只需要將這段asm代碼添加到入口處即可:
而這里的ServiceManagerWraper類后面會給出下載地址。
第四步:二次打包簽名
這個中間還有很多步驟硝全,比如講jar轉(zhuǎn)化成dex,再把dex替換到apk中栖雾,這個過程在icodetools中已經(jīng)有了,完全一樣伟众,這里就沒必要在介紹了析藕,最后一步都是二次打包簽名操作。
三凳厢、hook代碼分析
到這里我們就把操作步驟流程介紹完了账胧,下面在來介紹關(guān)于hook代碼邏輯,hook代碼比較簡單先紫,就兩個類治泥,一個是反射類,一個是動態(tài)代理類遮精,下載地址后面會給出:
這里的代碼非常簡單居夹,通過傳入的Context變量,利用反射機制替換服務(wù)的Binder對象,然后就是動態(tài)代理對象:
攔截獲取簽名信息的方法准脂,替換正確的簽名信息即可劫扒。然后將這兩個類編譯得到對應(yīng)的class文件,放到工具目錄下:
所以最終的工具目錄是這樣的結(jié)構(gòu)意狠,只要將操作的apk文件拷貝到這里粟关,改名為src.apk,然后運行kstools.bat即可:
這個運行操作和icodetools操作一模一樣环戈,運行完成之后,會生成一個signed.apk簽過名的澎灸,還有一個沒有簽名的unsigned.apk文件院塞,如果想自己簽名,可以利用這個文件即可性昭。
這時候我們可以用Jadx工具查看signed.apk文件:
添加成功了拦止。
四、工具使用說明
從github上弄下來的工具目錄如下:
因為現(xiàn)在很多app做了加固操作糜颠,所以這里需要注意這么幾個問題:
第一個問題:如果發(fā)現(xiàn)app加固了汹族,第一步你得先脫殼,再次說明其兴,本工具不適合加固app,需要自己手動脫殼修復(fù)apk才能繼續(xù)操作顶瞒。加固app操作,先把加固app放到當(dāng)前目錄下元旬,直接拖動apk文件到apksign.bat上運行榴徐,獲取正確的簽名信息,會保存到apksign.txt文件中匀归,然后再去脫殼修復(fù)apk,在放到當(dāng)前目錄下命名為src.apk坑资,然后在此運行kstools.bat文件即可。操作過程不可錯亂穆端,不然會出錯袱贮。
第二個問題:如果發(fā)現(xiàn)app沒有加固,那么就直接將apk命名為src.apk放到當(dāng)前目錄下体啰,直接運行kstools.bat即可攒巍,這里又要注意啦,如果直接運行kstools工具的話狡赐,當(dāng)前目錄可能存在你上次操作加固的app存留的apksign.txt文件窑业,這時候需要手動刪除,切記枕屉,不然也是操作失敗的常柄。
第三個問題:不要問怎么區(qū)分是加固的還是沒有加固的,這個技能小學(xué)生都會了,這里不介紹了西潘。
第四個問題:在獲取app簽名信息失敗的時候卷玉,怎么辦?我們需要手動的去獲取喷市,這里方法很多相种,可以用Android中的這段代碼即可:
這樣就可以得到簽名信息了,然后再把簽名信息拷貝到目錄的apksign.txt文件中即可品姓。
說明:工具第一次發(fā)布寝并,肯定有一些問題,請敬請的使用腹备,提問題衬潦,如果在操作的工程中遇到任何問題請在小密圈留言提供錯誤樣本,我好進行研究爆破植酥!
五镀岛、工具開發(fā)流程
這樣就可以得到簽名信息了,然后再把簽名信息拷貝到目錄的apksign.txt文件中即可友驮。
說明:工具第一次發(fā)布漂羊,肯定有一些問題,請敬請的使用卸留,提問題走越,如果在操作的工程中遇到任何問題請在小密圈留言提供錯誤樣本,我好進行研究爆破艾猜!
下面在來說一下這個工具的缺點买喧,其實就一點,對于一些加固的應(yīng)用是沒有效果的匆赃,本人嘗試了一些加固app,最終都是失敗的淤毛,不過這不代表就沒有任何用了,因為不是所有的應(yīng)用都會采取加固方式算柳,只要不加固低淡,那么這個工具就有效果,并且不管簽名校驗在哪都可以進行成功爆破瞬项。
Hook PMS代碼下載地址:https://github.com/fourbrother/HookPmsSignature
kstools工具下載地址:https://github.com/fourbrother/kstools
六蔗蹋、總結(jié)
本文主要介紹了一個通過hook需要爆破應(yīng)用的pms服務(wù),攔截獲取簽名信息的方法囱淋,來做到全局爆破簽名校驗功能邏輯猪杭,這個工具可以解決以往需要手動的反編譯app來進行破解,有了這個工具妥衣,完全可以一鍵化操作功能皂吮,無需在進行反編譯破解操作了