快速业务通道

利用DelayLoad来优化应用程序的性能及拦截API

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
的,VirtualProtect允许你更改一个目的地址的属性。现在必须更改iat的属性为读/写。完成后,代码要恢复IAT段原来的属性。

另外一个要注意的地方,就是在重定向IAT的时候,有数据引入的问题。虽然程序员们很少这样做,但是,很容易用增加的代码去导入数据。vc++运行库DLL(MSVCRT.DLL)有数据导出。如果重定向一个数据IAT的入口,会导致问题。

那么,如何判断一个IAT是数据呢?一个商业的软件,应该用准确的算法来判断一个IAT入口的类型。但是,我在这里用了一个快捷方法。就是IsBadWritePtr。如果IAT包含的指针是可写的,那么,很可能是一个数据指针。如果是只读的,那么,应该是一段代码。这个测试合适吗?不,但是,它对DelayLoadProfile是足够了。

现在看一下根区,在DelayLoadProfileDLL.h中定义的DLPD_IAT_STUB结构包含着代码和数据。简单来说,就是如下:

CALL DelayLoadProfileDLL_UpdateCount

JMP xxxxxxxx //original IAT 地址

DWORD count

DWORD pssNameOrOrdinal

当exe调用其中一个重定向的函数时,控制权被转到根区的CALL指令中,调用DelayLoadProfileDLL.CPP中的DelayLoadProfileDLL_UpdateCount函数,在call指令返回时,继续调用jmp 跳转到IAT原来取得的地址中。Figure2显示了结构示意图。

汇编高手会对DelayLoadProfileDLL_UpdateCount函数能确定根区的COUNT字段的地址,感到疑惑,通过快速的察看代码,会发现DelayLoadProfileDLL_UpdateCount会在堆栈中,查找到返回地址。返回地址指着JMP xxxxxxxx指令。因为,CALL调用总是5个字节,根据这些算法,可以确定COUNT字段的地址。

有一个问题值得提醒,就是DelayLoadProfileDLL_UpdateCount没有调用PUSHAD和POPAD指令来保存/回复CPU寄存器的值。这段代码在很多程序上都工作正常,但是,却在一些函数中,不能正常工作。最后,发现 MSVCRT.DLL的__CxxFrameHandler和 _EH_prolog有问题,这2个函数 期望eax寄存器被设置成某个值。然而,DelayLoadProfileDLL_UpdateCount更改了EAX. 既然这个是由于EAX引起的问题,那么,我增加了PUSHAD和POPAD,昏倒,问题还存在。在遭受挫折后,我检查了汇编生成的代码。通常,VC6编译器会插入将所有本地变量都初始化为0xCC的代码。这些代码会在PUSHAD和POPAD前,将EAX改变。我只好移去/GZ的选项。

结果报告:

当你的进程停止的时候,系统对所有加载的DLL发送一个DLL_PROCESS_DETACH消息。DelayLoadProfileDLL使用这个选项来搜集程序运行过程中,获得的结果。也是说,再次遍历所有的根区单元。收集所有获得的数据,输出。

在DelayLoadProfileDLL安装的阶段,重定向IAT,它保存exe的IAT到一个公共的变量出g_pFirstImportDesc。在关闭的过程中,ReportProfileResults用到这个指针来再次遍历引入段。如果这个IAT是被重定向的,那么,第一个IAT的指针应该指到第一个为该DLL分配的DLPD_IAT_STUB根区内存。当然,代码保持了基本的测试方法,如果某些地方不正确,DelayLoadProfileDLL忽略该特定的dll。

总的说来,所有的都很正常,并且,第一个IAT入口指到我的根区单元。对于每个DLL,代码反复的遍历所有的根区。每个相关的根区,它的包含的字段的值,将加到该DLL的总计数。当遍历完成,ReportProfileResults格式化一个字符串,输出该dll的名字,和调用的总次数。代码还用OutputDebugString广播该结果。

加载和注射:

本程序加载你的exe,注射DelayLoadProfileDLL.dll将会调用,(你猜到了),是DelayLoadProfile.exe(源文件可以在msj的网站找到,http://www.microsoft.com/msj)。这个代码主要继承了CDebugInjector类。我将简单的介绍它。函数主要包含了目的exe的命令行,并且传递到CDebugInjector::LoadProcess。如果进程被成功创建,函数会

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号