Android之使用IDA Pro靜態(tài)分析so文件
安卓應(yīng)用程序的開發(fā)語言是java,但是由于java層的代碼很容易被反編譯,而反編譯c/c++程序的難度比較大,所以現(xiàn)在很多安卓應(yīng)用程序的核心部分都使用NDK進(jìn)行開發(fā)。關(guān)于NDK的開發(fā)知識點,請看這篇博客:Android之NDK開發(fā)。
關(guān)于NDK環(huán)境搭建的知識點,請看這篇博客:Android NDK開發(fā)篇(一):新版NDK環(huán)境搭建(免Cygwin,超級快)
使用NDK開發(fā)能夠編譯c/c++程序,最終生成so文件。而so文件是一個二進(jìn)制文件,我們是無法直接分析so文件的,所以這里需要用到一個反編譯工具IDA Pro。IDA Pro能夠?qū)o文件進(jìn)行反匯編,從而將二進(jìn)制代碼轉(zhuǎn)化為匯編語言,利用IDA Pro神奇的F5功能還能將匯編語言反編譯成c/c++程序。這里使用的IDA Pro的版本為6.5版本。下面就介紹一下如何利用IDA Pro靜態(tài)分析so文件的步驟:
(0) 打開IDA Pro,將libTestJniSo.so直接拖入到IDA Pro中,在彈出的”load a new file”窗口中,
選擇”ELF for ARM(Shared object)[elf.ldw]”選項,然后再點擊ok按鈕。如圖1所示:
等待一段時間后,我們就能看到反匯編libTestJniSo.so文件所得到的匯編代碼了。
(1) 這里我們主要介紹幾個主要窗口,其中IDA View-A窗口顯示匯編代碼;Hex View-A窗口顯示機(jī)器碼(16進(jìn)制格式);Function window窗口中保存著各個函數(shù)的名字,找到對應(yīng)函數(shù)名字,再雙擊即可定位到對應(yīng)函數(shù)的匯編代碼。
例如我們想要查看Java_com_example_testjniso_MainActivity_helloFromJni函數(shù)的匯編代碼,
只需在Function window窗口中找到Java_com_example_testjniso_MainActivity_helloFromJni函數(shù)再雙擊即可。如圖2所示:
(3)我們一般是在Text View模式中查看匯編代碼,這樣很難看出程序的設(shè)計流程。另外IDA Pro還提供了一個Graph View,能夠幫助我們更好地查看代碼的設(shè)計流程。只需要在對應(yīng)的函數(shù)處右擊再點擊”Graph View”即可切換到Graph View模式,forTest0函數(shù)的Graph View如圖4所示:
等待一段時間后,我們就能看到反匯編libTestJniSo.so文件所得到的匯編代碼了。
(1) 這里我們主要介紹幾個主要窗口,其中IDA View-A窗口顯示匯編代碼;Hex View-A窗口顯示機(jī)器碼(16進(jìn)制格式);Function window窗口中保存著各個函數(shù)的名字,找到對應(yīng)函數(shù)名字,再雙擊即可定位到對應(yīng)函數(shù)的匯編代碼。
例如我們想要查看Java_com_example_testjniso_MainActivity_helloFromJni函數(shù)的匯編代碼,
只需在Function window窗口中找到Java_com_example_testjniso_MainActivity_helloFromJni函數(shù)再雙擊即可。如圖2所示:
從圖4可以看出,BLE loc_E42這條語句后面跟了兩個箭頭,其中綠色箭頭表示當(dāng) BLE loc_E42 條件成立后所跳轉(zhuǎn)到的地方,紅色箭頭表示當(dāng)條件不成立后所跳轉(zhuǎn)到的地方。如果想要切換到Text View模式,則只需在對應(yīng)函數(shù)處右擊再點擊“Text View”即可。
本文簡單介紹了如何通過IDA Pro靜態(tài)分析so文件,從而查看對應(yīng)的匯編代碼。另外需要注意的是IDA Pro只能查看匯編代碼,不能修改匯編指令對應(yīng)的機(jī)器碼。如果想要修改so文件,需要使用UltraEdit等二進(jìn)制編輯軟件。逆向分析so文件,需要熟練掌握ARM匯編語言。這里有一篇介紹ARM匯編語言的博客ARM匯編編程基礎(chǔ)(一) -- ARM CPU寄存器,有興趣的同學(xué)可以看看。
本文資源-:安卓逆向?qū)W習(xí)筆記(3)
等待一段時間后,我們就能看到反匯編libTestJniSo.so文件所得到的匯編代碼了。
(1) 這里我們主要介紹幾個主要窗口,其中IDA View-A窗口顯示匯編代碼;Hex View-A窗口顯示機(jī)器碼(16進(jìn)制格式);Function window窗口中保存著各個函數(shù)的名字,找到對應(yīng)函數(shù)名字,再雙擊即可定位到對應(yīng)函數(shù)的匯編代碼。
例如我們想要查看Java_com_example_testjniso_MainActivity_helloFromJni函數(shù)的匯編代碼,
只需在Function window窗口中找到Java_com_example_testjniso_MainActivity_helloFromJni函數(shù)再雙擊即可。如圖2所示:
如果想要查看某條指令的16進(jìn)制代碼,只需要單擊該指令,再切換到Hex View-A窗口即可。
(2)如果IDA Pro帶有F5插件,那么我們可以按鍵盤上的F5,就可以將匯編代碼轉(zhuǎn)換為C代碼。例如我們想要查看forTest0函數(shù)的C代碼,我們只需要定位到forTest0函數(shù)的匯編代碼后,再按F5就會生成一個Pseudocode窗口,該窗口就會顯示forTest0函數(shù)的C代碼,如圖3所示:
Android ARM 匯編語言
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。