So finden Sie den Einstiegspunkt (oder die Basisadresse) eines Prozesses - kümmern Sie sich um ASLR

Aufgrund von ASLR (Address Space Layout Randomization, seit Windows Vista) ist die Basisadresse einer Exe zufällig und kann daher nicht mehr in der PE-Datei gefunden werden.

In Visual C ++ ist jetzt die Option / DYNAMICBASE standardmäßig aktiviert, sodass die Basisadresse einer Exe zufällig ist - jedes Mal, wenn der Loader sie lädt, geschieht dies.

Nach einigen Recherchen zu Google habe ich versucht, dieses Muster zu verwenden, aber es funktioniert nicht.

Bitte schauen Sie sich dieses einfache Codebeispiel an:

#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);
    }
}

Mein Betriebssystem ist Windows 7 64bit pro, mein Compiler ist VS2013, dies ist ein 32bit-Konsolenprogramm, und UseCase01.exe ist auch ein 32bit-Konsolenprogramm.

EnumProcessModulesEx schlägt immer fehl. Der von GetLastError () zurückgegebene Fehlercode ist 299. Was ist mit diesem Fehlercode? MSDN: ERROR_PARTIAL_COPY, "Nur ein Teil einer ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen.&quo

Über diesen Fehlercode auf der Seite "EnumProcessModules" von MSDN: "Wenn diese Funktion von einer 32-Bit-Anwendung aufgerufen wird, die unter WOW64 ausgeführt wird, können nur die Module eines 32-Bit-Prozesses aufgelistet werden. Wenn der Prozess ein 64-Bit-Prozess ist Prozess schlägt diese Funktion fehl und der letzte Fehlercode ist ERROR_PARTIAL_COPY (299). "

Aber ich bin sicher, dass mein Programm 32-Bit ist. Und ich habe es mit einem 64-Bit-Programm getestet. Es schlägt ebenfalls mit dem Fehler 299 fehl, sodass es keinen Sinn ergibt.

"Das von der CreateProcess-Funktion zurückgegebene Handle hat PROCESS_ALL_ACCESS-Zugriff auf das Prozessobjekt." - von MSDN, kann es also kein Problem mit den Zugriffsrechten sein?

Wenn ich versuche, CreateToolhelp32Snapshot zu verwenden, schlägt dies auch mit Fehlercode 299 fehl, sowohl mit 32-Bit als auch mit 64-Bit.

Ich kann es einfach nicht herausfinden.

Mein Ziel ist es, den Einstiegspunkt des Unterprozesses auf sichere Weise zu finden, unabhängig davon, ob es sich um einen 32-Bit- oder einen 64-Bit-Prozess handelt.

Ich fand, dies ist die "tiefste" Antwort auf diese Frage:http: //winprogger.com/getmodulefilenameex-enumprocessmodulesex-failures-in-wow64

Leider schlägt auch das 64-Bit-Programm fehl, nicht nur für Wow64, so dass es keinen Sinn ergibt.

Wenn dies nicht möglich ist, was ist der richtige Weg (Basisadresse oder Einstiegspunkt eines angehaltenen Unterprozesses suchen)?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage