蓝队在排查恶意进程时,经常会使用ProcessExp、ProcessHacker类的进程检查工具进行检查,而恶意进程的特征比较明显,可以通过伪造PEB进程环境块的方式来实现进程伪装
实现过程
在R3 x86下 peb通常存住在fs:[30]处,
x86系统下往往通过内联汇编的方式获取Peb地址,而在x64下可以通过使用ntdll.dll中的
NtQueryInformationProcess
来获取进程的PEB
许多进程分析工具会从PEB+0x20
处的
_RTL_USER_PROCESS_PARAMETERS
的结构体内读取path、ommandline
等数据
windbg 附加一个notepad !peb
查看peb 环境块 得到peb地址
dt _peb 000000c712bc7000
在
_RTL_USER_PROCESS_PARAMETERS+0x60
和_RTL_USER_PROCESS_PARAMETERS+0x70
处有两个_UNICODE_STRING结构体,通过这两个结构体可以查看字符串存放的位置
在0x60偏移的地方,ImagePathName
即为可执行文件的路径,结构体为_UNICODE_STRING,它的0x08偏移指向了一个Buffer,Buffer的内容为可执行文件路径的字符串。同理,0x70偏移则指向了
CommandLine为命令行参数
eu 0x201cbea2348 "C:\\Windows\\system32\\cmd.exe"
修改完后查看 此时还没修改长度 之前是notepad
现在改成了 cmd (少了4个) 由于是unciode 所以要乘以2 -> 8个(0x16)
0x3e-0x08=0x36 修改length eb(修改字节)
eb 0x201cbea1d60 36
然后在0x36处使用0x0作为结束符 eb 0x201cbea2348+0x36 0x0
然后打开PRocessExp查看 可以看到Path处已经被改成了cmd
0x70处的CommandLine同理
eu 0x201cbea2388 "C:\\Windows\\system32\\cmd.exe"
eb
0x201cbea2388+0x36 0x0eb 0x201cbea1d70 0x36
打开一个processexp 查看变化 可以看到已经改成了cmd
代码实现
1 |
|
在用户态的话 可以从上面看到 已经被伪装成了notepad
改个名先 DisguiseProcess.exe
去内核态看下 用windbg 进行内核调试 把上面的exe 找一下这个exe
!process 0 0 DisguiseProcess.exe
!process ffffa38f4934c080
看一下简要的信息
之前在用户层使用的是dt _peb
在内核层的话使用dt _eprocess
dt _eprocess ffffa38f4934c080
在下面这里即可查看到原进程的ImageFileName
References
https://xz.aliyun.com/t/10435 https://idiotc4t.com/defense-evasion/fake-commandline