之前已經寫了一個爆破籤名校驗的工具,很多同學也在使用,但是也反饋了不少問題,之前一篇文章也介紹了,關於爆破之後第三方登錄問題修復,這篇我們在綜合說明一下一些後遺症問題,關於kstools工具說明以及工具的原理,可以看這篇文章說明:Android中自動爆破籤名工具kstools說明。
下面開始進入正題吧,關於有些同學反饋,使用該kstools爆破某app之後,出現無限制重啟問題,關於這個問題,我沒見過,很好奇就是嘗試了這個樣本案例:
看到了,的確是這樣的,無限制重啟。我們使用Jadx打開使用kstools處理過的樣本看看hook是否成功:
這裡可以看到,我們hook是成功的,所以應該不是hook的問題導致的,所以這裡就需要藉助開發經驗了:記住如果在破解過程中發現應用重啟或者閃退的時候,要第一時間想起來是否程序內部做了異常捕獲,然後自己做了一些操作導致這樣的結果。
本文案例就是這個原因導致的,所以我們得先把應用自己捕獲全局異常功能給關閉,這樣會出現系統崩潰異常信息,這樣定位問題就簡單了,對於Android中全局捕獲異常有一個特徵就是這行代碼:
Thread.setDefaultUncaughtExceptionHandler(this);
所以我們在Jadx中全局所有字符串即可:
這裡看到了,他的確有這些代碼,然後直接在反編譯之後的smali代碼中找到這些地方,注釋這行代碼即可,然後在回編譯安裝運行,果然崩潰了,看崩潰日誌信息:
是這個app內部用到了ormlite框架來操作資料庫的,具體信息就是Class類型不能轉化成String類型,我們通過這個堆棧信息跟蹤最後找到了出錯的地方:
這是個註解,看到這裡doClass是Class類型,但是默認值卻是String類型,所以報錯了,但是為什麼會這樣呢?我們用原始樣本看看:
這個才是正確的,所以我們猜想這個可能和kstools工具操作有關,因為kstools工具的操作步驟是:
解壓apk=>獲取dex=>轉化成jar(插入hook代碼)=>轉化成dex=>塞入apk=>籤名apk
而這個過程中,特別是在dex轉化成jar,然後在轉化成dex,應該是這個過程導致這個問題。所以這裡為了解決這個問題,我們還得按照這個工具的原始手動操作一下,不了解的同學可以看這篇文章:Android中爆破籤名校驗新姿勢,這樣操作時候,會發現這個註解不會有問題了,而且籤名也爆破成功了,運行正常了。
到這裡,本文內容就介紹完了,其實就是想說明一個問題也是破解過程中的一個經驗值:在應用二次籤名跑的時候發現閃退或者重啟,也沒有什麼錯誤信息的時候,要想到可能是應用本身做了捕獲全局異常的功能導致,所以只需要把這塊功能注釋即可看到詳細的錯誤信息,然後在定位解決問題即可。
當然通過這個樣本我們也發現了kstools這個工具的弊端,這個也有同學說了就是操作過於複雜,其實沒必要將dex轉化成jar然後在轉成dex的,耗時而且最大的問題在於可能在轉化過程中出錯,操作多的同學會發現有時候在dex轉化成jar或者是jar轉化成dex會出現一些錯誤信息。導致後面無法進行了。這個是工具的最大弊端。所以繼續優化這個工具,已經更新到github上了,直接將dex轉化成smali,然後進行操作即可,這樣的好處是原始的在Android基礎上進行操作了,不會帶來一些爆破後遺症了,比如本文案例用這種方式肯定就不會有問題了。
在很多同學使用這個工具或者用這種思想去爆破,提出這個問題就是如果將籤名驗證放到程序最開始入口,然後放到native層,這樣就會爆破失敗了,這裡我再說明一下,就是這個爆破的思想是hook程序的pms服務,然後攔截獲取籤名信息的方法,而加入hook的代碼已經是最開始的入口了,一般是attachBaseContext方法了,那麼及時你在native層最開始入口,比如是JNI_ONLoad函數中也是無效的。有的同學又說了?那可以把加載so放到程序的入口Application的靜態代碼塊中,這樣時機是最早的了,其實想一想這樣的確是最早,但是能在這裡校驗籤名嗎?要知道校驗籤名可能得用應用的context變量獲取信息,你在靜態代碼塊中是無法拿到這個變量的,及時你在native層也是一樣,所以在靜態代碼塊中提前load本地代碼是不行的。比如這個樣本案例,校驗就在JNI_OnLoad函數中:
這裡就是先獲取全局的context變量,然後再去進行籤名校驗功能,這裡有一個AppRuntime日誌tag,我們可以列印我們爆破成功的日誌:
看到這信息,說明已經騙過籤名校驗功能了,而這樣做是不是非常的方便了,沒必要再去分析代碼找到籤名校驗的地方了,所以這個工具還是很有用的,準確的說是這個爆破思想非常有用。
最後還想在說明兩點:
第一、有的同學說,這個工具對於加殼的app沒用,就意義不大了,首先說明並非所有的應用都會加固,特別是大型應用,因為加固有分享,他們未必採用加固,其次是,現在有很多應用不僅加固了,還做了籤名校驗,所以如果你脫殼成功還可以藉助這個工具進行操作了。
第二、通過最近同學給我反饋的使用意見和問題,這裡就總結一下使用流程:
1、首先你的樣本案例如果是加固的,那麼請你先脫殼,脫殼之後在使用kstools工具,具體用法有說明。
2、如果對於一些非加固的應用在使用的過程中可能會出現爆破失敗,比如kstools工具使用報錯,籤名校驗爆破失效,程序閃退重啟等問題,那麼可能和kstools工具有關,所以這時候可能要手動的去添加hook代碼了。
這個我在前面的文章中也提到了操作流程了。最後如果還是不行,那麼可以把樣本發給我,我幫忙查看。
關於手動添加hook代碼步驟的大致流程:
首先去github/fourbrother下載最新工程hook代碼,自己編譯一個apk之後,反編譯得到對應的smali代碼,然後將其拷貝到需要破解的apk反編譯源碼目錄下,然後在爆破app入口類添加hook代碼調用。
調用方法可以參見HookPmsSignature項目中的MyApplication/MyActivity類中的調用方式。注意hookPMS方法中的籤名和包名需要改成你想要破解app的對應信息。
關於應用入口可以在XML清單文件中查看,如果有Application類,直接在代碼類中的方法attachBaseContext或者onCreate方法添加,如果沒有就找到入口的Activity類,在其onCreate方法中添加即可。
kstools工具下載地址:
https://github.com/fourbrother/kstools
關於籤名爆破就講這麼多了,而這個工具也希望大家多多使用提意見,特別是在處理失敗的時候記得將失敗樣本發給我,本文也提到了一個破解的經驗就是出現閃退或者重啟問題記得想起全局捕獲異常功能代碼。把這部分代碼注釋就可以看到錯誤信息,然後在詳細跟蹤解決問題即可,看完文章,記得多多點讚分享哈!
手機查看文章不方便,可以網頁看
http://www.wjdiankong.cn
交流和諮詢可以進入小密圈:點擊這裡
更多技術乾貨長按二維碼快速關注公眾號