C++ 读取内存地址/指针和偏移量
C++ Read Memory Address / Pointer & Offset
因此,我将DLL注入到进程(游戏)中,以便可以从进程内存中读取。
我想获取当前游戏时间,并且我使用作弊引擎找到了它的静态基址和偏移量:
"游戏.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是正确的(我可以用作弊引擎检查它),但在那之后一切都错了,你能帮我吗?我被困住了,我已经尝试了很多事情... :/
提前谢谢你,
我假设你想将指针增加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);
现在,无论你最终去哪里是你想要的数据,这是我无法回答的问题。 但是,如果您的目标是按字节递增,则应进行如上所示的更正。
谢谢保罗·麦肯齐,我明白了,
所以对于那些像我一样挣扎的人来说,这是真正起作用的最终代码:
//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 << "#> ";
}
}
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- constexpr 偏移量,带有指向成员数据的指针
- LLVM - 从具有偏移量的指针加载变量
- 在标准布局对象中进行指针运算(例如,使用偏移量)时,我们是否需要使用 std::launder?
- C++指针偏移量得到平方
- 没有用指针和偏移量获得正确的地址
- 为什么 *指针+偏移量不能用作 l 值?( "error: non-lvalue in assignment" )
- C++ 读取内存地址/指针和偏移量
- 与没有临时实例的成员指针的偏移量
- C++通过指针和偏移量从类中读取
- 是指向数据成员及其偏移量的指针
- 卡在读取偏移量/指针处
- 向指针添加偏移量
- c++用指针+偏移量读内存地址
- 指向成员(偏移量)的指针数组作为C++中的模板参数