Я пытаюсь прочитать статический адрес, который указывает на динамический адрес, который имеет какое-то значение. Но если я пытаюсь прочитать статический адрес, он всегда возвращает 0. Единственный способ прочитать его — это подключить отладчик к динамическому адресу в чит-движке. Однако у меня нет проблем с чтением только с динамического адреса.
DWORD address = 0x74EA46D8;
int value = 0;
int new_address = 0;
DWORD pid;
HWND hwnd;
hwnd = FindWindow(NULL,L"HackMe.exe");
if(!hwnd) {
cout <<"Window not found!\n";
cin.get();
} else {
GetWindowThreadProcessId(hwnd,&pid);
HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);
if(!phandle) {
cout <<"Could not get handle!\n";
cin.get();
} else {
while(1) {
ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
cout << new_address << "\n"; //Always print 0
//int new_address = 0x2ECA40B0; //This works if I uncomment this
ReadProcessMemory(phandle,(void*)new_address,&value,sizeof(value),0);
Я даже пытался получить отладочную привилегию, но это ничего не делало. Я понятия не имею, в чем проблема, так как я очень плохо знаком с C ++. Любая помощь приветствуется.
Спасибо.
редактировать
GetLastError () сначала возвращает 0, затем возвращает 299
Редактировать 2
BOOL x = ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
cout << x << " " << GetLastError() << "\n";
возвращается
1 0
1 299
1 299
1 299
и так далее
Редактировать 3
Число прочитанных байтов равно 4.
Редактировать 4
Просто для ясности.
Чтение непосредственно из 0x74EA46D8 с помощью ReadProcessMemory () возвращает 0.
Если я открою чит-движок и добавлю адрес 0x74EA46D8 указывает на список адресов. Затем щелкните правой кнопкой мыши на нем и нажмите «Узнайте, к какому доступу этот адрес», он может быть прочитан внезапно. Включение SeDebugPrivelege ничего не делает.
Динамический адрес может быть прочитан как обычно, без использования отладочной привилегии (пока я вручную набираю адрес для него, или механизм мошенничества отлаживает адрес, чтобы можно было прочитать статический адрес)
Это структурировано таким образом:
статический адрес, указывающий на адрес, который я пытаюсь прочитать, это возвращает 0 как «новый адрес», если не указано выше.
динамический адрес, содержащий значение, которое я пытаюсь прочитать. Это хорошо читается, если я определяю динамический адрес вручную. Но если я этого не сделаю, это не удастся, так как new_address равен 0, если не см. Выше.
Редактировать 5
Наконец я обнаружил проблему, предыдущий адрес был неправильным. Этот адрес был частью чит-движка, и реальный адрес был 0x013CD878 со смещением 0x4B0. Это было причиной, почему это не сработало, если я не отладил его.
Но я надеюсь, что другие учатся на моей ошибке: P
Вы не читаете с разных адресов? address != new_address
, (void*)address
— это адрес, с которого вы начинаете читать.
Других решений пока нет …