0x7.so逆向深化及IDA靜態(tài)分析-2

so逆向深化及IDA靜態(tài)分析-2 :IDA靜態(tài)分析之so逆向簡單實戰(zhàn)


本文從一個簡單的so層簽名校驗實戰(zhàn)來深化IDA靜態(tài)分析,先上圖:

本文樣本鏈接: https://pan.baidu.com/s/1SZr9suOkLNtcYX_taIyyfQ 密碼: gwx5
< 文中的apk修改僅用于研究學(xué)習(xí),如涉及權(quán)益侵犯請隨時聯(lián)系處理。 >

既然我們是來分析這個apk的簽名驗證,那么我們首先將其反編譯后重新打包運行,看一下是什么情況:


游戲檢測到非官方簽名后,會彈窗提示,點擊“確定”后退出游戲。
接下來我們按照文首的思維導(dǎo)圖步驟進行分析:關(guān)鍵字搜索、邏輯分析、邏輯修改

0x1. 關(guān)鍵字搜索
首先介紹一部分簽名驗證用到的關(guān)鍵字:signatures,Landroid/content/pm/Signature,GetPackageInfo,Landroid/content/pm/PackageInfo。
我們先從java層入手,apk拖入Android Killer之后,搜索關(guān)鍵字signatures。


搜索到的結(jié)果均為支付相關(guān)部分的代碼,顯然簽名驗證并不在java層,接下來我們搜索so層。
我們嘗試對我們反編譯后的 libarmeabi-v7a文件夾進行搜索,關(guān)鍵字使用Landroid/content/pm/Signature。


有兩個so文件中存在我們的關(guān)鍵字,但是libentryexpro.so是銀聯(lián)支付相關(guān)so文件,所以我們將簽名驗證定位在libSrc.so之中。
將libSrc.so拖入IDA之中,等待IDA分析完成,因為libSrc.so比較大,所以需要等待的時間略長,待分析完成后我們在IDA中搜索關(guān)鍵字。
按ALT+T呼出文本搜索框,輸入關(guān)鍵字Landroid/content/pm/Signature,勾選Find all occurrences進行搜索。


待漫長的搜索過程結(jié)束后,我們可以看到結(jié)果如下:


到現(xiàn)在為止,我們關(guān)鍵字搜索部分算是完成了,接下來我們進入邏輯分析環(huán)節(jié)。

0x2.邏輯分析 
搜索到結(jié)果后,我們雙擊進入IDA View-A界面:


按F5查看該函數(shù)的偽代碼,遇到彈窗提示點擊OK

可基本判斷出該函數(shù)獲取簽名的hashcode之后進行了運算并返回一個值,我們推測該返回值是用于簽名的比對,
那么我們回到匯編界面,到函數(shù)頭看一下是否有交叉引用( CODE XREF:代碼交叉引用  )。


果然有對該函數(shù)的引用,我們雙擊 CODE XREF:sub_508B40+8↓p 查看調(diào)用它的函數(shù)。


為便于查看邏輯,我們按空格鍵進入Graph View

可以看出,在跳轉(zhuǎn)運行了sub_508884后,將返回值(R0中的值)與另一個值(R3中的值)通過CMP指令進行了比較,
并通過BEQ指令根據(jù)結(jié)果進行了跳轉(zhuǎn),由此可見,相同的話,程序會繼續(xù)運行,不同的話,后續(xù)會出現(xiàn)彈窗提示盜版信息。

所以我們確定我們的思路是講該跳轉(zhuǎn)修改為始終執(zhí)行至loc_508A0的跳轉(zhuǎn),接下來我們進入邏輯修改的環(huán)節(jié)。

0x3.邏輯修改
分析完邏輯后,我們可以簡單的得出兩種思路,
思路1. CMP R0,R3   時,將對比的兩者修改為同一個寄存器,即 CMP R0,R0 或 CMP R3,R3
思路2. BEQ loc_508BA0  時,將BEQ修改為BNE,實現(xiàn)不相同則跳轉(zhuǎn)
其他思路請大家自行思考和嘗試,接下來我們就這兩個思路進行修改和驗證。

0x3.1  CMP R0,R3 → CMP R0,R0
我們將光標定位在CMP R0,R3,切換到Hex-View界面:

打開ARM指令轉(zhuǎn)換工具,確認CMP R0,R3及CMP R0,R0的十六進制

所以我們使用十六進制編輯器010Editor將so文件中的 03 00 50 E1修改為00 00 50 E1,即實現(xiàn)了CMP R0,R3 到CMP R0,R0的修改。
注意:因為我們起初在IDA中搜索到了3個地方使用關(guān)鍵字 Landroid/content/pm/Signature,

所以,另外兩個關(guān)鍵字對應(yīng)的函數(shù)里的CMP R0,R3,也要修改為CMP R0,R0才算是修改完成。

0x3.2  BEQ loc_508BA0 →  BNE loc_508BA0
我們將光標定位在CMP R0,R3,切換到Hex-View界面:

打開ARM指令轉(zhuǎn)換工具,確認BEQ及BNE的十六進制

根據(jù)上圖結(jié)果,我們需要將0A修改為1A,即BEQ修改為了BNE,同樣注意需要修改三個地方。
兩種修改見下圖:


以上兩種方式修改均可使游戲正常進入,


請大家動手嘗試,也可以嘗試其他思路進行練習(xí)。

?