1. 程式人生 > 其它 >教我兄弟學Android逆向08 IDA爆破簽名驗證

教我兄弟學Android逆向08 IDA爆破簽名驗證

上一篇教我兄弟學Android逆向07 IDA破解第一個so》我帶你下載了逆向神器IDA,並用IDA修改了我們第6課寫的一個Demo 學完上節課的課程有點同學反映說用進位制修改器修改so會好些 比如說010EDitor 不可否認的是進位制修改器確實好用 但是上節課的目的是讓你接觸到IDA這個工具關於010EDitor後面的課程會有講到。

對於apk的簽名我想你一定不陌生apk如果被反編譯 那麼原有的簽名將不會保留 如果你要想對反編譯後的apk重新打包 那麼就要對apk重新簽名才能安裝到手機上。
通過百度知道一個apk只有一個簽名 而且這個簽名是必須存在的 不然你這個apk就不能安裝到手機上 。

要麼學!要麼不學!學和不學之間沒有中間值 不學就放棄,學就要去認真的學! --致選擇


看了上面我的介紹 你有點不耐煩說大哥我要跟你學的是破解你跟我講什麼簽名 我不學了!

大兄弟你彆著急,還記得李華嗎?咱們兒時的小夥伴 ,有點事想請你幫忙。


下面介紹一下李華 李華是一個很有天賦 的Android程式設計師 他用了半年時間含辛茹苦,挑燈夜戰,摧枯拉朽的編寫了一款黑寶寶遊戲 當然這幾個詞形容的並不恰當 但是李華確實為了這個apk的上線付出了很多努力誰知遊戲剛一上線就被破解了,生不生氣?難不難過?
吸取了這次的教訓 李華決定要反擊 他通過書籍 瞭解到一個apk只有一個簽名 於是他有了一個很大膽的想法:
如果別人要破解我的apk他一定會對我的apk進行重打包 但是重打包後的簽名就不是我原來的簽名了 我可以在程式碼中判斷 如果簽名不是我的簽名 那麼就讓程式退出 這樣不就達到防止別人破解的目的了,哈哈哈 太佩服我自己了。


他知道你最近在學習Android逆向 他想在遊戲上線前讓你測試一下他新加的簽名驗證是否能防住別人的破解。
下面是李華編寫的黑寶寶apk
連結:https://pan.baidu.com/s/1h6pX2ARE3qtiKiYbcnJ-3g密碼:duv5

你拿到這個apk直接反編譯重打包後安裝到手機上,剛一執行程式就退出,你懵了,明明我什麼都沒改!接著看了一會反編譯後的程式碼說:
他的簽名驗證是寫在so裡面的 但是我不會so的破解 大哥你教教我吧!

我說:好吧!

下面開始本節課的課程 請同學們認真聽課。

一開啟匯出表視窗(Exports)
1.用apktool解包apk後用IDA開啟libJniTest.so
下面介紹兩個視窗:
(1)Exports視窗是匯出表(so中能讓外部呼叫的函式)
(2)Imports視窗是匯入表(so呼叫到外面的函式)

2.通過分析java層知道程式呼叫了一個native層函式check 既然知道了
Exports視窗能列舉出so中被外部呼叫的所有函式 又知道natve函式check是在java層被呼叫的
所以開啟匯出表視窗 搜尋check通過第6課知道 so中的函式都是java_包名類名_方法名格式的 所以這裡check函式就被找到了
<ignore_js_op>

3.雙擊進去檢視check方法 並按鍵盤f5將彙編轉換成C語言 但是這裡看到好多中文亂碼 此時按住alt+A鍵開啟ASCII string style視窗
然後點選set default encodings 在彈出框中選擇8-bit的change 選擇utf-8後點擊ok回到c語言介面按f5重新整理一下介面 亂碼問題解決
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

4.亂碼問題雖然解決了 但是下面的程式碼可讀性很差 此時需要匯入jni.h檔案 點File->Load file->Parse C header file 找到jni.h所在位置 點開啟 此時顯示Compilation successful 匯入成功
下載連結:https://pan.baidu.com/s/1n16NEx67zLHfGtVpU-CKAA密碼:7xg6
<ignore_js_op>
<ignore_js_op>

5.點選函式第一個引數int 右鍵Convert to struct* 在彈出的框中選擇_JNIEnv點ok後可以看到有一些函式已經顯示出來了
<ignore_js_op>

6.雖然現在下面已經顯示出來一些函式 但是可讀性還是差一點 為了讓程式碼可讀性更好 選中下面的函式 右鍵Force call type
<ignore_js_op>

7 其他的函式也都這樣做 然後點住a1按住n鍵重新命名為env 至於為什麼這樣做 這不是本節課的重點 以後的課程中會講到的
<ignore_js_op>

8.以後的課程會有JNI的編寫 所以這裡就不帶你分析了 由於本節課的重點是破解 點選回到彙編檢視 然後按空格鍵轉化為圖形檢視通過圖形檢視可以對apk的整個邏輯一覽無餘 快捷鍵ctrl+滑鼠滑輪可以縮小方法檢視
<ignore_js_op>
<ignore_js_op>

9 通過圖形檢視很清晰的可以看出 如果簽名正確程式通過BNE指令跳到左檢視程式繼續執行 否則跳到右檢視退出程式
BNE: 資料跳轉指令,標誌暫存器中Z標誌位不等於零時, 跳轉到BNE後標籤處
BEQ: 資料跳轉指令,標誌暫存器中Z標誌位等於零時, 跳轉到BEQ後標籤處
這兩條彙編指令相當於smali裡面的if-eqz,if-nez是相反的

<ignore_js_op>

10.通過上面的分析 現在你知道怎麼改了吧 沒錯就是把BNE改成BEQ 讓程式在簽名錯誤的情況下還能繼續執行 滑鼠選中BNE執行按住空格鍵 返回到彙編檢視 通過上一課你知道修改so就是改16進位制
通過滑鼠點住BEQ 可以看到BEQ命令對應的16進位制是D0 那麼這裡只要把BNE那行命令BNE對應的16進位制改成D0是不是就可以把命令BNE換成BEQ了

11 滑鼠點住BNE那行命令 View->Open subviews->Hex dump開啟16進位制編輯 把BNE
<ignore_js_op>
<ignore_js_op>

12回到彙編視窗可以看到BEN已經被改成了BEQ
<ignore_js_op>

13 儲存so 然後重打包 用AndroidKiller給apk進行簽名 安裝到手機上程式正常執行 成功爆破簽名驗證這裡就不用我多說了吧 不會做的自己回去看上一節課

二 總結
本節課我帶你認識了apk的簽名驗證 然後通過李華給你測試的apk又熟悉了IDA的使用 瞭解了IDA的匯入和匯出視窗接著又學習了兩條彙編指令 總體來說從這節課你收貨的東西還是挺多的 本節課看不懂的知識一定要自己去百度 不要有老師不講自己就不學習了這種態度。

課堂作業
1.爆破李華Demo中的使用者名稱和密碼 要求輸入任意使用者名稱和密碼 會提示登陸成功
2.看完《IDA Pro權威指南》6-12章



下一篇:教我兄弟學Android逆向09 IDA動態破解登陸驗證

學習時的痛苦是暫時的 未學到的痛苦是終生的