so逆向深化及IDA靜態(tài)分析-2 :IDA靜態(tài)分析之so逆向簡單實戰(zhàn)
本文從一個簡單的so層簽名校驗實戰(zhàn)來深化IDA靜態(tài)分析,,先上圖:
< 文中的apk修改僅用于研究學習,,如涉及權益侵犯請隨時聯(lián)系處理。 >
既然我們是來分析這個apk的簽名驗證,,那么我們首先將其反編譯后重新打包運行,,看一下是什么情況:
游戲檢測到非官方簽名后,會彈窗提示,,點擊“確定”后退出游戲,。
接下來我們按照文首的思維導圖步驟進行分析:關鍵字搜索、邏輯分析,、邏輯修改,。
0x1. 關鍵字搜索
首先介紹一部分簽名驗證用到的關鍵字:signatures,Landroid/content/pm/Signature,,GetPackageInfo,,Landroid/content/pm/PackageInfo,。
我們先從java層入手,apk拖入Android Killer之后,,搜索關鍵字signatures,。
搜索到的結果均為支付相關部分的代碼,顯然簽名驗證并不在java層,,接下來我們搜索so層,。
我們嘗試對我們反編譯后的
libarmeabi-v7a文件夾進行搜索,關鍵字使用Landroid/content/pm/Signature,。
有兩個so文件中存在我們的關鍵字,,但是libentryexpro.so是銀聯(lián)支付相關so文件,所以我們將簽名驗證定位在libSrc.so之中,。
將libSrc.so拖入IDA之中,,等待IDA分析完成,因為libSrc.so比較大,,所以需要等待的時間略長,,待分析完成后我們在IDA中搜索關鍵字。
按ALT+T呼出文本搜索框,,輸入關鍵字Landroid/content/pm/Signature,,勾選Find all occurrences進行搜索。
待漫長的搜索過程結束后,,我們可以看到結果如下:
到現(xiàn)在為止,,我們關鍵字搜索部分算是完成了,接下來我們進入邏輯分析環(huán)節(jié),。
0x2.邏輯分析
搜索到結果后,,我們雙擊進入IDA View-A界面:
按F5查看該函數(shù)的偽代碼,遇到彈窗提示點擊OK
可基本判斷出該函數(shù)獲取簽名的hashcode之后進行了運算并返回一個值,,我們推測該返回值是用于簽名的比對,,
那么我們回到匯編界面,到函數(shù)頭看一下是否有交叉引用(
CODE XREF:代碼交叉引用
),。
果然有對該函數(shù)的引用,,我們雙擊 CODE XREF:sub_508B40+8↓p 查看調用它的函數(shù)。
為便于查看邏輯,,我們按空格鍵進入Graph View
可以看出,,在跳轉運行了sub_508884后,將返回值(R0中的值)與另一個值(R3中的值)通過CMP指令進行了比較,,
并通過BEQ指令根據(jù)結果進行了跳轉,,由此可見,相同的話,程序會繼續(xù)運行,,不同的話,,后續(xù)會出現(xiàn)彈窗提示盜版信息。
所以我們確定我們的思路是講該跳轉修改為始終執(zhí)行至loc_508A0的跳轉,,接下來我們進入邏輯修改的環(huán)節(jié),。
0x3.邏輯修改
分析完邏輯后,我們可以簡單的得出兩種思路,,
思路1. CMP R0,R3 時,,將對比的兩者修改為同一個寄存器,即 CMP R0,R0 或 CMP R3,R3
思路2. BEQ loc_508BA0 時,,將BEQ修改為BNE,,實現(xiàn)不相同則跳轉
其他思路請大家自行思考和嘗試,接下來我們就這兩個思路進行修改和驗證,。
0x3.1 CMP R0,R3 → CMP R0,R0
我們將光標定位在CMP R0,R3,,切換到Hex-View界面:
打開ARM指令轉換工具,確認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個地方使用關鍵字
Landroid/content/pm/Signature,
所以,,另外兩個關鍵字對應的函數(shù)里的CMP R0,R3,,也要修改為CMP R0,R0才算是修改完成。
0x3.2 BEQ loc_508BA0 →
BNE loc_508BA0
我們將光標定位在CMP R0,R3,,切換到Hex-View界面:
打開ARM指令轉換工具,,確認BEQ及BNE的十六進制
根據(jù)上圖結果,我們需要將0A修改為1A,,即BEQ修改為了BNE,,同樣注意需要修改三個地方。
兩種修改見下圖:
以上兩種方式修改均可使游戲正常進入,,
請大家動手嘗試,也可以嘗試其他思路進行練習,。