ida静态分析so文件小技巧之JNI函数还原和.init_array函数查找(转载)
| 分类: android |
0x02 还原JNI函数方法名
在android调试中,你会经常见到这种类型的函数:
https://epo.alicdn.com/image/424p6h8h56a0.png
首先是一个指针加上一个数字,比如v3+676。然后将这个地址作为一个方法指针进行方法调用,并且第一个参数就是指针自己,比如(v3+676)(v3…)。这实际上就是我们在JNI里经常用到的JNIEnv方法。因为Ida并不会自动的对这些方法进行识别,所以当我们对so文件进行调试的时候经常会见到却搞不清楚这个函数究竟在干什么,因为这个函数实在是太抽象了。解决方法非常简单,只需要对JNIEnv指针做一个类型转换即可。比如说上面提到v3指针,我们选中后按一下”y”键,然后将类型声明为”JNIEnv*”。
https://epo.alicdn.com/image/424p6jtaeq30.png
随后IDA就会自动查找对应的方法并且显示出来了:
https://epo.alicdn.com/image/424p6ki9j060.png
是不是瞬间清晰了很多?另外有人( 貌似是看雪论坛上的)还总结了所有JNIEnv方法对应的数字,地址以及方法声明:
https://epo.alicdn.com/image/424p6l7kja60.png
有兴趣的同学可以去我的github下载。
0x03 调试.init_array和JNI_OnLoad
我们知道so文件在被加载的时候会首先执行.init_array中的函数,然后再执行JNI_OnLoad()函数。JNI_Onload()函数因为有符号表所以非常容易找到,但是.init_array里的函数需要自己去找一下。首先打开view ->Open subviews->Segments。然后点击.init.array就可以看到.init_array中的函数了。
https://epo.alicdn.com/image/424p6ma7r5c0.png
https://epo.alicdn.com/image/424p6mt5no40.png
https://epo.alicdn.com/image/424p6nh45b90.png
但一般当我们使用ida进行attach的时候,.init_array和JNI_Onload()早已经执行完毕了,根本来不急调试。这时候我们可以使用jdb这个工具来解决,这个工具是安装完jdk以后自带的,可以在jdk的bin目录下找到。
原作者:蒸米

加载中…