C++/作弊引擎,写入 Google Chrome 中的内存 - WriteProcessMemory 和 ReadProcessMemory

C++/Cheat Engine, Writing to memory in Google Chrome - WriteProcessMemory & ReadProcessMemory

为了学习更多 C++,我选择了 - 你知道的 - 一些有趣的事情,那就是写入随机应用程序的内存。我编写的代码似乎适用于所有应用程序,但我很难让它与 Google Chrome 选项卡一起使用。

我想做的只是更改我在 Slope 上的分数(在 y8.com 上),我在作弊引擎的帮助下获得了内存地址。问题似乎是检索选项卡的进程 ID。使用Chrome的任务管理器,我将选项卡的地址转换为十六进制,在作弊引擎中打开进程并找到分数地址。

问题来了。每当我使用 GetWindowThreadProcessId(window, &processID); cout << processID 时,它都不会打印可以在 chrome 的任务管理器中看到的游戏标签的 ID。事实上,它打印了 chrome 作为一个整体的 ID(我知道是因为在 chrome 的任务管理器中,"chrome" 有那个 ID)。并且无法写入或读取 chrome 的 processID 分数。如果我忽略这个问题,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 必须由网页所在的进程拥有 "runs"。

某些浏览器实现可能有一个主进程来托管 UI,包括所有选项卡,但实际网页内容可能会呈现到另一进程中的共享 bitmap/memory,这样可以安全地访问运行 脚本等

Chrome 是开源的,因此您可以看看是否有办法通过查看子进程命令行参数来找出哪个渲染进程渲染了某个选项卡。