首页 > 解决方案 > 如何在外部运行进程中更改 PEB 的命令行

问题描述

基本上我希望能够更改命令行的 PEB,我相信它位于 offset 0x70。我正在尝试使用WriteProcessMemorywhich 是Kernel32.dll.

Current_ImageBase.buffer = pNewAddr;
if (!WriteProcessMemory(hProcess, rtlUserProcParamsAddress + 0x70, (IntPtr)(&Current_ImageBase), Marshal.SizeOf(typeof(UNICODE_STRING)), out intPtrOutput))
{
    Console.WriteLine("ERROR: Failed to reflect change back to PEB.\n");
    return false;
}

这应该会改变 PEB 的命令行。

标签: c#windowsreadprocessmemory

解决方案


不能保证每个版本的 Windows 上的PEB都是相同的。

PEB包含一个指向名为 ProcessParameters的_RTL_USER_PROCESS_PARAMETERS结构的指针。

此结构包含一个名为CommandLine的UNICODE_STRING。在这个结构中是一个指向包含命令行参数的缓冲区的指针。

要从外部覆盖这些参数,您必须:

  1. 调用NTQueryProcessInformation以获取 ProcessBasicInformation 和 PEB 地址

  2. OpenProcess并获得写权限

  3. ReadProcessMemory PEB

  4. ReadProcessMemory PEB.ProcessParameters

  5. ReadProcessMemory PEB.ProcessParameters.CommandLine

  6. 从 UNICODE_STRING.Length 中提取正确大小的WriteProcessMemory PEB.ProcessParameters.CommandLine.Buffer


推荐阅读