1. 前言
看到了篇stomping注入的帖子,想着复现然后总结下知识点来着,结果发现东西越看越多,注入方法多的一。。慢慢来吧。
2. 进程注入
首先,我们需要了解什么是进程注入。进程注入,简而言之就是将代码注入到另一个进程中,shellcode注入和DLL注入都属于进程注入。这两种方式本质上没有区别,在操作系统层面上,dll也就是shellcode的汇编代码。
进程注入的作用是隐藏自身或者利用另一个进程的权限做一些恶意行为,比如病毒等恶意程序注入到一个正常的进程中,从而达到隐藏自身的目的。
2.1 shellcode与DLL注入介绍
注入基本可以分为DLL注入
和shellcode注入
两种,DLL注入
根据注入的时间又可以分为DLL劫持注入
与DLL注入
两种。
- shellcode注入
shellcode注入也就是代码注入,是一种向目标进程插入独立运行代码并使之运行的技术,一般调用CreateRemoteThread() API
以远程线程的形式运行插入的代码,亦称为线程注入。
- DLL注入
DLL注入是指,在程序运行之前先加载我们编写的DLL文件。
DLL劫持注入
DLL劫持注入是指,假设程序运行时需要加载DLL文件A,那么我们就劫持A,然后把我们编写的DLL文件B假扮成A,让程序加载了B后,再去加载A。
2.2 shellcode与DLL注入区别
- shellcode注入(适用于代码量少且简单的情况)
优点:占用内存少、难以查找痕迹、无需另外的DLL文件
缺点:因为内存属于易失性存储器,所以需要目标服务器一直开机
- DLL注入(适用于代码量大且复杂的情况)
优点:可以适应更多的复杂操作、功能更为齐全
缺点:会在目标内存留下相关痕迹,易被发现
2.3 Module Stomping注入
Module Stomping(又称为Module Overloading,又称为DLL Hollowing)技术。
工作原理:将一些正常DLL注入到目标进程中,寻找AddressOfEntryPoint(PE文件加载到内存时相对于镜像基址的入口点地址)
,并使用shellcode覆盖AddressOfEntryPoint
指向的内容,并为该DLL创建一个新线程,并启动该线程。
优点:
- 不需要申请RWX内存页,或者更改权限。
- shellcode是将合法dll进行注入,而不是恶意dll,可以绕过一些主动防御检测的路径。
- 执行shellcode的远程线程与合法的Windows模块关联,恶意值下降。
缺点:
ReadProcessMeory
和writeProcessMemory
函数比较敏感。(不过这两个函数在我找到的一个实现代码里并没有出现,编译成exe运行貌似也没调用这两个函数,估计和手法有关)
下面是一段注入代码,这段代码是包含了上面提到的两个敏感函数的代码。
1 |
|
不过运行时代码会报错,具体原因没搞明白。
不过问题不大,我们还有另外一段代码,是没有用到这两个敏感函数的代码。
1 |
|
这段代码采用了功能覆盖的方法,从而避开了VirtualAlloc
等函数的使用。功能覆盖是指替换程序中函数或其他数据结构内存的行为。函数覆盖是一种将原始函数的字节替换成新代码的技术,导致函数被替换或不再按照之前的功能进行工作,相反该函数会执行不同的逻辑,所以会消耗掉一个函数的地址。
这里利用的目标函数是MessageBoxA
函数,这个函数是从user32.dll
中导出的,所以我们首先需要从user32.dll
中将函数导出,这里可以使用GetProceAddress
和LoadLibraryA
函数来进行导出。下一步就是停止该函数并将其替换为shellcode,使用VirtualProtect
将其内存区域标记为可读可写,确保我们是可以进行覆盖的。接下来就是将shellcode写入到函数的地址,然后再使用VirtualProtrect
将该内存区域更改为可执行的内存。
上面的代码是一个师傅最后优化后的版本,将DLL插入到了二进制文件中,这样就不用使用LoadLibrary
来加载DLL文件,不需要使用GetProAddress
函数来获取目标函数地址了。具体分析流程可以参考师傅的文章,stomping注入。
2.4 Process Hollowing注入
进程镂空是一种防御规避的进程注入技术,主要思想是卸载合法进程的内存,写入恶意软件的代码,伪装成合法进程进行恶意活动。
执行流程如下:
- 创建一个挂起的合法进程(CreateProcess)
- 读取恶意软件的代码(VirtualAlloc)
- 获取挂起进程上下文与环境信息
- 卸载挂起进程内存(ZwUnmapViewOfSection/NtUnmapViewOfSection)
- 写入恶意软件代码(VirtualAllocEx、WriteProcessMemory、SetThreadContext)
- 恢复挂起进程(ResumeThread)
未完待续,公司要没了,需要先顾及生活了,苦鲁西。。。
x. 参考链接
1 | 红队免杀必会-进程注入--注册表-全局钩 |
发布时间: 2024-01-04
最后更新: 2024-02-22
本文标题: 进程劫持与注入篇
本文链接: https://foxcookie.github.io/2024/01/04/进程劫持与注入篇/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!