Точка входа в программу Windows с использованием EnumProcessModules возвращает неожиданное значение

Я запускаю простое приложение и пытаюсь прочитать конкретное смещение в его памяти, используя PSAPI Windows.
когда я запускаю свой отладчик, я получаю реальное значение адреса памяти и относительное значение для моей точки входа «.exe».
тем не менее, когда я запускаю следующий код, базовый модуль, который я получаю в качестве точки входа вместе со своим смещением, дает другой адрес (он неправильный и отключается несколькими (шестнадцатеричными) химическими точками).
в чем может быть проблема?

ReadMemory — это шаблон для ReadProcessMemory

    HWND   WINDOW_HANDLE;
HANDLE PROC_HANDLE;
DWORD PROC_ID;
DWORD address;
SIZE_T bytesRead;

int InitReadMemory(const char* windowClass,const char* caption, DWORD addressOffset)
{

DWORD cbNeeded;
DWORD dwdResult;
HMODULE mainModule;
BOOL enumResult;

//Get the window handle
WINDOW_HANDLE = FindWindow(windowClass, NULL);
if(WINDOW_HANDLE == NULL)
{
//Window was not foud
return 10;
}

//Get the process ID
dwdResult = GetWindowThreadProcessId(WINDOW_HANDLE, &PROC_ID);
if(dwdResult==0)
{
//Getting Process ID failed
return 20;
}

//Open the process
PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID);

if(PROC_HANDLE==NULL)
{
//Process failed to open
return 30;
}

/*
*Get the Main Module-
*first entry in the returned HMODULE array from
*EnumProcessModules
*/
enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded);

if(enumResult != 0)
{
//Failed enumerating process modules
return 40;
}

//offset the requested memory address from the application's base address
address = (DWORD)((UINT_PTR)mainModule + addressOffset);

#ifdef DEBUG
using namespace std;
char filenameBuffer[64]="";string number;
stringstream stristream;stristream << address;
stristream >> number;
cout << number << "\r\n" << endl;

GetModuleFileNameEx(PROC_HANDLE, mainModule , filenameBuffer, 256);
cout << (byte)ReadMemory<byte>() << "\r\n" << number << "\r\n" << filenameBuffer << endl;
system("PAUSE");
#endif

return 1;}

заранее спасибо 🙂

Постскриптум Я в основном просто ищу указатели …
Ба Дам ТССС

Обновить:
по-видимому, проверяя значение GetLastError, EnumProcessModules запрашивает код ошибки 299 после того, как это сделано. и отладка показывает, что mainModule ничего не содержит … все же EnumProcessModules возвращает 0 как в «нет ошибок».

вчера мне удалось получить его и заставить GetModuleFileName правильно работать (тот же код, только добавлен GetLastError).

0

Решение

По-видимому, моя проблема заключалась в том, что я запускал тесты с фрагментом

enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded)
if(enumResult != 0)
{
//Failed enumerating process modules
return 40;
}

и успешный запуск EnumProcessModules дает ненулевой результат! (таким образом вызывая у меня некоторое замешательство и нарушая весь процесс отладки)

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

0

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

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

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