Получите строку командной строки 64-битного процесса из 32-битного процесса

Код ниже работает для меня, чтобы получить нужную строку командной строки 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;
}

9
задан Kartlee 16 September 2011 в 15:22
поделиться