Windows — C / C ++, как я могу получить базовый адрес .exe запущенного процесса?

Я ищу метод / функцию, которую я могу использовать, чтобы получить базовый адрес "program.exe"+03262C08 -> B4895A0, Этот адрес от Cheat Engine и базовый адрес был найден с помощью сканера указателя. В сканере указателя я могу нажать show module list и есть адрес program.exe начиная с адреса 00400000 program.exe, Сканер указателей был отсканирован на адрес 09c3000(Адрес, который я хочу получить после базового адреса + много смещений [конечный адрес]). Этот адрес является базовым для определенного объекта, но я не могу добраться до адреса. Я могу получить только базовый адрес exe-файла в 00400000, Я пытаюсь добавить смещения от указателя 03262C08(и другие), но я все еще не могу добраться до адреса. Я не могу использовать функцию FindWindow(), Поскольку название программы будет изменяться, и оно будет избыточным, чтобы придерживаться его. я использую OpenProcess(), EnumProcessModulesEx(), GetModuleFileNameEx() функции. Я пробовал и других, как GetModuleInformation(),... с тем же результатом. GetModuleHandle() закончился с результатом 0x126 [ERROR_MOD_NOT_FOUND], Я использую 64-битную ОС и пытаюсь получить базовый адрес другого процесса.
Я вижу все процессы на локальной машине и модули «программного» процесса.

if (!K32EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) {
return 1;
}

cProcesses = cbNeeded / sizeof(DWORD);

cout << setw(15) << left << "Process ID" << setw(10) << left << "Modules";
cout << setw(30) << left << "Process Name" << endl;
for (i = 0; i < cProcesses; i++) {
if (aProcesses[i] != 0) {
ProcessView::GetProccesses(aProcesses[i], modules, sizeModules, &cModules, &hCurrProcess);
if (hCurrProcess != NULL) {
cout << endl << setw(15) << left << aProcesses[i] << setw(10) << left << cModules;
ProcessView::PrintModuleName(hCurrProcess, modules);
CloseHandle(hCurrProcess);
}

}
}
ProcessView::GetProccesses(cProcesses, modules, sizeModules, &cModules, &hCurrProcess);

system("cls");
ProcessView::PrintModuleNameAll(hCurrProcess, modules, cModules);

Я добавил здесь определение функции в примере из файла ProcessView.h, который я создал.

static void GetProccesses(_In_ DWORD processID, _Inout_ HMODULE ahModules[], _In_ int sizeModules, _Out_ DWORD* cModules, _Out_ HANDLE* hProcess);
static void PrintModuleName(_In_ HANDLE processID, _In_ HMODULE* modules);
static void PrintModuleNameAll(_In_ HANDLE hProcess, _In_ HMODULE * modules, _In_ DWORD cModules);

-2

Решение

Windows использует рандомизацию адресного пространства уже около десяти лет, но база модулей в EXE-файлах намного старше. Просто игнорируйте это, теперь это бессмысленно.

И не забывайте: у каждого процесса есть свое адресное пространство. Указатель в одном процессе не имеет смысла в другом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]