DLL劫持技术

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AheadLib 2.2.150

--------------------------------------------------------------------------------

一、简介

AheadLib 是用来生成一个特洛伊DLL的工具,用于分析DLL中的函数参数调用(比如记录Socket send 了什么等等)、更改函数功能(随心所欲了:)、更改界面功能(比如在Hook里面生成一个按钮,截获事件等等)。

二、使用

1.用AheadLib 打开要模拟的DLL,生成一个CPP 文件。

2.用Visual Studio 6.0/.NET 建立一个DLL 工程,把这个CPP 文件加入到项目中。

3.使用Release 方式编译,生成的DLL 将和原来的DLL 具有一模一样的导出函数,并且能顺利把这些函数转发到原来的函数中。

4.AheadLib 还可以生成Hook 代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了(修改第三方程序界面功能的好助手)。

三、备注

1.如果导出函数过多,在Visual Studio 6.0 中,如果出现编译错误,请在项目属性关闭与编译头功能。

2.如果是C++ 、C __stdcall、C __fastcall 的方式导出的话,生成的函数声明将会还原成原代码级别(可能需要修改才能编译,比如导出C++类的情况)。此时使用__declspec(dllexport) 导出——不能指定导出序号。

3.如果是NONAME 或者C _CDECL 方式导出(比如DEF 导出,大多数Windows DLL都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/EXPORT:...)导出,且指定导出序号。

4.如果系统中没有DbgHelp.dll,将无法识别C++ 模式的导出。

DLL劫持技术

说明

我是从CoDe_Inject帮助下才了解这个DLL劫持技术(或称HOOK),利用这个制作内存补丁非常的好用。Yonsm在几年前,写了个工具AheadLib,可以很方便地生成各类DLL头文件,见本帖2楼。

这种补丁方法,适合制作被ASProtect,Armadillo,Themida等各类强壳保护软件的补丁。

当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。

由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。

利用这种方法取得控制权后,可以对主程序进行补丁。此种方法只对除kernel32.dll, ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll,游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll,这些DLL都可被劫持。

利用5.6.2章提供的CrackMeNet.exe来演示一下如何利用劫持技术制作补丁,目标文件用

Themida v1.9.2.0加壳保护。

1.补丁地址

去除这个CrackMe网络验证方法参考第5章,将相关补丁代码存放到函数PatchProcess( )里。例如将401496h改成:

文件,执行菜单Edit/Copy As/Source即可得到相应的代码格式。

2.构建输出函数

查看实例CrackMeNet.exe输入表,会发现名称为ws2_32.dll的DLL,因此构造一个同名的DLL来完成补丁任务。伪造的ws2_32.dll有着真实ws2_32.dll一样的输出函数,完整源码见光盘。实现时,可以利用DLL模块中的函数转发器来实现这个目标,其会将对一个函数的调用转至另一个DLL中的另一个函数。可以这样使用一个pragma指令:

现实际上位于另一个名叫SomeOtherFunc的函数中,该函数包含在称为DllWork. dll的模块中。

如要达到劫持DLL的目的,生成的DLl输出函数必须与目标DLL输出函数名一样,本例可以这样构造pragma 指令:

个函数创建一个单独的pragma代码行,读者可以写一个工具或用其他办法,将ws2_32.dll输出函数转换成相应的pragma指令。

当应用程序调用伪装ws2_32.dll的输出函数时,必须将其转到系统ws2_32.dl中去,这部分的代码自己实现。例如WSAStartup输出函数如下构造:

185.gif

查看伪造的ws2_32.dll中任意一个输出函数,例如WSACleanup:代码:

的地址,然后跳过去执行,也就是说ws2_32.dll各输出函数被HOOK了。

3.劫持输出函数

ws2_32.dll有许多输出函数,经分析,程序发包或接包时,WSAStartup输出函数调用的比较早,因此在这个输出函数放上补丁的代码。代码如下:

的ws2_32.dll的WSASTartup函数,此时hijack()函数负责核对目标程序校验,并将相关数据补丁好,处理完毕后,转到系统目录下的ws2_32.dll执行。

这种补丁技术,对加壳保护的软件很有效,选择挂接的函数最好是在壳中没有被调用,当挂接函数被执行时,相关的代码己被解压,可以直接补丁了。有些情况下,必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测,很适合加壳程序的补丁制作。

一些木马或病毒也会利用DLL劫持技术搞破坏,因此当在应用程序目录下发现系统一些DLL文件存在时,应引起注意。

看雪软件安全

2008.3.8

上传的附件

演示实例.rar (2008-03-08 18:10, 1.29 MB, 1012 次下载)

ws2_32.zip (2008-03-08 21:21, 11.9 KB, 456 次下载)

lpk.rar (2008-03-12 20:52, 15.1 KB, 415 次下载)

/read.php?170

2005/01/14 09:26

相关文档
最新文档