加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ida静态分析so文件小技巧之JNI函数还原和.init_array函数查找(转载)

(2017-12-15 17:09:17)
分类: 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目录下找到。



原作者:蒸米

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有