[转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
本菜最近学习了什么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,它导出一个函数
|
1
2
3
4
5
6
|
EXPORT DWORD add(DWORD a, DWORD b){ DWORD dwret = 0; dwret = a + b; return dwret;} |
2.1.2 一个正常的loader,去调用normal.dll的add函数
|
1
2
3
4
5
6
7
8
9
10
11
|
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 重点部分在生成的代码中添加获取参数和返回值的代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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;}/////////////////////////////////////////////////////////////////////////////////////导出函数 1DWORD 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,应该是权限问题。

上传的附件:
- 1.png(17.14kb,49次下载)
- 2.png(15.21kb,26次下载)
- 3.png(50.06kb,26次下载)
- 4.png(62.72kb,33次下载)
- 2-3.png(12.07kb,21次下载)
- 2-5.png(5.42kb,129次下载)
- 2-6.png(10.51kb,20次下载)
- fi.png(6.09kb,36次下载)
- demoSrc.rar(2.41kb,1309次下载)
- 工具Src.rar(36.64kb,1611次下载)
[转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析的更多相关文章
- 短链接服务Octopus的实现与源码开放
前提 半年前(2020-06)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信.模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求.当时为了快速推广,使用了一些比较知名的 ...
- iOS高仿app源码:纯代码打造高仿优质《内涵段子》
iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...
- [源码]一键获取windows系统登陆密码vc6版源码
[源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些 ...
- 使用 Redis 源码编译发布 Windows 版 Redis For Windows 发行包
Redis 是个高性能的键值数据库,现在日常项目开发过程中,目前个人开发项目基本都会用到 Redis,主要是用来做 缓存 和 分布式锁 的底层支持,个人喜欢用 .NET 技术体系,所以一般部署也是用 ...
- mpusher 源码编译 for windows X64
mpusher 源码编译 for windows X64 对于java我是小白,通过一步步的摸索,将经验总结下来,给更多码友提供入门的帮助.一个人的摸索是很困难的,本教程感谢 [MPush开源消息推送 ...
- [转载] Java集合---HashMap源码剖析
转载自http://www.cnblogs.com/ITtangtang/p/3948406.html 一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射 ...
- 【转载】Spring @Async 源码解读。
由于工作中经常需要使用到异步操作,一直在使用@Async, 今天抽空学习了一下它的执行原理,刚好看到一篇写的很棒的文章,这里转载过来做个记录,感谢原作者的无私奉献. 原文章链接地址:https://w ...
- CSS源码之纯css3制作的哆啦a梦图片
本文章向大家介绍一个纯css3制作的哆啦a梦图像,主要巧妙的使用了css3的border-radius属性,需要的朋友介意参考一下本文章的源码. 效果图: 源码 <!doctype html&g ...
- (转载)jQuery 1.6 源码学习(一)——core.js[1]之基本架构
在网上下了一个jQuery 1.2.6的源码分析教程,看得似懂非懂,于是还是去github上下载源码,然后慢慢看源代码学习,首先来说说core.js这个核心文件吧. jQuery整体的基本架构说起来也 ...
随机推荐
- Error: could not find java.dll 解决办法
Error: could not find java.dll 问题: 安装配置Java环境变量后,在命令行中运行java -version进行测试时却出现下面的问题: Error: opening r ...
- CSS使用示例
CSS的存在就是将网页的内容与内容展示的方式进行了分离. 使用CSS的方式有好几种,最常用的是通过引入外部CSS文件进行使用 HTML <!DOCTYPE html> <html&g ...
- KNN算法在保险业精准营销中的应用
版权所有,可以转载,禁止修改.转载请注明作者以及原文链接. 一.KNN算法概述 KNN是Machine Learning领域一个简单又实用的算法,与之前讨论过的算法主要存在两点不同: 它是一种非参方法 ...
- [poj] 3977 Subset || 折半搜索MITM
原题 给定N个整数组成的数列(N<=35),从中选出一个子集,使得这个子集的所有元素的值的和的绝对值最小,如果有多组数据满足的话,选择子集元素最少的那个. n<=35,所以双向dfs的O( ...
- ios手机弹出层上表单的操作,收起键盘焦点错乱的问题
今天遇到了ios手机下 弹出层上form表单 当收起键盘后,焦点错乱,无法再操作的问题 解决办法 function device() { const u = navigator.userAgent; ...
- 【Tomcat】一台电脑上运行多个tomcat
效果: 1.首先需要安装Tomcat7,Tomcat8. Tomcat7: Tomcat8: 2.添加两个环境变量,添加CATALINA_HOME1和CATALINA_BASE1指向E:\tomcat ...
- UVA 10746 Crime Wave - The Sequel
最小费用最大流 源点->警察->bank->汇点 剩下的模板就可以 #include <map> #include <set> #include <li ...
- Error:Execution failed for task ':bearBabyClient:processDebugManifest'. > Manifest merger failed with multiple errors, see logs
具体报错如上: 在右侧中 大方块圈中的[com.android.support:support-v4:26.0.0-alpha1] 这个文件导致的,在这的清单文件第27行合并失败,让使用tools:r ...
- 第一章:1-20、试计算以下两种情况的发送时延和传播时延: (1) 数据长度为107bit,数据发送速率为100kbit/s,传播距离为1000km,信号在媒体上 的传播速率为2×108m/s。 (2) 数据长度为103bit,数据发送速率为1Gbit/s,传输距离和信号在媒体上的传播速率同 上。
<计算机网络>谢希仁著第四版课后习题答案答: 1):发送延迟=107/(100×1000)=100s 传播延迟=1000×1000/(2×108)=5×10-3s=5ms ...
- Nginx虚拟主机(Virtual Host)配置
虚拟主机(Virtual Host)可以在一台服务器上绑定多个域名,架设多个不同的网站,一般在开发机或者要部署多个小网站的服务器上需要配置虚拟主机.nginx的虚拟主机配置其实也挺简单,为了使得配置文 ...