在使用IDA静态反汇编时,如果正在逆向的文件中有动态链接库函数(比如调用了程序自定义so库中的函数),IDA只会显示一个地址,跟进去会发现是延迟绑定中关于plt的代码,无法知道具体调用了哪个函数,对于逆向起来很是麻烦,本文介绍如何识别这样的函数。

在使用IDA静态反汇编时,如果正在逆向的文件中有动态链接库函数(比如调用了程序自定义so库中的函数),IDA只会显示一个地址,跟进去会发现是延迟绑定中关于plt的代码,无法知道具体调用了哪个函数,对于逆向起来很是麻烦,本文介绍如何识别这样的函数。

按道理讲,虽然不能动态调试,静态分析不能看到运行时绑定的地址,但是具体动态链接的过程一定也是根据文件中的信息,所以静态也一定可以知道调用的是哪个函数,但是我没有发现如何使用IDA自动确定(如有高手麻烦留言告诉我),于是通过查阅《程序员的自我修养》动态链接相关内容,找到了识别动态链接库中函数的方法。需要识别的函数是sub_412160,如图所示:

从汇编代码点进去会发现是plt相关代码,在ARM64中,@page是取页440000(4kb整数),@PAGEOFF是取页内偏移20,简单来讲这段应该是取出440020地址存储的数据放X17,然后跳转过去,到了got.plt中。

这里面存的全是一样的地址,正如书中写的那样,都还没绑定具体运行时的地址,再跟两步发现到了地址是0的地方,就不理解了,可能是链接器的地址?

走了这么多弯路,跟完了延迟绑定的过程,下面来看如何识别出sub_412160。

ELF文件中存储了导入的所有函数符号信息,在IDAi的mport窗口中可以看到,不过IDA没有自动显示出来这些函数的地址,但在Linux下使用

readelf -sD 文件名| grep 小写地址 

查看该文件可以看到地址动态符号的地址,grep查找一下就是所需要的识别的函数名。

ELF文件中还存储了needed的动态链接库,IDA中写在了该文件的最开始,向上拉窗口可以看到,我们只要从这些so库中找识别出的函数名即可。使用

grep -rn “函数名”

即可找到调用的哪个库中的哪个函数。

 

 

此外,还有这种形式的动态链接调用,再次挖坑做以记录碰到再研究。

https://reverseengineering.stackexchange.com/questions/9033/how-to-recognize-the-function-call-in-a-dynamic-lib

 

By Ascii0x03,转载请注明出处:http://www.cnblogs.com/ascii0x03/p/8313451.html

版权声明:本文为ascii0x03原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ascii0x03/p/8313451.html