problemas para obtener la ImageBase de un proceso

6 views
Skip to first unread message

aguml

unread,
Aug 18, 2020, 10:04:06 AM8/18/20
to CyC++ Buenos Aires
Buen día a todos.
He estado liado intentando obtener la imageBase de un proceso que creo suspendido y ni EnumProcesses, ni CreateToolhelp32Snapshot, ni con ninguna otra pude obtener informacion del proceso al estar suspendido. Si lo creo sin suspender no hay problemas y obtengo toda la info.
He conseguido que me funcione en x32 con esto:

DWORD GetBaseAddressFromProcessHandle(HANDLE process_handle)
{
    PROCESS_BASIC_INFORMATION pbi = {};
    ULONG ulSize;
    DWORD dwReturn=0;
    SIZE_T nRead;
    LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle,
          ULONG ProcessInformationClass, PVOID ProcessInformation,
          ULONG ProcessInformationLength, PULONG ReturnLength);

    *(FARPROC *) &NtQueryInformationProcess = GetProcAddress(
        LoadLibrary(L"ntdll"), "NtQueryInformationProcess");
    if (NtQueryInformationProcess == NULL) {
        return 0;
    }

    if(    NtQueryInformationProcess != NULL &&
        NtQueryInformationProcess(process_handle, 0, &pbi, sizeof(pbi), &ulSize) >= 0 &&
        ulSize == sizeof(pbi)) {

        ReadProcessMemory(process_handle, ((PVOID)((DWORD)pbi.PebBaseAddress + 0x8)), &dwReturn, sizeof(dwReturn), &nRead);
        return dwReturn;
    }
    return 0;


El caso que cogiendo el mismo codigo y usandolo para x64 con los minimos cambios no me funciona en x64:

DWORD64 GetBaseAddressFromProcessHandle(HANDLE process_handle)
{
    PROCESS_BASIC_INFORMATION pbi = {};
    ULONG ulSize;
    DWORD64 dwReturn=0;
    SIZE_T nRead;
    LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle,
          ULONG ProcessInformationClass, PVOID ProcessInformation,
          ULONG ProcessInformationLength, PULONG ReturnLength);

    *(FARPROC *) &NtQueryInformationProcess = GetProcAddress(
        LoadLibrary(L"ntdll"), "NtQueryInformationProcess");
    if (NtQueryInformationProcess == NULL) {
        return 0;
    }
    if(    NtQueryInformationProcess != NULL &&
        NtQueryInformationProcess(process_handle, 0, &pbi, sizeof(pbi), &ulSize) >= 0 &&
        ulSize == sizeof(pbi)) {

        ReadProcessMemory(process_handle, ((PVOID)(pbi.PebBaseAddress + 0x10)), &dwReturn, sizeof(dwReturn), &nRead);
        return dwReturn;
    }
    return 0;


Todo parece ir bien pero el valor que obtiene en dwReturn es 0.
¿Alguien me puede ayudar con esto?  

RFOG

unread,
Aug 18, 2020, 10:24:57 AM8/18/20
to cp...@googlegroups.com
Es que lo mismo, si lo creas suspendido, todavía no tiene asignado nada. Crear un proceso es muy costoso para el sistema operativo, por lo tanto no le asigna nada hasta que lo actives. ¿Has probado a crearlo sin suspender y luego suspenderlo?

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/cppba/247ec214-957e-4532-a6e0-3567bd77425cn%40googlegroups.com.

aguml

unread,
Aug 18, 2020, 12:04:35 PM8/18/20
to CyC++ Buenos Aires
Solucionado así:

DWORD64 GetBaseAddressFromProcessHandle(HANDLE process_handle)
{
PROCESS_BASIC_INFORMATION pbi = {};
ULONG ulSize;
DWORD64 dwReturn=0;
SIZE_T nRead;
PEB peb;

LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle,
  ULONG ProcessInformationClass, PVOID ProcessInformation,
  ULONG ProcessInformationLength, PULONG ReturnLength);

*(FARPROC *) &NtQueryInformationProcess = GetProcAddress(
LoadLibrary(L"ntdll"), "NtQueryInformationProcess");
if (NtQueryInformationProcess == NULL) {
return 0;
}
if( NtQueryInformationProcess != NULL &&
NtQueryInformationProcess(process_handle, ProcessBasicInformation, &pbi, sizeof(pbi), &ulSize) >= 0 &&
ulSize == sizeof(pbi)) {
        ReadProcessMemory(process_handle, (PVOID)(pbi.PebBaseAddress), &peb, sizeof(peb), &nRead);
return (DWORD64)(peb.Reserved3[1]);
}
return 0;
}
Reply all
Reply to author
Forward
0 new messages