一、技術回顧為了安全起見,一些應用會利用自身的簽名信息對應用做一層防護,為了防止應用被二次打包操作,在之前已經介紹了很多關于應用簽名校驗爆破的方法,一條基本原則不能忘:全局搜索"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,最終都是失敗的,不過這不代表就沒有任何用了,因為不是所有的應用都會采取加固方式,只要不加固,那么這個工具就有效果,并且不管簽名校驗在哪都可以進行成功爆破。
Hook PMS代碼下載地址:https://github.com/fourbrother/HookPmsSignature
kstools工具下載地址:https://github.com/fourbrother/kstools
六、總結本文主要介紹了一個通過hook需要爆破應用的pms服務,攔截獲取簽名信息的方法,來做到全局爆破簽名校驗功能邏輯,這個工具可以解決以往需要手動的反編譯app來進行破解,有了這個工具,完全可以一鍵化操作功能,無需在進行反編譯破解操作了
|