2015-05-16 1 views
1

C++ это мой код до сих пор:Получить VU из VSXu артистки с

#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++?

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

С наилучшими пожеланиями,

Роберт

ответ

0

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

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

lpBaseOfDll

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

Чтобы получить процесс и модуль ручку можно использовать образец код здесь: Enumerating All Modules For a Process

+0

не существует easyer так или я должен перебрать все модули, чтобы найти правильный модуль ручку? Или существует даже более разумный способ найти базовый адрес DLL (например, сканирование AOB)? – Trirop

+0

@ Trirop, если вы запрашиваете oneliner - тогда я так не думаю, также вы можете проверить свой базовый адрес, используя проводник процессов из sysinternals, он покажет вам для каждого процесса, список модулей - вам нужно будет добавить столбец для базы адрес. – marcinj

Смежные вопросы