-
-
[旧帖]
熊猫正正PE文章的一个问题,求助
0.00雪花
-
发表于:
2012-10-10 01:06
3322
-
[旧帖] 熊猫正正PE文章的一个问题,求助
0.00雪花
最近学习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直播授课