本文经原作者授权,节选自《Windows黑客编程技术详解》一书。文末有福利哦!!
-----------------------------------------------------------------
在开发程序的时候,通常会使用第三方库。但是,并不是所有的第三方库都会提供静态库文件,大多数会提供动态库DLL文件。这样,程序需要相应的DLL文件才能加载启动。
本节介绍一种被病毒木马广泛使用的DLL延迟加载技术,使用延迟加载方式编译链接可执行文件。这样可执行程序就可以先加载执行,所依赖的DLL在正式调用时再加载进来。
这样做的好处是可以把必需的DLL文件以资源形式插入到程序中,并使用DLL延迟加载技术延迟加载。在正式调用必需的DLL之前,程序都是可以正常执行的。程序可以在这段时间内,把资源中的DLL释放到本地,等到正式调用DLL的时候释放的文件就会正确地加载执行。这样当使用程序的时候,只需把exe文件发送给用户,而不需要附加DLL文件了,也不需要担心程序会丢失DLL文件。
2.2.1 实现原理
本程序以加载第三方库——skin 库为例进行讲解演示。首先导入skin 库文件,然后编码,最后对程序编译链接生成exe可执行文件。使用PE查看器PEview.exe查看可执行文件的导入表,便可知道可执行文件必需的DLL文件了。可执行程序导入表如图2-3所示。
从图2-3所示的可执行程序导入表可以知道,导入表中有SkinPPWTL.dll文件,也就是说,在程序加载运行的时候,SkinPPWTL.dll文件必须存在,否则程序会因为加载SkinPPWTL.dll文件失败而不能正常启动。
DLL延迟加载技术的原理,就是从导入表中去掉SkinPPWTL.dll这一项,等到正式调用DLL的时候,才会加载DLL文件。这样,程序在正式调用DLL之前,都是可以正常执行的。
其中,DLL延迟加载的实现并不需要任何编码,只需要对VS开发环境中的链接选项进行手动设置即可。本程序使用的是VS 2013开发环境,下面对skin 库的例子进行讲解。
DLL延迟加载的具体设置步骤为:
属性-->链接器-->输入-->延迟加载的DLL-->输入:SkinPPWTL.dll
延迟加载的设置界面如图2-4所示。
程序经过上述设置后,DLL延迟加载就完成了。这时,再次编译链接生成新的exe可执行程序,并用PEview.exe查看可执行程序的导入表信息。这时的导入表已没有SkinPPWTL.dll的信息了。
2.2.2 小结
DLL延迟加载技术不需要编码来实现,只需对VS开发环境设置链接器即可完成。DLL延迟加载技术,配合资源释放技术,可以使程序变得更加方便易用。
本节使用第三方库skin 库作为演示实例,如果读者对该库比较陌生的话,可以对照本节相应的配套代码来练习,也可使用自己熟悉的第三方库,操作步骤都是相同的。本节对应的演示程序包括skin 的换肤代码、DLL延迟加载以及资源释放技术。接下来,就为读者单独剖析病毒木马广泛使用的资源释放技术。
安全小贴士
在PE结构中, DLL延迟加载的信息存储在ImgDelayDescr延迟导入表中,可以通过数据目录DataDirectory中的IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT项获取延迟导入表RVA相对的偏移地址和数据大小。