c++ DLL内存读取崩溃

C++ DLL Memory Reading Crashes

本文关键字:崩溃 读取 内存 DLL c++      更新时间:2023-10-16

我整天都在尝试如何正确地读取我注入DLL的游戏内存,它可以正确工作,但如果DLL达到其他类型的变量不是"浮动",那么它就崩溃了。我的问题是,我怎么能检测到如果是浮动和避免崩溃。下面是我的代码:

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 - 0xFFFFFFFF通常都是有效的浮点值,但有些是"特殊的",例如"不是数字"-但只要你只比较值等,使用这些值也会很好-将在比较中显示为false

你的实际问题是,你正在做一个指针从base+i,然后使用的内容在该位置作为另一个指针-但如果base+i不持有一个有效的指针{这是几乎大多数32位或64位的值在大多数系统},那么你的下一个抓取将会出错。不幸的是,没有简单的方法来检查内存地址是否有效。在Windows中,您可能会使用__try, __except来捕获当您试图读取无效的内存地址和"做其他事情"时。