我一直在尝试用注射的DLL正确读取游戏的内存,它可以正常工作但是如果DLL到达其他类型的变量而不是" float"然后它崩溃了。我的问题是,如何检测是否浮动并避免崩溃。这是我的代码:
for (DWORD i = 0x1000000; i < 0x2FFFFFF; i += 0x4)
{
DWORD Base = *(DWORD*)(base + i);
DWORD lvl_2 = *(DWORD*)(Base + 0x8);
float* posx = static_cast<float*>((float*)(lvl_2 + 0x90));
Position_x = static_cast<float>(*posx);
if (Position_x > 7.05f && Position_x < 7.20f) //test > 7.05f && test < 7.20f || i == 0x2217710
{
fprintf(file, "Pointer: 0x%x Position x: %.2f \n", i, Position_x);
}
}
这是我用来更新游戏指针的扫描仪,知道结构偏移。如果我使用条件i == 0x2217710,它可以正常工作,它返回播放器的正确位置x。如果我删除条件,它会因为行Position_x = static_cast而崩溃...正在转换浮动中的其他类型的变量,这对某些变量是非法的。我怎么能这样做?提前谢谢。
答案 0 :(得分:0)
首先,我非常确定当你的指针不是浮点数时问题就不会崩溃。所有二进制值0 - 0xFFFFFFFF通常作为浮点值有效,但有些是&#34;特殊&#34;,例如&#34;不是数字&#34; - 但只要您只比较值等,它也可以正常使用这些值 - 在比较中只会出现false
。
你的实际问题是你是从base+i
制作指针,然后使用该位置的内容作为另一个指针 - 但是如果base+i
没有持有有效指针{这几乎是大多数系统中大多数32位或64位值},那么下一次提取就会出错。不幸的是,没有简单的方法来检查内存地址是否有效。在Windows中,当您尝试读取无效的内存地址时,可以使用__try
, __except
来捕获&#34;执行其他操作&#34;。