C ++ DLL内存阅读崩溃

时间:2015-09-27 16:22:08

标签: c++ memory dll

我一直在尝试用注射的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而崩溃...正在转换浮动中的其他类型的变量,这对某些变量是非法的。我怎么能这样做?提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先,我非常确定当你的指针不是浮点数时问题就不会崩溃。所有二进制值0 - 0xFFFFFFFF通常作为浮点值有效,但有些是&#34;特殊&#34;,例如&#34;不是数字&#34; - 但只要您只比较值等,它也可以正常使用这些值 - 在比较中只会出现false

你的实际问题是你是从base+i制作指针,然后使用该位置的内容作为另一个指针 - 但是如果base+i没有持有有效指针{这几乎是大多数系统中大多数32位或64位值},那么下一次提取就会出错。不幸的是,没有简单的方法来检查内存地址是否有效。在Windows中,当您尝试读取无效的内存地址时,可以使用__try, __except来捕获&#34;执行其他操作&#34;。