Так что я изучаю некоторые вещи для инъекций в dll на тестовом исполняемом файле. После того, как я ввел мою dll, я пытаюсь получить дескриптор модуля, и с этим я пытаюсь получить базовый адрес модуля (основной exe).
DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, WCHAR *lpszModuleName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier);
DWORD dwModuleBaseAddress = 0;
if(hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32 = {0};
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if(Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if(wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
}
while(Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
Вот как я пытаюсь это сделать. Это после того, как моя DLL введена, но, кажется, по какой-то причине возвращает INVALID_HANDLE_VALUE. Я нашел функцию на одном веб-сайте и немного изменил ее, но она все еще не работает. Если у вас есть более чистый способ получения базового адреса, я был бы рад узнать об этом.
Отредактируйте проблему сейчас с помощью этой строки:
if(wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
Он никогда не равен 0, но есть имя модуля, которое я ищу, я вижу свой exe в отладчике, но это сравнение не работает.
Вот как я называю функцию
HWND window = FindWindow(0, LPCWSTR("test"));
DWORD pID = 0;
GetWindowThreadProcessId(window, &pID);
base = dwGetModuleBaseAddress(pID, (WCHAR*)("test"));
Задача ещё не решена.
Других решений пока нет …