Я запускаю простое приложение и пытаюсь прочитать конкретное смещение в его памяти, используя 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).
По-видимому, моя проблема заключалась в том, что я запускал тесты с фрагментом
enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded)
if(enumResult != 0)
{
//Failed enumerating process modules
return 40;
}
и успешный запуск EnumProcessModules дает ненулевой результат! (таким образом вызывая у меня некоторое замешательство и нарушая весь процесс отладки)
После того, как я понял эту деталь, я снова запустил несколько старых тестов и обнаружил, что мой целевой процесс 64-битный, когда я запускал 32-битное приложение.
поменял на 64бит и теперь работает как шарм
Других решений пока нет …