首页
论坛
专栏
课程

[原创]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析

2016-5-26 15:56 33513
josegh
1

[原创]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析

2016-5-26 15:56
33513

  本菜最近学习了什么DLL注入啊,hook啊(r3)的相关技术,觉得很好玩,于是深入发现还有DLL劫持这种东西觉得挺好玩的,加上最近看到各种木马分析报告中都还有发现有利用白加黑的现象。于是自己想找几个来玩玩,但是一个一个手动测试麻烦啊,于是想写个工具来测试目标是否存在DLL劫持漏洞的可能,于是就产生了写个工具的想法,上网一看,原来十年前都有大神写出来了,不过感觉有点麻烦,好多选项不知道干嘛的,加上本人只学了汇编和C,C++不太懂,平常都是做WINDOWS C编程,所以参考那位前辈的生成的代码改进成自己的,无奈不懂MFC ,他的源码我就没看,反正没事做,当作练练手,过程还真学了不少东西。可能有人说python三下五除二就出来。都说了无聊练习了,,,
  PS:本工具只生成常规的winowds调用方式的DLL代码,还添加了列出目标进程存在DLL劫持可能性的DLL。
  方便大家用来测试(sha)软(ren)件(fang)安(huo)全
  大神不喜勿喷啊,有错误的或者需要改进的还望指出。

0x00 工具简介
        名称:FakeLib
        开发环境:VS 2013 、 win10 x64
        开发语言:C  (纯windows sdk)
        作者:josegh

0x01 功能和使用

有两种模式:

  1.1 和aHeadLib一样,选择目标DLL直接生成这里我只生成常用的调用方式代码。

图 1-1

  1.2 通过查看进程列表,选择一个你感兴趣的进程,然后列出其加载的且不在系统
注册表KnownDlls中的DLL,然后选择一个目标来生成代码。

    1.2.1 选择侦察模式

图 1-2
     1.2.2 选择你感兴趣的进程

图 1-3
    1.2.3 选择目标DLL 生成代码

图 1-4

0x02 实际测试

  2.1 测试获取主进程函数调用参数和返回值。这里我自己写了一个测试程序
            
    2.1.1  正常 normal.dll,它导出一个函数

EXPORT DWORD add(DWORD a, DWORD b)
{
			 DWORD dwret = 0;
			 dwret = a + b;
			return dwret;
}

   
    2.1.2 一个正常的loader,去调用normal.dll的add函数
DWORD dwResult = 0;
		DWORD a = 5, b = 6;
		add = (DWORD)GetProcAddress(hDll, "add");
		if (add != NULL)
		{
			dwResult = add(a, b);
			printf_s("loader:%d + %d = %d\n\n", a, b, dwResult);
		}
		else
			printf_s("loader:获取导出函数地址失败\n\n");
		printf_s("loader:重新获取控制权\n\n");

    2.1.3 用FakeLib工具去生成一个用来劫持的DLL利用代码

图 2-1
    2.1.4 重点部分在生成的代码中添加获取参数和返回值的代码

void showArg(DWORD a, DWORD b)
{
		printf_s("fake_dll:截取到参数:a:%d  b:%d\n\n", a, b);
		return;
}
void showRet(DWORD dwret)
{
		printf_s("fake_dll:截取到返回值:%d\n\n ", dwret);
		return;
}
///////////////////////////////////////////////////////////////////////////////////
//导出函数 1
DWORD c, d, dwret;  //参数 a b,返回值dwret 在这里声明是为了不影响函数内部的堆栈
ALCDECL Fake_add()
{
//以下注释经过OD调试得出 编译环境:win10 x64 vs2013, 
		//一般情况下在这里为所欲为   注意堆栈平衡
	
		__asm
		{
			push eax				//保存eax 以防目标函数用来做参数
			mov eax, [esp +0x08]	//获取参数a
			mov c,eax                
			mov eax, [esp + 0x0C] //获取参数b
			mov d,eax
			pop eax					//恢eax
		}
		showArg(c, d);											
//为什么不直接printf?printf是由调用者维护堆栈平衡,而我们现在这里的函数是naked声明的
																
//不对自动维护堆栈,需要我们,为了方便,我们直接把它放到一个会维护堆栈平衡的函数里边执行
//下边的同理
		GetAddress("add");	
//此时栈订保持的是返回地址,因为我们前面没有破坏堆栈
		__asm pop dwRetaddress[1]						
//弹出来,下面菜可以用call,为什么用call?因为如果用直接jmp的话 想获取执行返回值有点困难
		__asm call eax									
//把返回地址入栈,这时候就相当于原来的返回地址被我们call的下一条指令地址入栈,这样真实函数返回后我们重新夺回控制权
		//一般情况下在这里继续为所欲为  注意堆栈平衡
		__asm push eax      //保存返回值
		__asm mov dwret ,eax
		showRet(dwret);
		__asm pop eax
		__asm jmp dword ptr dwRetaddress[1]			//跳回原函数
}
///////////////////////////////////////////////////////////////////////////////


  现在我们把它改名为 normal_dll.dll 放到loader目录下,执行loader的效果:
(此前你需要把之前正常的normal_dll.dll换个名字 如normal_dll_hide.dll)

图 2-1
  loader执行结果

图 2-3 执行结果
    可以看到先是我们的dll获取到返回结果。

  2.2
    略
    大家可以参考: http://www.freebuf.com/articles/78807.html
                        http://drops.wooyun.org/tips/13238#!
    乌云上也有许多例子,大家可以自己去写个测试程序,或者直接找实际的应用来测试

0x03 总结
  如果只是方便自己,我也许不会把工具的代码写得工整(自认为算是最工整的一次 - -),也不会去写界面程序。开始写导出函数的时候用的是常规的dllexport,运行的时候发现问题有点多,用OD调试发现原因是堆栈问题(菜得抠脚啊),都打算用生成汇编的算了,后面才发现有naked这种玩意,于是本着能用c就用用c的原则,最后还是选择生成c代码的方式。也算是涨姿势了。还有一点点小功能没添加,比如刷新什么的。
  还有,感觉自己菜得抠脚啊,有没有大神指点指点

0x04 使用注意
  有时候不能列出目标DLL,应该是权限问题。

源代码:
demoSrc.rar
工具Src.rar


[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上传的附件:
上一主题 下一主题
最新回复 (61)
zywzjn 2016-5-26 16:12
2
0
谢谢分享,学习学习
superlover 2016-5-26 18:56
3
0
感谢楼主分享,非常感谢。
cvcvxk 10 2016-5-26 18:58
4
0
还是喜欢Aheadlib~
另外有些DLL可以劫持,但是不会被加载到进程里...
比如某进程运行时,会加载自己目录下一个xxxx.dat但是如果没有这个文件,它也时正常运行的。
sxpp 1 2016-5-26 19:11
5
0
赞一个~~~~~~
xie风腾 2016-5-26 19:26
6
0
多谢楼主分享好东东
xie风腾 2016-5-26 19:28
7
0
楼主,介个是32位不能用到64位吧
Tennn 5 2016-5-26 19:31
8
0
支持~~~~~~~
小菜鸟一 2016-5-26 20:10
9
0
支持有码
josegh 1 2016-5-28 13:27
10
0
好像是哦
josegh 1 2016-5-28 13:31
11
0
哈哈 谢谢指点
Kisesy 2016-5-28 19:18
12
0
没有release版吗
阿扁鱼 2016-5-29 10:54
13
0
进来学习下,好东西!!
whydbg 2016-6-3 16:32
14
0
支持               。
neosky 2016-6-26 03:17
15
0
大神 支持一下
zplusplus 1 2016-6-26 08:54
16
0
楼主,第一张图没打码啊,你下边打了有什么用
neosky 2016-6-26 14:51
17
0
并不能劫持64位的DLL 能否修改一下
Orientals 2016-6-26 15:21
18
0
学习下 谢谢了!!!
BinGzL 1 2016-6-26 15:59
19
0
实际运用的时候选dll才是头疼的,并不是导入表的都可以劫持
whydbg 2016-8-9 22:02
20
0
谢谢分享
yy虫子yy 2016-8-9 23:23
21
0
谢谢分享,来看看
kakasasa 2016-8-10 03:18
22
0
mark
xhawh 2016-9-8 23:40
23
0
干什么用的
yy虫子yy 2016-9-8 23:44
24
0
技术帖,支持一下
快播用户xiao 2016-9-10 19:08
25
0
正在学习的路上 有收徒的吗
gougouly 2016-9-12 09:21
26
0
支持,谢谢
OnlyForU 2016-9-12 10:05
27
0
感谢,学习!
ClearLove 2016-9-22 01:40
28
0
谢谢分享!
littlewisp 2 2016-9-22 08:38
29
0
多谢分享......
ZMZwise 2016-9-22 09:04
30
0
谢谢大神分享,学习来了
我是谁! 2016-9-25 16:36
31
0
可以的,谢谢分享!!
haovcf 2017-1-24 11:31
32
0
修改一下就好了,要劫持dll64位的话,下面这块有修改
pPeHeader = (PIMAGE_NT_HEADERS)((DWORD)pMap + pDosHeader->e_lfanew);                        //获得PE头文件指针
        //获取导出表VA地址
        PIMAGE_EXPORT_DIRECTORY  pExportDirectory;               
        PIMAGE_OPTIONAL_HEADER64 pNtOptionalHeader = NULL ;
        pNtOptionalHeader = (PIMAGE_OPTIONAL_HEADER64)(&pPeHeader->OptionalHeader);
        pExportDirectory = (PIMAGE_EXPORT_DIRECTORY)(pNtOptionalHeader->DataDirectory[0].VirtualAddress + (DWORD)pMap);

对照看,另外可能要以管理员启动
qqsunqiang 2017-1-24 11:50
33
0
感谢楼主分享,非常感谢。
xxhaishixx 2017-1-29 00:47
34
0
这是一个很好的东西
外号刘德华 2017-2-5 23:04
35
0
感谢大神。支持支持。
wanc 2017-2-13 07:16
36
0
谢谢楼主
kongfubull 2017-2-14 15:44
37
0
感谢分享哈,学习啦。
qqsunqiang 2017-2-14 16:56
38
0
谢谢楼主的分享。
隔壁雷哥 1 2017-3-4 16:27
39
0
好东西
逍遥枷锁 2017-3-5 07:49
40
0
谢谢分享,想备用收藏下,发现论坛没有收藏功能。
小纯洁嘎嘎 2017-3-18 23:54
41
0
谢谢楼主分享,存起来以后再用。
静思围棋 2017-4-24 17:34
42
0
建议放到github
yber 2017-5-14 08:48
43
0
我也研究了一下aheadlib,学习了
kingswb 2017-5-15 06:56
44
0
学习了
wangjietx 2017-5-18 08:33
45
0
如果dll里面加个窗口就不能劫持了,不加可以,这个是什么情况,我试过多次,类似usp10.dll这样里面直接加个窗体就劫持不成功了。
Cohen 2017-6-24 12:33
46
0
wangjietx 如果dll里面加个窗口就不能劫持了,不加可以,这个是什么情况,我试过多次,类似usp10.dll这样里面直接加个窗体就劫持不成功了。
因为你劫持的dll不支持窗口  类似系统的进程你注入进去也无法  载入窗口
看不见的日落 2017-6-24 13:24
47
0
学习了
平凡人平凡事 2017-6-25 00:41
48
0
大神能交个朋友吗
Mattraks 2017-9-3 19:49
49
0
文件损坏下载无法识别求更新!
wx_美客大使 2017-11-30 13:17
50
0
怎能联系到你,想请教
游客
登录 | 注册 方可回帖
返回