2013-12-03 5 views
1

У меня проблема с этим кодом на C++. Когда я использую обычный адрес, он работает, но когда я использую адрес указателя, он не работает. Когда я помещаю адрес указателя, он просто показывает всегда число, но с обычным адресом он работает. Что я должен добавить, что я могу использовать указатели?Чтение адреса из процесса

#include <iostream> 
#include <Windows.h> 
#include <string> 
#include <ctime> 
using namespace std; 

int main() 
{ 
HWND hwnd = FindWindow(L"MyWindow", 0); 

if (hwnd){ 
    cout << "WINDOW FOUND" << endl; 
} 

else { 
    cout << "WINDOW NOT FOUND" << endl; 

    cout << hwnd << endl; 

} 

DWORD ProcessId; 

ProcessId = GetProcessId(hwnd); 

GetWindowThreadProcessId(hwnd, &ProcessId); 

HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, ProcessId); 

if (!hProcess) 
{ 
     Beep(1000, 1000); 
} 
else { 
    int address; 
redo: 
    if (ReadProcessMemory(hProcess, (int *)0x733946D8, &address, 4, NULL)) 
    { 
     cout << dec << address << endl; 
     goto redo; 
    } 
    else { 
     MessageBox(0, TEXT("Could not Read"), TEXT("Return"), MB_OK); 
    } 
} 
CloseHandle(hProcess); 
cout << endl; 
system("pause"); 
} 

ответ

2
  1. A (действительно, не нулевой) указатель из другого процесса имеет смысл в пределах адресного пространства процесса только. ОС виртуализирует память, предоставляя каждому процессу собственную карту памяти, поэтому один и тот же адрес почти всегда относится к совершенно другой физической памяти. Или, возможно, в место, которое было заменено, поэтому в настоящее время оно не относится к физической памяти вообще. Или, может быть, он даже указывает на область памяти, которая никогда не была сопоставлена ​​вообще, и поэтому вызовет segfault, когда инопланетный процесс попытается использовать его.

    Точка, использующая указатель в другом процессе, указатель должен почти во всех случаях получить из другого процесса. И если вы смотрите на указатели другого процесса, они бесполезны в вашем собственном адресном пространстве как что-то, а не произвольные числа; их единственное реальное использование - это индексы в пространстве другого процесса.

  2. В 64-разрядной ОС указатели и объекты обычно имеют разные размеры. Если вы читаете указатель другого процесса, вам нужно скопировать sizeof(your_pointer_type) байт, а не 4.

  3. Вы должны убедиться, что вы собираетесь выводить значение указателя, как вы делаете с int, что это не char* - в противном случае он будет рассматриваться как строка и вызовет чтение этого адреса. См. № 1 выше, почему это плохо.

    (Если вы на самом деле хотите читать C-строку из другого процесса, вам необходимо скопировать байты струны в вашей собственной памяти. Затем указать на это.)

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