Я кодирую уже несколько лет, но в 2016 году взял пару лет перерыва. Теперь я решил вернуться, поэтому я хотел поэкспериментировать с реверс-инжинирингом. Я играл в игру под названием Black Ops 1: Zombies. Я нашел адреса памяти, затем перешел на C++, чтобы закодировать простой чит для неограниченного количества боеприпасов (это не в сети), но это не сработало, поэтому попробовал использовать ReadProcessMemory вместо этого, чтобы посмотреть, дает ли он правильные боеприпасы. Консоль начала выводить «0». Я подумал, что с кодом может быть что-то, поэтому я просмотрел часть моего старого исходного кода, и код был таким же, попытался вместо этого установить VS 2015 на случай, если компилятор является проблемой, все еще ничего, попробовал компилятор GNCC, все еще ничего. Пытался использовать его на своем втором компьютере, и это сработало. Я попытался отключить антивирус и защитник Windows, но все равно ничего. Вот исходный код, если он что-то значит:
#include <iostream>
#include <Windows.h>
using namespace std;
DWORD Address = 0x180A6C8;
DWORD pID;
int points;
int main()
{
while (true)
{
HWND hWnd = FindWindowA(0, ("Call of Duty®: BlackOps"));
GetWindowThreadProcessId(hWnd, &pID);
HANDLE pHandle = OpenProcess(PROCESS_VM_READ, FALSE, pID);
ReadProcessMemory(pHandle, (LPVOID)Address, &points, sizeof(points), 0);
cout << points << endl;
Sleep(100);
}
}
Протестировал все сейчас, и все равно ничего, он работает на моем втором компьютере, поэтому с адресом или кодом все в порядке, и ASLR не влияет на меня.
Вы явно что-то делаете не так. То, что я описал, будет нормально работать на всех компьютерах, если вы правильно его используете, выполните адекватную обработку ошибок и получите соответствующие разрешения для доступа к целевому процессу.
GetLastError возвращает 0, для него есть строковая функция, также null, я попытался отключить безопасность, антивирус, брандмауэр, защитник Windows и т. д. И, запустив в режиме администратора, все равно возвращает 0. Я попытался использовать другую игру, которая использует модули, но это вернул что-то вроде -66756576 Я не знаю, какое еще разрешение требуется, чем администратор + отключение блокировки возможных факторов
Я также пробовал отключить UAC, но все равно ничего
Я не вносил изменений в код или компьютер, и сегодня он снова волшебным образом заработал. смешно, но странно: /





A.) Можете ли вы прочитать адрес в Cheat Engine и т. д.
Б.) Требуется ли базовый адрес (например, client.dll)? Если да, то получите базовый адрес требуемого модуля.
Не знаете, что вы имеете в виду? Есть теги, и вопрос довольно прост: почему он не читает из памяти на одном компьютере, а на другом.
Вы не обрабатываете ошибки.
FindWindow()находит действующийHWND? Если да, то возвращает лиOpenProcess()действительныйHANDLE? Если да, возвращает лиReadProcessMemory()ИСТИНА? Если какой-либо из них выйдет из строя, чтоGetLastError()считает причиной? Вы уверены, что у вас вообще правильный адрес памяти? Убедитесь, что Рандомизация разметки адресного пространства (ASLR) не влияет на вас. Вы должны использовать смещение относительно базового адреса процесса, из которого вы читаете.