泛星安全团队第9篇文章
文章内容为学习记录,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
Run PE技术、windows敏感api隐藏
一、Run PE技术的实现
-
图例
-
整个流程如上图,实际是将PEB中ImagebaseAddress的位置从原进程替换为了恶意进程,原进程的映像基址为0x400000,我们新挂载的恶意基址为0xA00000,只需要在整个进程运行起来之前替换ImagebaseAddress的基址为恶意程序的基址即可。
-
实现:
-
使用CreateProcessA函数并设置CREATE_SUSPENDED标志,能够将任意程序执行且挂载成一个进程,此时这个进程是被暂停住的;当进程被暂停时,此时的main thread上的eip是指向thread的共同路由函数NtDLL!RtlUserThreadStart的,这个函数的第一个参数放置在eax寄存器中,eax存储的是thread完成初始化后应该返回那里继续执行的地址,第二个参数放在ebx中,ebx中存储了该进程的peb块的地址。
-
然后使用GetThreadContext函数取出当前暂停的GoogleUpdate.exe进程的main thread寄存器的信息,然后尝试用VirtualAllocEx函数在GoogleUpdate.exe进程的imagebase上申请一块sizeofimage大小的空间,让我们能把恶意进程映射到此空间中。
-
再使用WriteProcessMemory模仿进行进程映射,将DOS、NT headers和section headers都复制过去,再通过for循环将每一块区段映射到进程正确的地址中。
-
因为ebx中存储的是当前进程的PEB块,那么可以使用WriteProcessMemory去写入PEB + 8(32位下,peb->imagebaseAddress的偏移为offset + 8),完成将GoogleUpdate.exe的模块修改为恶意进程的模块;eax存储的是thread完成初始化后应该返回那里继续执行的地址,我们将eax的值修改为恶意程序的入口地址即可。
-
最后使用SetThreadContext函数将我们刚刚对寄存器所有的修改写入到进程中去,再使用ResumeThread函数恢复程序运行。
二、结合隐藏敏感api调用
-
流程
-
具体可参考之前写的《使用asm来进行常见免杀的tips》
-
核心函数
-
这里替换的函数有:
VirtualAlloc
VirtualProtect
EnumSystemCodePagesW
WriteProcessMemory
EnumWindowStationsW
EnumLanguageGroupLocalesW
VirtualAllocEx -
替换敏感函数后
-
确认以上函数均不在iat表中
三、测试上线
-
将googleupdate.exe程序和恶意程序拷贝好,运行编译好的恶意程序,发现启动的进程为googleupdate.exe,且通过process hacker观察googleupdate.exe证书签名均有效。
-
同样,此时的恶意进程id为googleupdate.exe的进程id
四、扩展进阶
-
扩展思路:恶意程序启动完毕后,先会去找目标机器上那些存在的白进程谷歌、微信、qq等,然后在使用内核层的socket下载配置好的恶意shellcode进行加载,加载完毕后自删除。
-
笔者这边测试为将shellcode进行xor和base64加密,加密后放入config.ini文件,然后写一个读取函数将config.ini中的加密shellcode读取至内存进行加载即可。
效果如下(测试时间为2022年8月27日):
-
结合隐藏流量的特征(测试时间2022年8月29日):
参考:https://github.com/aaaddress1/Windows-APT-Warfare/tree/main/source/chapter%2302/RunPE
往期回顾
·END·
原文始发于微信公众号(泛星安全团队):windows api隐藏结合进程篡改