so逆向深化及IDA靜態(tài)分析-2 :IDA靜態(tài)分析之so逆向簡單實(shí)戰(zhàn)
本文從一個(gè)簡單的so層簽名校驗(yàn)實(shí)戰(zhàn)來深化IDA靜態(tài)分析,,先上圖:
< 文中的apk修改僅用于研究學(xué)習(xí),,如涉及權(quán)益侵犯請隨時(shí)聯(lián)系處理。 >
既然我們是來分析這個(gè)apk的簽名驗(yàn)證,,那么我們首先將其反編譯后重新打包運(yùn)行,,看一下是什么情況:
游戲檢測到非官方簽名后,會彈窗提示,,點(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層。
我們嘗試對我們反編譯后的
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í)間略長,待分析完成后我們在IDA中搜索關(guān)鍵字,。
按ALT+T呼出文本搜索框,,輸入關(guān)鍵字Landroid/content/pm/Signature,勾選Find all occurrences進(jìn)行搜索。
待漫長的搜索過程結(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è)值,,我們推測該返回值是用于簽名的比對,,
那么我們回到匯編界面,到函數(shù)頭看一下是否有交叉引用(
CODE XREF:代碼交叉引用
),。
果然有對該函數(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),,由此可見,相同的話,,程序會繼續(xù)運(yùn)行,,不同的話,后續(xù)會出現(xiàn)彈窗提示盜版信息,。
所以我們確定我們的思路是講該跳轉(zhuǎn)修改為始終執(zhí)行至loc_508A0的跳轉(zhuǎn),,接下來我們進(jìn)入邏輯修改的環(huán)節(jié)。
0x3.邏輯修改
分析完邏輯后,,我們可以簡單的得出兩種思路,,
思路1. CMP R0,R3 時(shí),將對比的兩者修改為同一個(gè)寄存器,,即 CMP R0,R0 或 CMP R3,R3
思路2. BEQ loc_508BA0 時(shí),,將BEQ修改為BNE,實(shí)現(xiàn)不相同則跳轉(zhuǎn)
其他思路請大家自行思考和嘗試,,接下來我們就這兩個(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)鍵字對應(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)入,,
請大家動(dòng)手嘗試,也可以嘗試其他思路進(jìn)行練習(xí),。