DLL劫持技术例子: HijackDll

控制台程序:DllLoader

Dll加载器,用于动态加载目标Dll,并动态调用目标函数

 1 #include <cstdio>
 2 #include <windows.h>
 3 
 4 typedef int (*pAdd) (int a, int b);
 5 
 6 int main()
 7 {
 8     HMODULE hModule = GetModuleHandleA("Dll.dll") != NULL ? GetModuleHandleA("Dll.dll") : LoadLibraryA("Dll.dll");
 9     pAdd Add = (pAdd)GetProcAddress(hModule, "Add");
10     if (NULL == Add)
11         printf("Failed\n");
12     else
13         printf("Succeed\n1 + 1 = %d\n", Add(1, 1));
14 
15     system("pause > nul");
16     return 0;
17 }
main.cpp

 

原Dll:Dll

很简单的一个Dll,只有一个隐式函数Add.仅仅是一个简单的加法..

 1 #include <cstdio>
 2 #include <windows.h>
 3 
 4 #define EXTERNC extern "C"
 5 #define EXPORT __declspec(dllexport)
 6 #define ECEP EXTERNC EXPORT
 7 
 8 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 9 {
10     switch(fdwReason)
11     {
12     case DLL_PROCESS_ATTACH:
13         MessageBoxA(NULL, "Attach", "", MB_ICONINFORMATION);
14         break;
15     case DLL_PROCESS_DETACH:
16         MessageBoxA(NULL, "Detach", "", MB_ICONINFORMATION);
17         break;
18     default:
19         break;
20     }
21 
22     return TRUE;
23 }
24 
25 ECEP int Add(int a, int b)
26 {
27     return a + b;
28 }
main.cpp

 

劫持Dll:HijackDll

用于劫持原Dll,并转发原程序的动态调用

 1 //last code by gwsbhqt at 20150727
 2 
 3 #include <cstdio>
 4 #include <windows.h>
 5 
 6 #define EXTERNC extern "C"
 7 #define NAKED __declspec(naked)
 8 #define EXPORT __declspec(dllexport)
 9 #define ECEP EXTERNC EXPORT
10 #define ENCDECL EXTERNC NAKED void __cdecl
11 #define EENSTD EXTERNC EXPORT NAKED void __stdcall
12 #define EENFAST EXTERNC EXPORT NAKED void __fastcall
13 #define ENDEF ENCDECL
14 
15 #define JMPFARPROC(lpModuleName, hProcName) \
16     HMODULE hModule; \
17     hModule = GetModuleHandleA((lpModuleName)); \
18     if (NULL == hModule) hModule = LoadLibraryA((lpModuleName)); \
19     if (NULL != GetProcAddress(hModule, (hProcName))) __asm JMP EAX;
20 
21 #pragma comment (linker, "/EXPORT:Add=_Add,@1")
22 
23 ENDEF Add()
24 {
25     JMPFARPROC("Dll.tmp", "Add");
26 }
27 
28 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
29 {
30     switch (fdwReason)
31     {
32     case DLL_PROCESS_ATTACH:
33         MessageBoxA(NULL, "Hijack Dll Attach", "", MB_ICONINFORMATION);
34         break;
35     case DLL_PROCESS_DETACH:
36         MessageBoxA(NULL, "Hijack Dll Detach", "", MB_ICONINFORMATION);
37         break;
38     default:
39         break;
40     }
41 
42     return TRUE;
43 }
main.cpp

 

此处的宏JMPFARPROC看起来似乎每次转发函数都会加载一次hModule,其实不会,先GetModuleHandle获得的hModule是不会增加引用计数的.

所以即使是大量的转发,也应该不会出现内存泄漏的问题.

 

都是些很简单的代码,仔细认真看看就好了

 

测试是只需要新建一个工程,工程下新建三个项目,分别是一个控制台程序和两个动态链接库,

在每个项目新建main.cpp文件,将代码贴入,生成工程之后.在Debug/Release文件夹下,将Dll.dll更名为Dll.tmp,将HijackDll.dll更名为Dll.dll...

即可完成Dll劫持...

posted on 2015-07-27 00:37  gwsbhqt 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/gwsbhqt/p/4679088.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以一个D3D为例子,表现DLL劫持 DLL劫持原理[url=]编辑[/url] 由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL劫持hijack)了。 利用这种方法取得控制权后,可以对主程序进行补丁。此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll、sxs.dll,这些DLL都可被劫持。 伪造的dll制作好后,放到程序当前目录下,这样当原程序调用原函数时就调用了伪造的dll的同名函数,进入劫持DLL的代码,处理完毕后,再调用原DLL此函数。 这种补丁技术,对加壳保护的软件很有效,选择挂接的函数最好是在壳中没有被调用的,当挂接函数被执行时,相关的代码已被解压,可以直接补丁了。在有些情况下,必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测,很适合加壳程序的补丁制作。 一些木马或病毒也会利用DLL劫持技术搞破坏,因此当在应用程序目录下发现系统一些DLL文件存在时,如lpk.dll,应引起注意。 首先 运行exe他会把需要的DLL加载进来,加载的目录如无特别的制定的话,现在当前目录找,然后再去系统目录找 我的附件中自带了一个D3D9的绘图程序,是VC写的 调用的是系统的D3D9.DLL(因为目录下没有) 只解压那个exe文件,是不会有文字出现的 如果把其他的DLL一起解压,就会出现下图文字hello D3D hook! 那么我们如何劫持了D3D9.dll呢 d3d9_Ex.dll 这个文件其实就是D3D9.dll了,但是我们改名字了,程序就不认识了 我们先用 把D3D9.DLL的输出表找到,弄到 易语言 里,并且生成D3D9.DLL到目录 这样他调用的就是我们的DLL,但是这样会报错,因为我们的DLL没有内容只是一个壳子 只要我们再把他要调用的函数调用一下不就行了吗 源码中的汇编指令是把函数传递到原来的D3D9。现在的D3D9_Ex里 这样调用就是调用 我们的DLL->原来的DLL,中间就可以加些我们需要的代码了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值