IDA逆向so正确解析函数名

1,506 阅读2分钟

正确解析函数名称

ida分析完so后,f5反编译会发现很多参数加数字的函数名,如下示例:

int __fastcall Java_com_test_key(int a1)
{
  return (*(int (**)(void))(*(_DWORD *)a1 + 668))();
}

网上找到2种比较简单的方法,但讲的不完整,这里根据个人理解稍微详细的写一下

1 修改参数类型

直接选中a1按y键,弹框内填JNIEnv*

image.png

修改后即可正确解析

image.png

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)

image.png

注2:最下面有一个JDK location,但实际上在Android里面,只用到了jre,没有sdk,所以这里其实找不到jni.h

我们要到NDK的路径取查找jni.h,没有就点download下载ndk,下完之后会默认保存到Android SDK的路径,

image.png

进入ndk路径直接搜索jni就能搜到了

image.png

吧这文件复制一份,直接导入到ida里面(file->Load file->Parse C header file),此时会报错找不到头文件

image.png

如果报类似这种错,吧相关代码注释掉就行,如下,我这个版本的ndk注释掉这两个头文件即可

image.png

最后选中a1,右键->Convert to Struct *,里面会出现_JNIEnv结构体,选这个就能正确解析了。

image.png

解析结果如下,这个方法看起来复杂,但实际操作要比方法1简单快捷

image.png