DLL劫持技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
一、简介
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++ 模式的导出。
主页:
邮件:Yonsm@
源码:如果需要,请访问作者主页
上传的附件
AheadLib.rar (2008-03-08 21:35, 34.5 KB, 676 次下载)
AheadLib 2.2.150 源代码.rar (2008-03-08 21:35, 85.5 KB, 502 次下载)。