PIN插装~linux下无法识别程序内部定义例程解决方法

来源:互联网 发布:其怒乎的其是什么意思 编辑:程序博客网 时间:2024/06/04 18:36

经过几天的coding和阅读PIN相关API,发现,PIN的开发人员也意识到,在linux下由于没有符号表,PIN很难识别一些程序内部定义的例程,这些例程的名字通常为:sub_例程起始地址。因此,需要自己去解决这些未被识别的例程

方法一:

PIN提供了一个创建例程的API:RTN_CreateAt(ADDRINT addr,string name)。在PIN识别程序内部自定义例程失败的时候,用户可自己通过上述API来创建此例程,并告诉PIN该例程的起始地址 addr,以及例程的名字 name(”sub_addr“形式的字符串)。

但是如何判断PIN识别内部定义例程失败的情况呢?

通过IDA对许多程序.text段的例程进行了分析,一般来说,例程按地址增长顺序排列,并且,两个例程之间会有一个字节不详的对齐处理,但是不超过16字节。而纵观许多程序的例程,起始地址99%都是16字节对齐的(当然,也有个别几个例程个性张扬,起始地址不是16字节对齐)。
方法二(最优):
    自主遍历,不借助PIN的识别RTN的API。通过每一代码段的起始地址,去内存取15字节数据并判断有效指令的size。并计算下次读内存的地址addr+=size.如此不断读内存代码段指令数据一直到代码段的尾部。
0 0