0%

进程伪装

蓝队在排查恶意进程时,经常会使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "Windows.h"
#include "winternl.h"

typedef NTSTATUS(*pNtQueryInformationProcess) (HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);

void main()
{
HANDLE hPRocess = GetCurrentProcess();
PROCESS_BASIC_INFORMATION ProcessInformation;
ULONG len = 0;
HINSTANCE ntdll;
pNtQueryInformationProcess NtQueryInformationProcess;
wchar_t commandline[] = L"C:\\windows\\system32\\notepad.exe";
ntdll = LoadLibrary(TEXT("Ntdll.dll"));

//解析ntdll.dll中NtQueryInformationProcess的地址
NtQueryInformationProcess = (pNtQueryInformationProcess)GetProcAddress(ntdll, "NtQueryInformationProcess");

//获取_PEB对象
(NtQueryInformationProcess)(hPRocess, ProcessBasicInformation, &ProcessInformation, sizeof(ProcessInformation), &len);

//替换命令行和映像路径名
ProcessInformation.PebBaseAddress->ProcessParameters->CommandLine.Buffer = commandline;
ProcessInformation.PebBaseAddress->ProcessParameters->ImagePathName.Buffer = commandline;
//修改长度
ProcessInformation.PebBaseAddress->ProcessParameters->CommandLine.Length = sizeof(commandline);
ProcessInformation.PebBaseAddress->ProcessParameters->ImagePathName.Length = sizeof(commandline);
system("pause");
}


在用户态的话 可以从上面看到 已经被伪装成了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

欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------