首页
社区
课程
招聘
[原创]《逆向工程核心原理》-- DLL注入和卸载
发表于: 2020-3-27 21:04 7928

[原创]《逆向工程核心原理》-- DLL注入和卸载

2020-3-27 21:04
7928

DLL注入:向运行中的其他进程强制插入特定的DLL文件,主要是命令其他进程自行调用LoadLibrary() API,加载用户指定的DLL文件。

DLL注入与一般DLL加载的主要区别是加载的目标进程是其自身或其他进程。

DLL(Dynamic Linked Library,动态链接库),DLL被加载到进程后会自动运行DllMain函数,用户可以把想要执行的额代码放到DllMain函数,每当加载DLL时,添加的代码就会自动得到执行。利用该特性可以修复程序BUG,或向程序添加新功能。

使用LoadLibrary()加载某个DLL时,该DLL中的DllMain()函数会被调用执行。DLL注入的原理就是从外部促使目标进程调用LoadLibrary() API。

此处主要记录一下书上的源码分析,操作部分请自行实践。

main()函数主要检查输入程序的参数,然后调用InjectDll函数。InjectDll函数是实施DLL注入的核心函数,功能是命令目标进程自行调用LoadLibrary API。

重点介绍一下CreateRemoteThread()函数,该函数在进行DLL注入时会经常用到,其函数原型如下:

第二种方法是操作注册表,Windows的注册表中默认提供了AppInit_DLLs与LoadAppInit_DLLs两个注册表项,只要将要注入DLL的路径字符串写入AppInit_DLLs项目,并在LoadAppInit_DLLs中设置值为1,重启时,系统就会将指定的DLL注入到所有运行进程中。主要原理是User32.dll被加载到进程时,会读取AppInit_DLLs注册表项,若值为1,就调用LoadLibrary()函数加载用户DLL。所以严格来说,是将注入DLL加载到使用user32.dll的进程中。

将上述dll文件复制到某个位置,修改注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microdoft\Windows NT\CurrentVersion\Windows,将AppInit_DLLs项的值修改为待注入DLL的绝对路径,然后修改LoadAppInit_DLLs注册表项的值为1,重启,运行notepad.exe,就会看到DLL已经被注入。

第三个方法就是消息钩取,使用SetWindowsHookEx安装钩子,将指定DLL强制注入进程。

DLL卸载原理:驱使目标进程调用FreeLibrary()函数,即将FreeLibrary()函数的地址传递给CreateRemoteThread()函数的lpStartAddress参数,并把待卸载的DLL句柄传递给lpParameter参数。

需要注意的一点是:引用计数问题。调用一次FreeLibrary()函数,引用计数就会-1。引用计数表示的是内核对象被使用的次数。

CreateToolhelp32Snapshot()函数主要用来获取加载到进程的模块信息,将获取的hSnapshot句柄传递给Module32First()/Module32Next()函数后,即可设置与MODULEENTRY32结构相关的模块信息,以下为该结构的详细定义:

《逆向工程核心原理》

 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-3-27 21:20 被有毒编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 4737
活跃值: (4684)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2020-4-8 20:05
0
雪    币: 228
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
为什么显示注入成功,但没有任何反应, 在进程的dll中也找不到
2020-4-27 21:32
0
雪    币: 34
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
ghcracker 为什么显示注入成功,但没有任何反应, 在进程的dll中也找不到
注入程序要输入是想注入的dll程序的完整路径,直接写dll文件名显示的同样是注入成功,但实际并未注入
2020-10-28 13:19
0
游客
登录 | 注册 方可回帖
返回
//