IDA來Patch android的so文件


在上文中,我們通過分析定位到sub_130C()這個函數有很大可能性是用來做反調試檢測的,並且作者開了一個新的線程,並且用了一個while來不斷執行sub_130C()這個函數,所以說我們每次手動的修改TracerPid實在是不現實。

enter image description here

既然如此我們何不把sub_130C()這個函數給nop掉呢?為了防止nop出錯,我們先在”F5”界面選擇所有代碼,然后用”Copy to assembly”功能,就可以把c語言代碼注釋到匯編代碼里。

enter image description here

enter image description here

在這里我們看到如果想要注釋掉sub_130C()函數,只需要注釋掉000016B8這個位置上的代碼即可,如果我們想要注釋掉dword_62B0(3)這個函數,我們則需要注釋掉000016BC-000016C4這三個位置上的代碼。接下來我們選中000016B8這一行,然后再點擊HexView。HexView會幫我們自動定位到000016B8這個位置。

enter image description here

因為ARM是沒有單獨的NOP指令的。於是我們采用movs r0,r0作為NOP。對應的機器碼為”00 00 A0 E1”。所以我們把”13 FF FF EB”這段內容修改為”00 00 A0 E1”。

enter image description here

我們再回”F5”界面,就會發現sub_130C()函數已經沒有了。

enter image description here

最后我們點擊”Edit->Plugins->modifyfile”,然后就可以保存新的so文件了。我們將這個so文件覆蓋原apk中的so文件,然后再重新簽名。

enter image description here

這次我們先運行程序,再用ida加載,app並沒有閃退,說明我們patch成功了。於是我們先在”Java_com_yaotong_crackme_MainActivity_securityCheck”處下斷點。然后在app隨便輸入一個密碼,點擊app上的”輸入密碼”按鈕。

enter image description here

程序就會暫停在”Java_com_yaotong_crackme_MainActivity_securityCheck”處。我們先按”P”再按”F5”,就可以看到反匯編的c語言了。而這里的unk_4005228C就是保存了密碼字符串指針的指針。

enter image description here

因為是指針的指針,所以我們先雙擊進入這個地址。

enter image description here

然后在這個地址上按三下”D”,將這里的數據格式從字符轉化為指針形式。

enter image description here

然后我們再雙擊進入這個地址,就可以看到最后的flag了。答案是”aiyou,bucuoo”。

enter image description here

這道題里我們只是用到了很簡單的patch so技巧,在實戰中我們不光可以NOP,我們還可以改變條件判斷語句,比如將”BNE”變為” BEQ”。我們甚至可以修改跳轉地址,比如直接讓程序B到某個地址去執行,這樣的話就不需要挨個的NOP很多語句了。要注意的是,ARM中的跳轉指令是根據相對地址計算的,所以你要根據當前指令地址和目標地址來計算出相對跳轉的值。

比如說00001BCC: BEQ loc_1C28對應的匯編代碼為”15 00 00 0A”。

enter image description here

enter image description here

0x0A代表BEQ,”15 00 00”代表跳轉的相對地址,因為在arm中pc的值是當前指令的下兩條(下一條的下一條)指令的地址,所以我們需要將0x15再加上2。隨后就可以計算出最后跳轉到的地址: (0x15 + 0x2)*4 + 0x1BCC = 0x1C28。Ida反匯編后的結果也驗證了結果是BEQ loc_1C28。

接下來我們想修改匯編代碼為00001BCC: BNE loc_1C2C。只需要將”0A”變成”1A”,將”15”變成”16”即可。

enter image description here

enter image description here

0x0A代表BEQ,”15 00 00”代表跳轉的相對地址,因為在arm中pc的值是當前指令的下兩條(下一條的下一條)指令的地址,所以我們需要將0x15再加上2。隨后就可以計算出最后跳轉到的地址: (0x15 + 0x2)*4 + 0x1BCC = 0x1C28。Ida反匯編后的結果也驗證了結果是BEQ loc_1C28。

接下來我們想修改匯編代碼為00001BCC: BNE loc_1C2C。只需要將”0A”變成”1A”,將”15”變成”16”即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM