首页
社区
课程
招聘
[求助][讨论]关于动态插装工具PIN的问题:不能识别程序代码段中的某些Routine
发表于: 2014-7-5 19:51 4878

[求助][讨论]关于动态插装工具PIN的问题:不能识别程序代码段中的某些Routine

2014-7-5 19:51
4878
最近在用PIN做软件分析,捕获程序自身IMG并遍历其中代码段(.init/.plt/.text/.fini)中的每一条指令。
于是用了个三层for循环:
for(SEC sec=IMG_SecHead(img);SEC_Valid(sec);sec=SEC_Next(sec))
		{
			if(SEC_Type(sec)==SEC_TYPE_EXEC)
			{
				for(RTN rtn=SEC_RtnHead(sec);RTN_Valid(rtn);rtn=RTN_Next(rtn))
				{
					RTN_Open(rtn);
					for(INS ins=RTN_InsHead(rtn);INS_Valid(ins);ins=INS_Next(ins))
					{  //遍历每条指令并进行相关操作}
                                       RTN_Close(rtn);
                                 }
                          }
                   }

但是,我在程序执行过程中插装发现,代码段中的某些routine下的指令执行了,但是之前遍历代码段时却完全没有扫描到这个routine下的指令。
之前也用PIN做过其他事情,也遇到过 无法识别某些复杂程序自定义的routine名字,但是识别出了这一个段地址范围是一个routine。
而对于我这种情况,PIN在遍历时好像就完全没有识别出这是一个有效的routine,估计因此就跳过了这个未识别出来的routine的地址范围(仅仅是自己猜测)。
求玩过PIN插装的大神或者遇到此种情况的同学们指导,解释。。。
谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
坛子里难道木有利用PIN搞软件分析的吗?
2014-7-6 21:14
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
尼玛,最终的结果居然是自问自答!
经过几天的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字节对齐)。所以我自己在每次遍历RTN之前做了一个判断,即当前RTN的起始地址减去上一个RTN的起始地址和大小是否大于16字节。如果大于16字节,即视为这两个RTN之间的某个例程(RTN)没有被PIN所识别。则需要自己创建RTN。
我最终的解决办法是在每一次遍历一个RTN添加了如下的处理代码:
          if(!fir)//fir初始化为true,用来去除对第一个例程的操作
	{
	        if(RTN_Address(rtn)-RTN_Address(RTN_Prev(rtn))-RTN_Size(RTN_Prev(rtn))>0x10)
		{
			
		ADDRINT align=(0x10-((RTN_Address(RTN_Prev(rtn))+RTN_Size(RTN_Prev(rtn)))&0x0f))%0x10;
		ADDRINT rtn_addr=RTN_Address(RTN_Prev(rtn))+RTN_Size(RTN_Prev(rtn))+align;
	        char s[20];
		sprintf(s,"sub_%x",rtn_addr);
		rtn=RTN_CreateAt(rtn_addr,s);
		}
	 }
       fir=false; 
2014-7-10 21:01
0
雪    币: 144
活跃值: (46)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
用过pin 很不错的工具  有空多交流啊
2014-7-10 22:05
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也要使用pin进行动态插桩,可以交流一下嘛?
2017-10-11 11:00
0
游客
登录 | 注册 方可回帖
返回