Android中帶你開發一款自動爆破簽名校驗工具kstools
一、技術回顧
為了安全起見,一些應用會利用自身的簽名信息對應用做一層防護,為了防止應用被二次打包操作,在之前已經介紹了很多關於應用簽名校驗爆破的方法,一條基本原則不能忘:全局搜索"signature"字符串,這裏可以在Jadx打開apk搜索,也可以在IDA中打開so搜索都可以。找到這信息之後可以手動的修改校驗邏輯,但是這個法則有個問題,就是如果一個應用在代碼中很多地方都做了簽名校驗,比如以前介紹的一篇爆破遊戲文章:Android中爆破應用簽名信息案例分析,那時候就會發現,應用在很多地方都做了簽名校驗,當時的解決辦法是一個一個地方修改,這樣會感覺操作非常繁瑣,所以本人就發明了一個比較好的辦法,就是直接hook應用的pms服務,攔截其獲取簽名的方法,然後替換正確的簽名信息即可。這個技術得益於之前介紹的技術:Android中免root進行hook應用自身的系統服務,這個技術原理非常簡單,就是借助於動態代理技術+反射機制即可。而這個技術正好可以用於這次自動爆破功能,我們只需要在程序的入口處添加這段hook代碼即可。關於這個技術,在上一篇的文章中已經實踐過了:Android中爆破應用簽名校驗的新姿勢。在那篇文章中我結尾說到了,這樣的操作步驟可以完全自動化,所以這篇文章就把這個操作步驟變成自動化,開發一款一鍵化操作工具,我將其命名為:kill_signed_tools(簡稱:kstools);
二、工具流程開發
在介紹這個工具開發之前,我們還必須了解一個知識點,就是我在之前開發的一個自動註入代碼工具icodetools的原理,不了解的同學可以去查看這篇文章:Android中自動註入代碼工具icodetools原理解析,主要利用asm技術和dex2jar工具進行操作的。因為本文我們需要在應用的入口插入hook代碼,所以也需要這樣類似操作。原理和準備工作已經介紹完了,下面開始正式的開發流程:安徽板面
第一步:獲取應用正確簽名信息
因為我們在後面hook代碼之後攔截簽名方法,得返回應用本身正確的簽名信息,所以得在第一步中就要獲取應用簽名信息,這個網上有很多代碼可以直接獲取apk文件的簽名信息,這裏不多說了。
第二步:獲取應用入口信息
這個需要借助AXMLPrinter.jar工具來進行解析apk文件中的AndroidManifest.xml文件信息,然後獲取程序入口,這裏采用PullXML解析方式,需要註意的是:應用的入口一般有兩處,一個是自定義的Application,一個是啟動Activity。所以這裏解析的時候,優先判斷有沒有自定義的Application入口,如果沒有,就獲取啟動的Activity即可。找到入口之後一定要獲取入口類的完整名稱即:包名+類名。
第三步:插入hook功能代碼
借助於icodetools工具,以及第二步中獲取到的程序入口類信息,開始動態插入hook代碼,這裏需要註意的是:最好是在attachBaseContext方法中進行添加即可,如果入口類沒有實現這個方法,可以在onCreate方法中添加,但是一定要在方法的第一行代碼處添加。插入的asm代碼也很簡單,可以利用Bytecode插件進行查看即可:
我們只需要將這段asm代碼添加到入口處即可:
而這裏的ServiceManagerWraper類後面會給出下載地址。
第四步:二次打包簽名
這個中間還有很多步驟,比如講jar轉化成dex,再把dex替換到apk中,這個過程在icodetools中已經有了,完全一樣,這裏就沒必要在介紹了,最後一步都是二次打包簽名操作。
三、hook代碼分析
到這裏我們就把操作步驟流程介紹完了,下面在來介紹關於hook代碼邏輯,hook代碼比較簡單,就兩個類,一個是反射類,一個是動態代理類,下載地址後面會給出:
這裏的代碼非常簡單,通過傳入的Context變量,利用反射機制替換服務的Binder對象,然後就是動態代理對象:
攔截獲取簽名信息的方法,替換正確的簽名信息即可。然後將這兩個類編譯得到對應的class文件,放到工具目錄下:
所以最終的工具目錄是這樣的結構,只要將操作的apk文件拷貝到這裏,改名為src.apk,然後運行kstools.bat即可:
這個運行操作和icodetools操作一模一樣,運行完成之後,會生成一個signed.apk簽過名的,還有一個沒有簽名的unsigned.apk文件,如果想自己簽名,可以利用這個文件即可。
這時候我們可以用Jadx工具查看signed.apk文件:
添加成功了。
四、工具使用說明
從github上弄下來的工具目錄如下:
因為現在很多app做了加固操作,所以這裏需要註意這麽幾個問題:
第一個問題:如果發現app加固了,第一步你得先脫殼,再次說明,本工具不適合加固app,需要自己手動脫殼修復apk才能繼續操作。加固app操作,先把加固app放到當前目錄下,直接拖動apk文件到apksign.bat上運行,獲取正確的簽名信息,會保存到apksign.txt文件中,然後再去脫殼修復apk,在放到當前目錄下命名為src.apk,然後在此運行kstools.bat文件即可。操作過程不可錯亂,不然會出錯。
第二個問題:如果發現app沒有加固,那麽就直接將apk命名為src.apk放到當前目錄下,直接運行kstools.bat即可,這裏又要註意啦,如果直接運行kstools工具的話,當前目錄可能存在你上次操作加固的app存留的apksign.txt文件,這時候需要手動刪除,切記,不然也是操作失敗的。
第三個問題:不要問怎麽區分是加固的還是沒有加固的,這個技能小學生都會了,這裏不介紹了。
第四個問題:在獲取app簽名信息失敗的時候,怎麽辦?我們需要手動的去獲取,這裏方法很多,可以用Android中的這段代碼即可:
這樣就可以得到簽名信息了,然後再把簽名信息拷貝到目錄的apksign.txt文件中即可。
說明:工具第一次發布,肯定有一些問題,請敬請的使用,提問題,如果在操作的工程中遇到任何問題請在小密圈留言提供錯誤樣本,我好進行研究爆破!
五、工具開發流程總結
到這裏,我們就介紹完了,自動爆破簽名校驗工具的原理了,下面用一張圖來總結一下:
下面在來說一下這個工具的缺點,其實就一點,對於一些加固的應用是沒有效果的,本人嘗試了一些加固app,最終都是失敗的,不過這不代表就沒有任何用了,因為不是所有的應用都會采取加固方式,只要不加固,那麽這個工具就有效果,並且不管簽名校驗在哪都可以進行成功爆破。
Android中帶你開發一款自動爆破簽名校驗工具kstools