需求
IDA 导入C/C++头文件后,通过添加头文件中的结构体,可以用结构体中的函数替换伪代码中的地址偏移,提高函数可读性,本文以JNI_OnLoad()
为例讲解。
步骤
1.点击IDA菜单项”File->Load file->Parse C header file”选择jni.h,导入的时候IDA可能会报错,解决办法很简单:把要导入的文件备份下,然后哪里报错删哪里。
2.导入完成后,点击主界面上的”Structures”选项卡,按Insert键打开”Create structure/union”对话框,点击”Add standard structure”按钮,添加下图中的两个结构体。
3.使用BLX R3
寄存器跳转,但IDA并不知道R3是GetEnv函数的原型,也不知道函数的参数情况,因此IDA认为传参的赋值无用,可以优化掉。这是IDA F5插件的特性:代码优化。
4.打开JNI_OnLoad()
,为了 更好地阅读伪代码,在JNI_OnLoad()
中修改变量定义(N:变量重命名;Y:变量类型定义)。注意:_JavaVM
和_JNIEnv
都是指针。
JNI_OnLoad()
第一个参数是_JavaVM
,静态注册/动态注册的函数第一个参数是_JNIEnv
。
5.修改完成后在函数上右键,点击”Force call type”,转为函数调用。