Как изменить CommandLine PEB во внешнем запущенном процессе - PullRequest
0 голосов
/ 16 октября 2019

По сути, я хотел бы иметь возможность изменять PEB командной строки, которая, по моему мнению, имеет смещение 0x70. Я пытаюсь сделать это, используя WriteProcessMemory, который является частью 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;
}

Это должно изменить CommandLine PEB.

1 Ответ

0 голосов
/ 12 ноября 2019

Нет гарантии, что PEB будет идентичным в каждой версии Windows.

* PEB содержит указатель на _RTL_USER_PROCESS_PARAMETERS структура с именем ProcessParameters.

Эта структура содержит UNICODE_STRING с именем CommandLine . Внутри этой структуры находится указатель на буфер, который содержит аргументы командной строки.

Чтобы внешне перезаписать эти аргументы, вы должны:

  1. Вызов NTQueryProcessInformation чтобы получить ProcessBasicInformation и, следовательно, адрес PEB

  2. OpenProcess и получить права на запись

  3. ReadProcessMemory PEB

  4. ReadProcessMemory PEB.ProcessParameters

  5. ReadProcessMemory PEB.ProcessParameters.CommandLine

  6. WriteProcessMemory PEB.ProcessParameters.CommandLine.Buffer с правильным размером, извлеченным из UNICODE_STRING.Length

...