蓝队在排查恶意进程时,经常会使用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