Как найти точку входа (или базовый адрес) процесса - позаботьтесь о ASLR

Из-за ASLR (рандомизации размещения адресного пространства, начиная с Windows Vista), базовый адрес exe является случайным, поэтому его больше нельзя найти в PE-файле.

В Visual C ++ теперь опция / DYNAMICBASE включена по умолчанию, поэтому базовый адрес exe является случайным - каждый раз, когда его загружает загрузчик, это происходит.

После того как я провел небольшое исследование в Google, я пытаюсь использовать этот шаблон, но он не работает.

Пожалуйста, взгляните на этот простой пример кода:

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

Моя ОС - Windows 7 64bit Pro, мой компилятор - VS2013, это 32-битная консольная программа, и UseCase01.exe также является 32-битной консольной программой.

EnumProcessModulesEx всегда терпит неудачу, код ошибки, возвращаемый GetLastError (), равен 299, MSDN говорит об этом коде ошибки: ERROR_PARTIAL_COPY, «Только часть запроса ReadProcessMemory или WriteProcessMemory была выполнена»

Об этом коде ошибки на странице EnumProcessModules MSDN: «Если эта функция вызывается из 32-разрядного приложения, работающего на WOW64, она может перечислять только модули 32-разрядного процесса. Если процесс является 64-разрядным процессом , эта функция завершается ошибкой, и последний код ошибки - ERROR_PARTIAL_COPY (299). "

Но я уверен, что моя программа 32-битная, и я тестировал на 64-битной программе, она тоже не работает с ошибкой 299, поэтому она не имеет смысла.

«Дескриптор, возвращенный функцией CreateProcess, имеет доступ PROCESS_ALL_ACCESS к объекту процесса». - из MSDN, так что это не может быть проблема с правами доступа?

Затем я пытаюсь использовать CreateToolhelp32Snapshot, он завершается ошибкой с кодом ошибки 299, как 32-разрядным, так и 64-разрядным.

Я просто не могу понять это.

Моя цель - найти точку входа в подпроцесс безопасным способом, независимо от того, 32-битный или 64-битный процесс.

Я нашел это самый глубокий ответ на этот вопрос:http://winprogger.com/getmodulefilenameex-enumprocessmodulesex-failures-in-wow64/

К сожалению, 64-битная программа тоже не будет работать, не только для Wow64, поэтому она не имеет смысла.

Если это невозможно, каков хороший способ (найти базовый адрес или точку входа приостановленного подпроцесса)?

Ответы на вопрос(2)

Ваш ответ на вопрос