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

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


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

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

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


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

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


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


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


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


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

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


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

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


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


為便于查看邏輯,我們按空格鍵進(jìn)入Graph View

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

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

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

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

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

所以我們使用十六進(jìn)制編輯器010Editor將so文件中的 03 00 50 E1修改為00 00 50 E1,即實(shí)現(xiàn)了CMP R0,R3 到CMP R0,R0的修改。
注意:因?yàn)槲覀兤鸪踉贗DA中搜索到了3個(gè)地方使用關(guān)鍵字 Landroid/content/pm/Signature,

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

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

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

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


以上兩種方式修改均可使游戲正常進(jìn)入,


請(qǐng)大家動(dòng)手嘗試,也可以嘗試其他思路進(jìn)行練習(xí)。

?