Стремясь выучить больше C ++, я выбрал — вы знаете — что-то интересное, и это — запись в память случайного приложения. Кажется, что написанный мной код работает во всех приложениях, но у меня возникают трудности с его настройкой для работы с вкладками Google Chrome.
То, что я пытаюсь сделать, — это просто изменить мой счет на Slope (на y8.com), для которого у меня есть адрес памяти, с помощью чит-движка. Кажется, проблема заключается в получении идентификатора процесса на вкладке. С помощью диспетчера задач Chrome я перевел адрес вкладки в шестнадцатеричный формат, открыл процесс в чит-движке и нашел адрес счета.
Здесь проблема приходит. Всякий раз, когда я использую GetWindowThreadProcessId(window, &processID); cout << processID
, он не печатает идентификатор, который можно увидеть в диспетчере задач Chrome для вкладки игры. Фактически, он печатает идентификатор chrome в целом (что я знаю, потому что в менеджере задач chrome этот идентификатор есть у «chrome»). И результат не может быть записан или прочитан из идентификатора процесса Chrome. Если я проигнорирую эту проблему, buffer
кажется, всегда печатать как 0 .. без изменений.
Я очень новичок в этом, и ожидаю, что сам не знаю, о чем говорю. Если вы сами протестируете игру, вам нужно будет найти адрес, который использует ваш Chrome. Но вот код (я закомментировал WriteProcessMemory
и положи Read
просто так у меня все заработало, прежде чем что-то писать)
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main() {
int buffer = 0;
LPVOID address = (LPVOID)0x15E7E1B0FB8/*(0x000000000192DFA0 + 0x0000291D8FE04000 + 0x18)*/;
cout << "Begin playing the game and wait for the 0 score to appear" << endl;
HWND window = FindWindow(NULL, "Slope Game - Play online at Y8.com");
if (window) {
cout << "Game found running! You ready to hax?" << endl;
DWORD processID = 11180;
GetWindowThreadProcessId(window, &processID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, processID);
if (handle) {
/*string hackedScoreInput = "0";
cout << "Desired Score: " << flush; getline(cin, hackedScoreInput);
int hackedScore = stoi(hackedScoreInput);
int suc = WriteProcessMemory(handle, address, &hackedScore, sizeof(hackedScore), NULL);
if (suc > 0) {
cout << "HAXED!" << endl;
CloseHandle(handle);
}
else {
cerr << GetLastError() << endl;
cerr << hackedScore << " of size: " << sizeof(hackedScore) << endl;
return 3;
}*/
while (true) {
ReadProcessMemory(handle, address, &buffer, sizeof(buffer), NULL);
cout << buffer << " at adress: " << processID << endl;
Sleep(100);
system("CLS");
}
}
else {
cerr << "Could not open the process" << endl;
return 2;
}
}
else {
cerr << "Error! Could not find window!" << endl;
Sleep(3000);
return 1;
}
return 0;
}
Что не так с кодом?
Современные браузеры используют несколько процессов, и нет правила, согласно которому вкладка браузера HWND должна принадлежать процессу, в котором веб-страница «работает».
В некоторых реализациях браузера может быть один основной процесс, в котором размещается пользовательский интерфейс, включая все вкладки, но фактическое содержимое веб-страницы может отображаться в общем растровом изображении / памяти в другом процессе, где безопасно запускать сценарии и т. Д.
Chrome является открытым исходным кодом, поэтому вы можете посмотреть, есть ли способ узнать, какой процесс рендеринга отображает определенную вкладку, посмотрев аргументы командной строки дочерних процессов.
Других решений пока нет …