IDA反編譯so檔案匯入Jni
前言
今天看了這個wp,可能讓我收穫最多的就是知道了IDA可以通過載入jni.h檔案,使so反彙編之後能更清晰。
主要有三種方法可以實現,接下來逐一進行介紹。
方法一:
這個方法可能在低版本的IDA下,無法實現。我這裡的IDA版本是7.0,其他版本我沒有做測試。首先將so檔案拖入IDA,已預設方式載入,IDA會自動進行識別
可以看到反彙編之後,很多Jni的結構體沒有識別出來。
View->Open subviews->Type Libraries 或者shift+F11
Insert 選中android arm
確定即可。之後再structure選項卡中Insert
Add standard structure 將JniEnv匯入即可
之後我們再回到原來的函式將第一個引數變為JniEnv*(右鍵->convert to struct*)選擇我們剛剛匯入的JniEnv,再將casts隱藏一下,函式就會變得很明瞭。
第二種方法:
其實這種方法,只有前面的操作不同,後面都是一樣的,並且對IDA的版本沒有要求。
首先找到NDK中包含jni.h檔案的路徑,以及你的vs的VC的include的路徑。
NDK選路徑的時候android的版本號要和我們需要反彙編的so檔案的版本號對應,比如說我這裡的so檔案的版本號是22,因此我選擇android-22的include路徑。
D:\JavaSE\ndk\android-ndk-r14b-windows-x86_64\android-ndk-r14b\platforms\android-22\arch-arm\usr\include
D:\vs2012\VC\include
這是我的路徑,作為參考,在新增路徑時需要將”\”轉化為”/”.
接下來回到IDA。
Option->compiler
選擇Visual C++,Include directories中用我們剛才找到的兩條路徑替換,並在Predefiined macros中新增lint
報錯,只需根據具體的報錯原因,修改Jni.h即可,這裡將stdarg.h 一行註釋掉,記得備份一下。
在次匯入,成功。
後面的操作就是一樣的了,在structure選項卡新增,修改第一個變數型別為JniEnv
###第三種方法:(2018/3/10)
我從大黃書上有了解到一種方法,還是挺方便的。
只需要在需要改變的變數上按Y鍵,然後修改為JNIEnv* 即可,IDA會自動識別。
另外在說一下這個JNIEnv型別的一些特點;
JNIEnv方法對應的數字:
672 GetStringUTFLength jsize(*)(JNIEnv* ,jstring)
676 GetStringUTFChars const char* (*) (JNIEnv * ,jstring ,jboolean*)
680 ReleaseStringUTFChars void (*) (JNIEnv* ,jstring, const char*)
684 GetArrayLength jsize (*) (JNIEnv* ,jarray)
688 NewObjectArray jobjectArray (*) (JNIEnv * ,jsize ,jclass ,jobject )
可以和上面圖中的為修改之前進行對比一下。
總結
我想知道了這一點之後會對分析android的so檔案提供很大的幫助,希望大家在逆向的越走越遠!