首页
社区
课程
招聘
[旧帖] 熊猫正正PE文章的一个问题,求助 0.00雪花
发表于: 2012-10-10 01:06 3304

[旧帖] 熊猫正正PE文章的一个问题,求助 0.00雪花

2012-10-10 01:06
3304
最近学习PE,看了熊猫正正的文,地址http://bbs.pediy.com/showthread.php?t=121488&page=2
在这第二篇中,有一段不是很理解,关于导入表,原文如下

调用输入表函数方法:
高效:CALL DWORD PTR [00402010]
直接调用[00402010]中的函数,地址00402010h位于IAT里
低效:CALL 00401164
........................................
:00401164
  jmp dword ptr [00402010]
这种情况,CALL把控制权转到一个子程序,子程序中的JMP指令跳转到位于IAT中的00402010h。简单的说它使用5个字节的额外代码,并且由额外的JMP将花费更多的时间去执行。
为什么要使用这种低效的方法?因为编译器无法区别输入函数的调用与普通函数调用,对于每一个函数调用,编译器使用同样形式的CALL指令:CALL XXXXXXXX
XXXXXXXX是一个由链接器填充的实际的地址。注意指令不是从函数指针而是代码中实际地址而来的,为了因果平衡,链接器必须表示产生一块代码来取代XXXXXXXX,简单位的方法是像上面那样调用一个JMP Stub
我们可以通过使用修饰来优化我们的低效调用方式,可以用修饰函数的_declspec(dllimport)来告诉编译器,这个函数来自另一个DLL中,这样编译器就会产生这样的指令:
CALL  DWORD PTR [XXXXXXXX]
而不是CALL XXXXXXXX,编译器将给函数加上_imp_前缀,然后直接送给链接器,这样可以直接把_imp_xxx送到IAT,就不需要JMP Stub了。

普通调用跟输入函数调用不一样么?? 啥叫因果平衡?
总之不是很了解他说这断到底要表达一个啥意思呢????求大神

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不太懂这个。不过楼主可以给熊猫正正发消息问问他。
2012-10-10 22:47
0
雪    币: 408
活跃值: (156)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=dancebaby;1107777]最近学习PE,看了熊猫正正的文,地址http://bbs.pediy.com/showthread.php?t=121488&page=2
在这第二篇中,有一段不是很理解,关于导入表,原文如下

调用输入表函数方法:
高效:CALL DWORD PTR [00402010]
直接调用[00...[/QUOTE]

这段话应该是正正摘录时加密解密上的,她最近忙着结婚,我来帮你解释一下

一般的call

call 00401000,是直接call的地址,前提是确定了函数地址,才去call

call [xxxxxxxx],这个形式,是因为在为链接之前,导入表的实际地址是没有被填充的,但是又不能不去调用这个函数,所以采取的这个形式。你call进去,就会发现已经是那是填充的导入表地址了,直接就jmp

具体请看导入表动态加载部分,表达的不够好,希望说得对你有一点帮助
2012-10-10 23:14
0
雪    币: 48
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=小小的心;1108059]这段话应该是正正摘录时加密解密上的,她最近忙着结婚,我来帮你解释一下

一般的call

call 00401000,是直接call的地址,前提是确定了函数地址,才去call

call [xxxxxxxx],这个形式,是因为在为链接之前,导入表的实际地址是没有被填充的,但是又不能不去调...[/QUOTE]

先谢谢大神,我今天又好好琢磨了一下,我觉得是不是说这么做导入表填充的时候就比较简单了?只要把IAT那部分集中替换掉就可以了》 也不需要说再去修改代码段里面的数据??
2012-10-12 20:46
0
游客
登录 | 注册 方可回帖
返回
//