управление памятью — получите VU VSXu artiste с переполнением стека

это мой код до сих пор:

#include "iostream"#include "Windows.h"#include "stdio.h"using namespace std;int main() {

HWND hWnd = FindWindow(NULL,TEXT("Vovoid VSXu Artiste 0.4.0 [Windows 64-bit]"));
if (hWnd == 0) {
cerr << "Cannot find window "<< endl;
}
else {
DWORD pId;
GetWindowThreadProcessId(hWnd, &pId);
cout << "Found Window at "<<pId << endl;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
HMODULE hModule = GetModuleHandle(TEXT("sound.rtaudio.dll"));

if (hProc == 0) {
cerr << "Cannot open process." << endl;
}else if(hModule==0){
DWORD error = GetLastError();
cerr << "could not find Module -> error: " <<error<< endl;
}
else {
float val = 0;
int addr = 0x04D40000 + 0x19098;//should be sound.rtaudio.dll+ 0x19098
while(TRUE){
int suc = ReadProcessMemory(hProc, (LPVOID)addr, &val, (DWORD)sizeof(val), NULL);
if (suc > 0) {
cout << "Success reading " << val << " of " << hex << addr << endl;
system("cls");
}
else {
DWORD error = GetLastError();
cerr << "fail " << error << endl;
}
}}
CloseHandle(hProc);
}
cin.get();
return 0;
}

Я хочу прочитать значение VU (громкость звуковой карты) программы визуализации звука VSXu Artiste с C ++ и с помощью Cheat Engine. Это прекрасно работает с ReadProcessMemory(hProc, (LPVOID)addr, &val, (DWORD)sizeof(val), NULL); пока вы не откроете VSXu. Это довольно очевидно, потому что адрес моего значения в Cheat Engine — «sound.rtaudio.dll + 19098», а DLL загружается по «случайному» адресу.
В Cheat Engine вы можете просто нажать Ctrl + G в средстве просмотра памяти и ввести имя библиотеки DLL, чтобы найти ее базовый адрес. Я уже пробовал метод GetModuleHandle в C ++ без успеха:

HMODULE hModule = GetModuleHandle(TEXT("sound.rtaudio.dll"));

Кто-нибудь знает, как получить базовый адрес DLL с C ++?

Скриншот Cheat Engine: http://oi57.tinypic.com/331k7sw.jpg

С уважением,

Роберт

1

Решение

Я полагаю, проблема в том, что вы вызываете GetModuleHandle в своем собственном процессе. Решение, которое вы можете попробовать, это использовать:

GetModuleInformation, Базовый адрес в MODULEINFO будет возвращен как:

lpBaseOfDll

Адрес загрузки модуля.

Чтобы получить процесс и дескриптор модуля, вы можете использовать пример кода здесь:Перечисление всех модулей для процесса

0

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