C++ 读取内存地址/指针和偏移量
C++ Read Memory Address / Pointer & Offset
所以,我已经将一个 DLL 注入到一个进程(一个游戏)中,以便我可以从进程内存中读取。
我想获取当前的游戏时间,我已经使用 Cheat Engine 找到了它的静态基地址和偏移量:
"game.exe"+0158069C
偏移量:14
这是我尝试获取浮点值(当前游戏计时器)的代码:
//Offsets
#define BASETIME 0x158069C
#define OFFSET 0x14
void CurrentTime() {
float *time;
DWORD *BaseAddress = (DWORD*)GetModuleHandle(NULL);
DWORD *BaseTimeAddress = (DWORD*)(BaseAddress + BASETIME);
time = (float*)(BaseTimeAddress + OFFSET);
if (BaseTimeAddress && time) //Check the addresses, not values.
{
std::cout << "Base Address : " << BaseAddress << endl; // Correct
std::cout << "Base Time Address &: " << &BaseTimeAddress << endl; // Not correct
std::cout << "Base Time Address : " << BaseTimeAddress << endl; // Not correct
std::cout << "Time Value : " << *time << endl; // Not correct
}
}
基地址的cout是正确的(我可以用Cheat Engine检查),但是之后一切都不对,你能帮我吗?我坚持这个,我已经尝试了很多东西......:/
提前谢谢你,
我假设您想将指针增加 OFFSET
和 BASETIME
字节。如果是这样,您的代码不会以字节为基础递增。相反,它增加了 sizeof(DWORD) * OFFSET
字节。
原因是基本指针类型是 DWORD*
,并且将这种类型的指针递增 n
将使您距离起点 n * sizeof(DWORD)
。这将无法完成工作。
最简单的解决方案是在进行指针运算时转换为 char *
,这样递增 sizeof(char)
,而不是 sizeof(DWORD)
:
DWORD *BaseTimeAddress = (DWORD*)((char *)BaseAddress + BASETIME);
time = (float*)((char *)BaseTimeAddress + OFFSET);
现在,你最终得到的是不是你想要的数据,这是我无法回答的。但是,如果您的目标是以字节为基础递增,那么您应该进行如上所示的更正。
谢谢 PaulMcKenzie 我明白了,
所以对于像我这样挣扎的人来说,这是实际工作的最终代码:
//Offsets
#define BASETIME 0x0158069C
#define OFFSET 0x14
void CurrentTime() {
DWORD* BaseAddress = (DWORD*)GetModuleHandle(NULL);
DWORD* address = (DWORD*)((char*)BaseAddress + BASETIME);
address = (DWORD*)((char*)*address + OFFSET);
float currentTime = *(float*)address;
if (address && currentTime)
{
std::cout << endl <<"----------------" << endl;
std::cout << "Base Address : " << BaseAddress << endl;
std::cout << "----------------" << endl;
std::cout << "Time Address : " << address << endl;
std::cout << "----------------" << endl;
std::cout << "Time Value : " << currentTime << endl;
std::cout << "----------------" << endl << endl << "#> ";
}
}
所以,我已经将一个 DLL 注入到一个进程(一个游戏)中,以便我可以从进程内存中读取。
我想获取当前的游戏时间,我已经使用 Cheat Engine 找到了它的静态基地址和偏移量:
"game.exe"+0158069C
偏移量:14
这是我尝试获取浮点值(当前游戏计时器)的代码:
//Offsets
#define BASETIME 0x158069C
#define OFFSET 0x14
void CurrentTime() {
float *time;
DWORD *BaseAddress = (DWORD*)GetModuleHandle(NULL);
DWORD *BaseTimeAddress = (DWORD*)(BaseAddress + BASETIME);
time = (float*)(BaseTimeAddress + OFFSET);
if (BaseTimeAddress && time) //Check the addresses, not values.
{
std::cout << "Base Address : " << BaseAddress << endl; // Correct
std::cout << "Base Time Address &: " << &BaseTimeAddress << endl; // Not correct
std::cout << "Base Time Address : " << BaseTimeAddress << endl; // Not correct
std::cout << "Time Value : " << *time << endl; // Not correct
}
}
基地址的cout是正确的(我可以用Cheat Engine检查),但是之后一切都不对,你能帮我吗?我坚持这个,我已经尝试了很多东西......:/
提前谢谢你,
我假设您想将指针增加 OFFSET
和 BASETIME
字节。如果是这样,您的代码不会以字节为基础递增。相反,它增加了 sizeof(DWORD) * OFFSET
字节。
原因是基本指针类型是 DWORD*
,并且将这种类型的指针递增 n
将使您距离起点 n * sizeof(DWORD)
。这将无法完成工作。
最简单的解决方案是在进行指针运算时转换为 char *
,这样递增 sizeof(char)
,而不是 sizeof(DWORD)
:
DWORD *BaseTimeAddress = (DWORD*)((char *)BaseAddress + BASETIME);
time = (float*)((char *)BaseTimeAddress + OFFSET);
现在,你最终得到的是不是你想要的数据,这是我无法回答的。但是,如果您的目标是以字节为基础递增,那么您应该进行如上所示的更正。
谢谢 PaulMcKenzie 我明白了,
所以对于像我这样挣扎的人来说,这是实际工作的最终代码:
//Offsets
#define BASETIME 0x0158069C
#define OFFSET 0x14
void CurrentTime() {
DWORD* BaseAddress = (DWORD*)GetModuleHandle(NULL);
DWORD* address = (DWORD*)((char*)BaseAddress + BASETIME);
address = (DWORD*)((char*)*address + OFFSET);
float currentTime = *(float*)address;
if (address && currentTime)
{
std::cout << endl <<"----------------" << endl;
std::cout << "Base Address : " << BaseAddress << endl;
std::cout << "----------------" << endl;
std::cout << "Time Address : " << address << endl;
std::cout << "----------------" << endl;
std::cout << "Time Value : " << currentTime << endl;
std::cout << "----------------" << endl << endl << "#> ";
}
}