正确解析函数名称
ida分析完so后,f5反编译会发现很多参数加数字的函数名,如下示例:
int __fastcall Java_com_test_key(int a1)
{
return (*(int (**)(void))(*(_DWORD *)a1 + 668))();
}
网上找到2种比较简单的方法,但讲的不完整,这里根据个人理解稍微详细的写一下
1 修改参数类型
直接选中a1按y键,弹框内填JNIEnv*
修改后即可正确解析
2 导入jni.h
此方法是吧jni.h头文件导入到ida,之后就能直接用jni的结构体解析出正确的函数名,这种方法会受ida和android sdk版本影响,jni.h的位置和要修改的内容可能会变化,所以这里详细说明一下jni.h怎么找。
注1:jni.h文件在jdk和android sdk中都有,要用android sdk里面的。
网上很多文章也没说明,我第一次直接用的jdk里面的,导入报错,怎么改都不行,浪费了几十分钟时间...
android studio打开设置(file->Project Structure->SDK Location)
注2:最下面有一个JDK location,但实际上在Android里面,只用到了jre,没有sdk,所以这里其实找不到jni.h
我们要到NDK的路径取查找jni.h,没有就点download下载ndk,下完之后会默认保存到Android SDK的路径,
进入ndk路径直接搜索jni就能搜到了
吧这文件复制一份,直接导入到ida里面(file->Load file->Parse C header file),此时会报错找不到头文件
如果报类似这种错,吧相关代码注释掉就行,如下,我这个版本的ndk注释掉这两个头文件即可
最后选中a1,右键->Convert to Struct *
,里面会出现_JNIEnv结构体,选这个就能正确解析了。
解析结果如下,这个方法看起来复杂,但实际操作要比方法1简单快捷