首页
社区
课程
招聘
[原创]CreateRemoteThread和RtlCreateUserThread进程创建之后注入DLL(简单的注入器)
发表于: 2020-4-18 22:58 9300

[原创]CreateRemoteThread和RtlCreateUserThread进程创建之后注入DLL(简单的注入器)

2020-4-18 22:58
9300

1. CreateRemoteThread

本文参考前辈的文章20cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3N6$3j5%4y4e0p5$3x3U0l9%4z5o6m8Q4x3V1k6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4b7f1k6Q4b7U0W2Q4c8e0g2Q4z5p5g2Q4z5f1k6Q4c8e0N6Q4z5e0m8Q4z5o6k6Q4c8e0k6Q4z5f1y4Q4z5o6W2Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0g2Q4b7V1g2Q4z5o6S2Q4c8e0g2Q4b7e0c8Q4b7e0N6Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0S2Q4b7e0N6Q4b7e0x3`.

首先CreateRemoteThread函数的原型如下,它很像CreateThread函数。不同的是,前者是远程创建线程,后者是在自己的进程下创建线程。我们用前者来注入DLL:

两个函数的区别就是第一个句柄行参,hProcess表示创建的新线程属于哪一个进程。

注入的过程如下:

(1).用VirtualAllocEx函数在目标进程的地址空间中分配一块足够大的内存用于保存被注入的dll的路径。
(2).用WriteProcessMemory函数把本进程中保存dll路径的内存中的数据拷贝到第(1)步得到的目标进程的内存中。
(3).用GetProcAddress函数获得LoadLibraryW函数的起始地址。LoadLibraryW函数位于Kernel32.dll中。
(4).用CreateRemoteThread函数让目标进程执行LoadLibraryW来加载被注入的dll。函数结束将返回载入dll后的模块句柄。
(5).用VirtualFreeEx释放第(1)步开辟的内存。
在需要卸载dll时我们可以在上述第(5)步的基础上继续执行以下步骤:
(6).用GetProcAddress函数获得FreeLibrary函数的起始地址。FreeLibrary函数位于Kernel32.dll中。
(7).用CreateRemoteThread函数让目标进程执行FreeLibrary来卸载被注入的dll。(其参数是第(4)步返回的模块句柄)。
如果不在上述步骤基础上执行操作,卸载dll时你需要这么做:
(1).获得被注入的dll在目标进程的模块句柄。
(2).重复上述步骤的第(6)、(7)两步。

需要明确几点,首先用的调用dll函数是LoadLibraryW,因为不管是LoadLibrary还是LoadLibraryA,翻译到底层用的都是宽字符函数LoadLibraryW。第二使用GetProcAddress获得LoadLibraryW函数起始位置。

第三,DLL的绝对路径需要放在用WriteProcessMemory写到目标程序的内存空间下面,而分配这个内存空间使用的函数是VirtualAllocEx

这两个函数原型是:

运行环境win10+vs2019。代码如下:

我们启动一个demo并获得它的pid:

然后获得我们需要注入的DLL的绝对路径,开始攻击:

用的查询注入是否成功的方法是用进程快照搜索进程空间是否有目标dll的方式,同反调试技术,运行就会弹出注入成功框:

同时Process Explore可以看到目标dll:

 2. RtlCreateUserThread


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 83
活跃值: (1092)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
辛苦了
2020-4-19 08:41
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
注入之后,能干些啥呢?
2020-4-19 11:55
0
雪    币: 426
活跃值: (2901)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
4
kxzpy 注入之后,能干些啥呢?
实在抱歉,我这个只是写个demo了解这两个函数注入的原理,没有增加实质内容,权当学习笔记了。
2020-4-19 18:50
0
雪    币: 729
活跃值: (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢了
2020-4-19 23:46
0
雪    币: 799
活跃值: (462)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
6
建议自己映射
2020-4-21 01:17
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
CreateRemoteThread之后不需要等待吗?WaitForSingleObject?
2020-4-21 13:30
0
雪    币: 426
活跃值: (2901)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
8
Ox9A82 建议自己映射
好的前辈
上传的附件:
2020-4-21 16:45
0
雪    币: 426
活跃值: (2901)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
9
wx_。胡圈圈 。 CreateRemoteThread之后不需要等待吗?WaitForSingleObject?
并没有涉及到进程之间的互斥,只是创建一个线程插入目标dll
2020-4-21 16:45
0
雪    币: 127
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
demo 源码呢
2020-7-24 16:40
0
游客
登录 | 注册 方可回帖
返回