2024年3月24日发(作者:)
DLL劫持技术
当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,
加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地
址空间中。
由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL
文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目
录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统
同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL
时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行,
如图18.3所示。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。
图18.3 DLL劫持技术演
示
利用这种方法取得控制权后,可以对主程序进行补丁。此种方法只对除、
等核心系统库以外的DLL有效,如网络应用程序的ws2_、游戏程序中的
,还有大部分应用程序都调用的,这些DLL都可被劫持。
利用第5章5.6.2节提供的来演示一下如何利用劫持技术制作补丁,
目标文件用Themida v1.9.2.0加壳保护。
1.补丁地址
去除这个CrackMe网络验证方法参考第5章5.6.2节,将相关补丁代码存放到函数
PatchProcess()里。例如将401496h改成:
00401496 EB 29 jmp short 004014C1
补丁编程实现就是:
unsigned char p401496[2] = {0xEB, 0x29};
WriteProcessMemory(hProcess,(LPVOID)0x401496, p401496, 2, NULL);
p401496这个数组的数据格式,可以用OllyDbg插件获得,或十六进制工具转换。
例如Hex Workshop打开文件,执行菜单“Edit/Copy As/Source”即可得到相应的代码
格式。
2.构建输出函数
查看实例输入表,会发现名称为“ws2_”的DLL,因此构造
一个同名的DLL来完成补丁任务。伪造的ws2_有着真实ws2_一样的输出函
数,完整源码见光盘映像文件。实现时,可以利用DLL模块中的函数转发器来实现这个目
标,其会将对一个函数的调用转至另一个DLL中的另一个函数。可以这样使用一个pragma
指令:


发布评论