DeathMemory 发表于 2016-6-1 12:32

IDA导入Jni.h

IDA 分析Android so 文件时,因为缺少JNIEnv结构定义,反编译后看起来很不友好,如下图(后面注释是我自己手工对照加的 = =)。为避免以后无穷无尽的手动加注,接下来我们就来导入 JNIEnv 的结构定义让反编译代码看起来更轻松。IDA 打开菜单 Options ->Compilter..选择Visual C++ 我在VS2008 环境下编译通过,VS2015有问题。Include directories 填入NDK中包含jni.h 的路径和VS2008中VC的include路径,两个路径间用”;”分隔。Predefined macros 加入 __lint__ 宏定义。 jni.h 做如下三处修改(可能会出现不同情况,载入后可根据报错信息做具体修改) 返回IDA 按Ctrl+F9 载入 jni.h 文件就可以编译通过了。然后在structures窗口里按下insert键-> add standard structure -> 选择"JNIEnv_",然后确定,之后IDA 反编译出来的就看起来舒爽多了。


AntiDebug 发表于 2016-6-2 16:52

感谢分享,之前看蒸米的文章也有一种识别JNIEnv的方法

在android调试中,你会经常见到这种类型的函数:

首先是一个指针加上一个数字,比如v3+676。然后将这个地址作为一个方法指针进行方法调用,并且第一个参数就是指针自己,比如(v3+676)(v3…)。这实际上就是我们在JNI里经常用到的JNIEnv方法。因为Ida并不会自动的对这些方法进行识别,所以当我们对so文件进行调试的时候经常会见到却搞不清楚这个函数究竟在干什么,因为这个函数实在是太抽象了。解决方法非常简单,只需要对JNIEnv指针做一个类型转换即可。比如说上面提到v3指针,我们选中后按一下”y”键,然后将类型声明为”JNIEnv*”。

随后IDA就会自动查找对应的方法并且显示出来了:


mmmmar 发表于 2016-6-1 12:39

支持支持

Ericky 发表于 2016-6-1 16:42

很实用,鼓励一下

yege0201 发表于 2016-6-1 23:29

学习了,现在用IDA分析native,真是很费劲,感谢楼主分享。

DeathMemory 发表于 2016-6-2 19:17

AntiDebug 发表于 2016-6-2 16:52
感谢分享,之前看蒸米的文章也有一种识别JNIEnv的方法

在android调试中,你会经常见到这种类型的函数:
...

是的,这方法就是导入jni.h后的操作,高版本的IDA默认会有支持,但可能会支持不全或者其他奇怪的现象,这时候就可以用上面的方法手动导入一遍,就可以解决了。

mmmmar 发表于 2016-6-23 20:02

我每次打开都要重新导入一次。重新配置complier,请问有什么方法能永久导入吗

JadeSnow 发表于 2016-6-27 09:05

学习了,感谢分享

lwc1123 发表于 2016-6-27 10:13

不错,谢谢分享

chenjingyes 发表于 2016-7-26 23:40

请问出现这种错误怎么解决呀???
页: [1] 2
查看完整版本: IDA导入Jni.h