分類:
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
安卓應用程序的開發語言是Java,但是由於java層的代碼很容易被反編譯,而反編譯c/c++程序的難度比較大,所以現在很多安卓應用程序的核心部分都使用NDK進行開發。關於NDK的開發知識點,請看這篇博客:Android之NDK開發。
關於NDK環境搭建的知識點,請看這篇博客:Android NDK開發篇(一):新版NDK環境搭建(免Cygwin,超級快)
使用NDK開發能夠編譯c/c++程序,最終生成so文件。而so文件是一個二進制文件,我們是無法直接分析so文件的,所以這里需要用到一個反編譯工具IDA Pro。IDA Pro能夠對so文件進行反匯編,從而將二進制代碼轉化為匯編語言,利用IDA Pro神奇的F5功能還能將匯編語言反編譯成c/c++程序。這里使用的IDA Pro的版本為6.5版本。下面就介紹一下如何利用IDA Pro靜態分析so文件的步驟:
(0) 打開IDA Pro,將libTestJniSo.so直接拖入到IDA Pro中,在彈出的”load a new file”窗口中,
選擇”ELF for ARM(Shared object)[elf.ldw]”選項,然后再點擊ok按鈕。如圖1所示:

圖1 使用IDA Pro加載so文件
等待一段時間后,我們就能看到反匯編libTestJniSo.so文件所得到的匯編代碼了。
(1) 這里我們主要介紹幾個主要窗口,其中IDA View-A窗口顯示匯編代碼;Hex View-A窗口顯示機器碼(16進制格式);Function window窗口中保存着各個函數的名字,找到對應函數名字,再雙擊即可定位到對應函數的匯編代碼。
例如我們想要查看Java_com_example_testjniso_MainActivity_helloFromJni函數的匯編代碼,
只需在Function window窗口中找到Java_com_example_testjniso_MainActivity_helloFromJni函數再雙擊即可。如圖2所示:

圖2 定位函數
如果想要查看某條指令的16進制代碼,只需要單擊該指令,再切換到Hex View-A窗口即可。
(2)如果IDA Pro帶有F5插件,那么我們可以按鍵盤上的F5,就可以將匯編代碼轉換為C代碼。例如我們想要查看forTest0函數的C代碼,我們只需要定位到forTest0函數的匯編代碼后,再按F5就會生成一個Pseudocode窗口,該窗口就會顯示forTest0函數的C代碼,如圖3所示:

圖3 反編譯查看forTest0函數對應的C代碼
(3)我們一般是在Text View模式中查看匯編代碼,這樣很難看出程序的設計流程。另外IDA Pro還提供了一個Graph View,能夠幫助我們更好地查看代碼的設計流程。只需要在對應的函數處右擊再點擊”Graph View”即可切換到Graph View模式,forTest0函數的Graph View如圖4所示:

圖4 forTest0函數對應的Graph View
從圖4可以看出,BLE loc_E42這條語句后面跟了兩個箭頭,其中綠色箭頭表示當 BLE loc_E42 條件成立后所跳轉到的地方,紅色箭頭表示當條件不成立后所跳轉到的地方。如果想要切換到Text View模式,則只需在對應函數處右擊再點擊“Text View”即可。
本文簡單介紹了如何通過IDA Pro靜態分析so文件,從而查看對應的匯編代碼。另外需要注意的是IDA Pro只能查看匯編代碼,不能修改匯編指令對應的機器碼。如果想要修改so文件,需要使用UltraEdit等二進制編輯軟件。逆向分析so文件,需要熟練掌握ARM匯編語言。這里有一篇介紹ARM匯編語言的博客ARM匯編編程基礎(一) -- ARM CPU寄存器,有興趣的同學可以看看。
本文資源下載地址:安卓逆向學習筆記(3)
- 頂
- 8
- 踩
- 0
