一个dll注入工具的实现
编译器:vs2019
实现的功能:
- 选择进程和dll文件,实现dll远程线程注入和卸载
项目地址:https://github.com/0xkami/dllinject
0x0 程序运行情况
选择一个进程
选择一个dll文件
点击注入
注入成功
卸载成功
2021.11.25更新:
1、dll进程代码有bug,获取不到完整的进程id
2、添加dll和进程位数判断的功能
修改如下:
1 | strpid = strpid.Left(pos); |
2021.11.30更新:
1、优化程序逻辑
2、添加菜单栏和全局注入卸载功能
0x1 在vs2019中安装mfc
启动vs installer:
选择C++桌面开发中的mfc选择,直接安装即可
0x2 创建一个基本的mfc项目
选择mfc应用
有多种类型,可以了解一下然后选择对应的
生成完成后,界面如图
点击调试,即可运行一个最初的demo
0x3 设计界面
0x31 设计界面
打开资源文件
可以看到程序的界面,点击视图中的工具箱,调出按钮等控件集合
进行设计即可
0x32 修改icon
在资源中导入一个新的icon
在代码中修改为新的icon的id值
效果如下:
0x4 编写功能
想法是:
1、进程是一个下拉框,打开程序的时候就会自动加载所有的进程信息,选择一个对应的进程
2、dll文件有一个按钮,是文件选择功能,选择对应的dll文件
3、点击dll注入和卸载按钮可以实现对应的功能
0x41 进程下拉框显示
给下拉框添加一个变量,名字为combo1
点击下拉框,就可以进入到对应的代码位置
不过我没有在这里写代码,因为进程加载是在程序初始化的时候
找到初始化时的代码,编写一个显示当前所有进程信息的功能
CreateToolhelp32Snapshot:获取指定进程的快照,以及这些进程使用的堆、模块和线程
https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot
0x42 文件选择功能
给显示dll文件路径的编辑框添加一个变量,名称为dllpath
点击对应的按钮,到对应的代码位置,编写一个文件选择的功能,并用SetDlgItemText显示在编辑框中
0x43 dll注入功能
点击dll注入按钮,进入代码界面
远程线程注入和dll卸载的代码在之前已经实现过,可以直接复用(修改一些参数和小细节)
只要获取到对应的进程id和dll文件的路径值即可
dll注入按钮:
dll卸载功能代码:
0x44 新增菜单键和新对话框
1、新建一个menu
2、设计界面
3、添加到界面中
4、链接到对应的窗口
主界面是cinjectdlldlg类,我们需要在主界面的菜单中选择然后跳转到对应的对话框(以及类),因此要选择主界面的类创建方法,然后在里面新建一个要跳转的对话框的对象然后弹出
5、新建一个对话框
6、设计界面
7、点击任意一个按钮,会生成一个类和对应的cpp,在里面写方法
8、在injectdll中已经定义了一些函数,在新对话框中可以复用
导入头
1 | #include "injectdllDlg.h" |
定义对象即可调用
0x5 过程中的问题
0x51 mfc项目刚创建后就无法成功运行
解决方法:尽量不要去单个组件里面选,容易缺少文件,重新安装
0x52 错误提示:CString类型没有合适的转换到LPCTSTR的函数等
CString to LPCTSTR :强制转换 LPCTSTR dllpath = (LPCTSTR)dllname;
CString to Dword:dwpid = _ttoi(strpid);
0x53 截取字符串中的一部分
CString的Left、mid、Right函数
0x54 无法添加信息到下拉控件中
下断点调试,看变量值
Cstring的format函数很好用
0x55 资源视图显示错误在另一个编辑器中打开
关闭Resource.h文件就可以了
0x56 修改完icon之后exe的图标没有改
1、确认是否图标资源是最小的:一般mfc自动生成的IDR_MAINFRAME是128,自己添加的会大于128,顺序后延,编译时默认将ID最小的作为exe的图标。
2、清理图标缓存:https://blog.csdn.net/langb2014/article/details/50644792
0x57 命令行带参数调试
0x58 错误提示:_wtoi未识别的标识符
添加头文件#include <cstdlib>
0x59 win64的计算器无法正常注入
https://bbs.pediy.com/thread-258333.htm
计算器在win10系统中是 App Containor(类似于沙箱的虚拟环境) 应用程序 ,这种应用程序会受制于一个特殊的系统用户 “ALL APPLICATION PACKAGES”,检查被加载的dll文件的访问控制列表可知,上述用户没有访问此文件的权限,故拒绝访问。
解决方案:手动修改dll文件的访问控制列表,授予”ALL APPLICATION PACKAGES”读取和执行权限。
0x5A 无法解析的外部符号
找到对应函数需要的头文件,在项目-》配置属性-》链接器-》输入-》附加依赖项
比如_GetProcessImageFileName()API,添加Psapi.lib即可