Как найти точку входа (или базовый адрес) процесса - позаботьтесь о 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, поэтому она не имеет смысла.
Если это невозможно, каков хороший способ (найти базовый адрес или точку входа приостановленного подпроцесса)?