Я пытался получить базовый начальный адрес из этого 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;
}
Есть несколько проблем с вашим кодом:
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 функция используется. Эта функция будет корректной независимо от типа сборки набора символов.
Других решений пока нет …