dll注入工具实现

一个dll注入工具的实现

编译器:vs2019

实现的功能:

  • 选择进程和dll文件,实现dll远程线程注入和卸载

项目地址:https://github.com/0xkami/dllinject

0x0 程序运行情况

image-20211123155246897

选择一个进程

image-20211123155356079

选择一个dll文件

image-20211123155441554

点击注入

image-20211123155459217

注入成功

image-20211123155615052

卸载成功

image-20211123155648715

2021.11.25更新:

1、dll进程代码有bug,获取不到完整的进程id

2、添加dll和进程位数判断的功能

修改如下:

1
strpid = strpid.Left(pos);

2021.11.30更新:

1、优化程序逻辑

2、添加菜单栏和全局注入卸载功能

0x1 在vs2019中安装mfc

启动vs installer:

image-20211123145743193

选择C++桌面开发中的mfc选择,直接安装即可

image-20211123145809548

0x2 创建一个基本的mfc项目

选择mfc应用

image-20211123143913306

有多种类型,可以了解一下然后选择对应的

image-20211123144051651

生成完成后,界面如图

image-20211123144123561

点击调试,即可运行一个最初的demo

image-20211123144145966

0x3 设计界面
0x31 设计界面

打开资源文件

image-20211123150210944

可以看到程序的界面,点击视图中的工具箱,调出按钮等控件集合

image-20211123144244771

进行设计即可

image-20211123144300259

0x32 修改icon

在资源中导入一个新的icon

image-20211123154948321

在代码中修改为新的icon的id值

image-20211123154911221

效果如下:

image-20211123162100461

image-20211123155201109

0x4 编写功能

想法是:

1、进程是一个下拉框,打开程序的时候就会自动加载所有的进程信息,选择一个对应的进程

2、dll文件有一个按钮,是文件选择功能,选择对应的dll文件

3、点击dll注入和卸载按钮可以实现对应的功能

0x41 进程下拉框显示

给下拉框添加一个变量,名字为combo1

image-20211123144329059

点击下拉框,就可以进入到对应的代码位置

image-20211123150615022

不过我没有在这里写代码,因为进程加载是在程序初始化的时候

找到初始化时的代码,编写一个显示当前所有进程信息的功能

image-20211123144517966

CreateToolhelp32Snapshot:获取指定进程的快照,以及这些进程使用的堆、模块和线程

https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot

image-20211123144717863

0x42 文件选择功能

给显示dll文件路径的编辑框添加一个变量,名称为dllpath

image-20211123144345787

点击对应的按钮,到对应的代码位置,编写一个文件选择的功能,并用SetDlgItemText显示在编辑框中

image-20211123144848771

0x43 dll注入功能

点击dll注入按钮,进入代码界面

远程线程注入和dll卸载的代码在之前已经实现过,可以直接复用(修改一些参数和小细节)

只要获取到对应的进程id和dll文件的路径值即可

dll注入按钮:

image-20211123145110065

dll卸载功能代码:

image-20211123145615468

0x44 新增菜单键和新对话框

1、新建一个menu

image-20211130142741532

image-20211130142753048

2、设计界面

image-20211130142817567

3、添加到界面中

image-20211130142925626

4、链接到对应的窗口

image-20211130143004022

image-20211130143031848

image-20211130143054433

主界面是cinjectdlldlg类,我们需要在主界面的菜单中选择然后跳转到对应的对话框(以及类),因此要选择主界面的类创建方法,然后在里面新建一个要跳转的对话框的对象然后弹出

5、新建一个对话框

image-20211130143318934

6、设计界面

image-20211130143340697

7、点击任意一个按钮,会生成一个类和对应的cpp,在里面写方法

image-20211130143456342

8、在injectdll中已经定义了一些函数,在新对话框中可以复用

image-20211130143553326

导入头

1
#include "injectdllDlg.h"

定义对象即可调用

image-20211130143627031

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 命令行带参数调试

image-20211125141527330

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即可

image-20211129162919455

0x5B xp下可执行文件的打包

image-20211129162951716

image-20211129163009566

image-20211129163033196