我遇到了一些问题而且我不确定如何做我想做的事。
我正在使用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来获取我想要更改的变量的静态地址,以及3个偏移。
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
值19是我想在我的DLL中修改的。
如果我关闭游戏并重新打开它,我会使用这些指针获得正确的值,但现在我的问题是我不确定如何在C ++中实现它。如何在C ++中表示此静态地址?
我的主要帖子目前看起来像这样......
DWORD WINAPI Main_Thread(LPVOID lpParam)
{
while(1)
{
if(GetAsyncKeyState(VK_HOME)) {
// Output value here???
}
Sleep(100);
}
}
非常感谢任何帮助。
答案 0 :(得分:3)
我已经开始工作了。我之前尝试过的事情正在发生,因为我的基地址不正确。 我的解决方案如下所示。
定义地址
#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;