Cómo encontrar el punto de entrada (o la dirección base) de un proceso: cuide de ASLR

Debido a ASLR (asignación aleatoria del diseño del espacio de direcciones, desde Windows Vista), la dirección base de un exe es aleatoria, por lo que ya no se puede encontrar en el archivo PE.

En Visual C ++, ahora la opción / DYNAMICBASE está habilitada de forma predeterminada, por lo que la dirección base de un exe es aleatoria; cada vez que el cargador lo carga, sucede.

Después de investigar un poco en Google, estoy tratando de usar este patrón, pero no funciona.

Eche un vistazo a este ejemplo de código simple:

#include <iostream>

#include <vector>
#include <stdio.h>

#include <windows.h>
#include <psapi.h>

int main()
{
    STARTUPINFOA startupInfo = {0};
    startupInfo.cb = sizeof(startupInfo);
    PROCESS_INFORMATION processInformation = {0};

    if (CreateProcessA("UseCase01.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startupInfo, &processInformation))
    {
        std::vector<HMODULE> buf(128);
        DWORD needed = 0;
        for (;;) {
            if (EnumProcessModulesEx(processInformation.hProcess, &buf[0], DWORD(buf.size()*sizeof(HMODULE)), &needed, LIST_MODULES_ALL) == FALSE) {
                DWORD ec = GetLastError();
                std::cout << ec << std::endl;
                break;
            }
            else if (needed <= buf.size() * sizeof(HMODULE)) {
                break;
            }
            else {
                const size_t oldSize = buf.size();
                buf.resize(oldSize * 2);
            }
        }
        ResumeThread(processInformation.hThread);
    }
}

Mi sistema operativo es Windows 7 64bit pro, mi compilador es VS2013, este es un programa de consola de 32 bits, y UseCase01.exe también es un programa de consola de 32 bits.

EnumProcessModulesEx siempre falla, el código de error devuelto por GetLastError () es 299, MSDN dice qué pasa con este código de error: ERROR_PARTIAL_COPY, "Solo se completó parte de una solicitud ReadProcessMemory o WriteProcessMemory".

Acerca de este código de error, en la página de MSDN de EnumProcessModules, "Si se llama a esta función desde una aplicación de 32 bits que se ejecuta en WOW64, solo puede enumerar los módulos de un proceso de 32 bits. Si el proceso es un proceso de 64 bits , esta función falla y el último código de error es ERROR_PARTIAL_COPY (299) ".

Pero estoy seguro de que mi programa es de 32 bits, y, probé en un programa de 64 bits, también falla con el error 299, por lo que no tiene sentido.

"El identificador devuelto por la función CreateProcess tiene acceso PROCESS_ALL_ACCESS al objeto de proceso". - desde MSDN, ¿entonces no puede ser un problema de derechos de acceso?

Luego trato de usar CreateToolhelp32Snapshot, falla también con el código de error 299, tanto de 32 bits como de 64 bits.

Simplemente no puedo entenderlo.

Mi objetivo es encontrar el punto de entrada del subproceso de manera segura, sea cual sea el proceso de 32 bits o 64 bits.

Encontré que esta es la respuesta "más profunda" sobre esta pregunta:http://winprogger.com/getmodulefilenameex-enumprocessmodulesex-failures-in-wow64/

Desafortunadamente, el programa de 64 bits también fallará, no solo para Wow64, por lo que no tiene sentido.

Si esto no es factible, ¿cuál es la buena manera (encontrar la dirección base o el punto de entrada de un subproceso suspendido)?