winapi — получение базового адреса из exe переполнения стека

Я пытался получить базовый начальный адрес из этого exe-файла с помощью openprocess, но я продолжаю падать, когда запускаю код, и я не вижу в этом ничего плохого.

HMODULE GetModule(HANDLE han)
{
HMODULE hMods[1024];
int i;
DWORD cbNeeded;
char szProcessName[MAX_PATH] = "Minesweeper.exe";
EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
GetModuleFileNameEx(han, hMods[i], szProcessName, sizeof(szModName));
//printf(TEXT("\t%s (0x%08X)\n"), szModName, hMods[i]);
if (szModName == szProcessName)
{
cout << "FOUND" << endl;
}
}
return 0;
}

0

Решение

Есть несколько проблем с вашим кодом:

  • Ты используешь TCHAR, но не используя TCHAR последовательно.
  • Вы используете == вместо правильной функции сравнения строк.
  • Призыв к GetModuleFileNameEx использует неправильный массив.

Вот исправленная версия вашего кода с исправлениями (не тестировалась, но имеет большинство, если не все проблемы с адресованным кодом):

HMODULE GetModule(HANDLE han)
{
HMODULE hMods[1024];
int i;
DWORD cbNeeded;
TCHAR szProcessName[MAX_PATH] = _T("Minesweeper.exe");
EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
GetModuleFileNameEx(han, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR));
if ( _tcscmp(szModName,szProcessName) == 0)
{
cout << "FOUND" << endl;
}
}
return 0;
}

Обратите внимание, что _T() макрос используется для представления строковых литералов. Так как у Microsoft есть два типа набора символов, и вы используете TCHAR, у вас должны быть остальные строки TCHAR совместимы. Используя прямо вверх charи полагаться на тип сборки набора символов, чтобы уберечь вас от ошибки компилятора или времени выполнения, не является способом написания кода.

В дополнение sizeof в призыве к GetModuleFileNameEx должен быть разделен на sizeof(TCHAR) чтобы быть правильным.

Кроме того, для сравнения строк _tcscmp функция используется. Эта функция будет корректной независимо от типа сборки набора символов.

0

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

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

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