使用DLL注入C++进行读写操作

3

我遇到了一个问题,不确定如何做我想做的事情。

我正在使用C++将DLL注入到应用程序中,并且想要修改一个地址。但问题是我不确定如何定位它 - 让我解释一下...

我知道如何使用指针:

int x;
int *myPointer;
myPointer = &x;
*myPointer = 5;
std::cout << x << endl; // 5

我知道你能处理指针:

int x;
int *myPointer;
int **myPointer2;
myPointer = &x;
myPointer2 = &myPointer;
**myPointer = 5;
std::cout << x << endl; // 5

我正在尝试通过将DLL注入到游戏中,并在按下某个键时将弹药设置为固定值,制作一个基本的游戏修改器。注入和按键操作正常,但每次尝试访问内存时都会崩溃。
我已经使用 Cheat Engine 获取了要更改的变量的静态地址以及三个偏移量。
Cheat Engine 中的地址信息如下:
Address: 0288A520 = 19
Type: 4 bytes
0   [0288A520 + 0]   -> 0288A520
14  [0288A520 + 14]  -> 0288A520
384 [0288A3D0 + 384] -> 02881A30
ac_client.exe+109B74 -> 0288A3D0

我希望可以修改我的DLL中的值19。

如果我关闭游戏并重新打开,我可以通过这些指针获得正确的值,但现在我的问题是我不知道如何在C++中实现这一点。我该如何表示这个静态地址?

我的主线程目前看起来像这样...

DWORD WINAPI Main_Thread(LPVOID lpParam)
{
    while(1)
    {
    if(GetAsyncKeyState(VK_HOME)) {
            // Output value here???
        }
        Sleep(100);
    }
}

非常感谢您的帮助。


这段程序有问题吗? int *myPointer; myPointer = 0x0288A520; *myPointer=19 - Jerry Jeremiah
当我尝试那个的时候,它崩溃了。不过再试一次也不会有什么损失!那个地址在每次程序启动时都会变化。我需要通过静态指针访问它,该指针通过另外三个指针进行传递。 - Tom Wright
1个回答

4

我已经让它工作了。之前尝试的事情是因为我的基础地址不正确所以发生了这些问题。

我的解决方案如下。

定义地址

#define BASE_ADDR 0x00400000
#define AMMO_ADDR 0x00109B74
#define AMMO_OFS1 0x00000384
#define AMMO_OFS2 0x00000014

获取地址函数

DWORD getAddress(DWORD baseAddress, DWORD offsets[], int offsetCount)
{
    DWORD address; // Where the final address will be stored
    address = *(DWORD*)(BASE_ADDR + baseAddress); // Add the base address to the modules base address.

    // Loop through each offset
    for(int i = 0; i < offsetCount; i++) {
        address = *(DWORD*)(address + offsets[i]);
    }

    return address;
}

改变数值
DWORD ammoOffsets[] = {AMMO_OFS1, AMMO_OFS2};
DWORD ammoAddress = getAddress(AMMO_ADDR, ammoOffsets, 2);      
int* ammoPointer = (int*) ammoAddress;
*ammoPointer = 20;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接