Код ниже работает для меня, чтобы получить нужную строку командной строки 32-битного процесса из 32-битного приложения, 64-битного процесса из 64-битного приложения и 32 -Bit процесс из 64-битного приложения. Это сломается, если я стараюсь использовать для 64-битного процесса из 32-битного приложения. Причина в том, что разница размер структуры в процессе_BASIC_INFormation и размером адреса. Так вот мои вопросы -
1) Предложение, приведенное в процессуальном хакере ( http://procesthacker.sourceforge.net/forums/viewtopic.php?f=15&t=181 ) Для использования функции WOW64 Кажется, не работает и не работает со следующей ошибкой -
NTWOW64ReadvirtualMemory64 Ошибка: 8000000D При чтении ProcessParameters Address из A68291A0004028E0
Кто-нибудь попробовал это и мог успешно получить информацию? Я опубликовал то же самое на своем форуме, спрашивая их мнение.
2) Есть ли другой подход к запросу информации PEUB, которая может работать на X86 и X64 надежно?
int get_cmdline_from_pid( DWORD dwPid, char** cmdLine )
{
DWORD dw, read;
HANDLE hProcess;
NtQueryInformationProcess* pNtQip;
PROCESS_BASIC_INFORMATION pbInfo;
UNICODE_STRING cmdline;
WCHAR* wcmdLine;
*cmdLine = NULL;
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPid );
if( !hProcess )
return FALSE;
pNtQip = (NtQueryInformationProcess*) GetProcAddress(GetModuleHandle("ntdll.dll"),
"NtQueryInformationProcess");
if(!pNtQip)
return FALSE;
pNtQip(hProcess, PROCESSBASICINFOMATION, &pbInfo, sizeof(pbInfo), NULL);
#ifdef _WIN64
ReadProcessMemory(hProcess, pbInfo.PebBaseAddress + 0x20, &dw, sizeof(dw),
&read);
#else
ReadProcessMemory(hProcess, pbInfo.PebBaseAddress + 0x10, &dw, sizeof(dw),
&read);
#endif
#ifdef _WIN64
ReadProcessMemory(hProcess, (PCHAR)dw+112, &cmdline, sizeof(cmdline), &read);
#else
ReadProcessMemory(hProcess, (PCHAR)dw+64, &cmdline, sizeof(cmdline), &read);
#endif
wcmdLine = (WCHAR *)malloc(sizeof(char)*(cmdline.Length + 2));
if( !wcmdLine )
return FALSE;
ReadProcessMemory(hProcess, (PVOID)cmdline.Buffer, wcmdLine,
cmdline.Length+2, &read);
*cmdLine = mmwin32_util_widetoansi(wcmdLine);
free(wcmdLine);
CloseHandle(hProcess);
return TRUE;
}