好吧,最近我发现了一篇关于在线游戏中的地图黑客的非常有趣的文章。
读完之后,我读到他们使用内存扫描仪在内存中查找图像。
他们将如何完成这样的程序,是否有免费的解决方案?
如果不是,我将如何用 C++ 编写代码?我怎么知道一段记忆是一个“图像”?
我可以将自己的 DLL 加载到进程中,所以这不应该是一个大问题..
好吧,最近我发现了一篇关于在线游戏中的地图黑客的非常有趣的文章。
读完之后,我读到他们使用内存扫描仪在内存中查找图像。
他们将如何完成这样的程序,是否有免费的解决方案?
如果不是,我将如何用 C++ 编写代码?我怎么知道一段记忆是一个“图像”?
我可以将自己的 DLL 加载到进程中,所以这不应该是一个大问题..
要回答您的问题:
内存扫描器使用 OS api 从另一个进程查询内存并执行模式或差异搜索。一个很好的工具是作弊引擎。
文章中提到的工具通过根据内存中字节的值对像素着色来可视化内存。对齐仍然需要手动完成,并且可能非常耗时。我认为上述程序从未发布过。
主要问题是您无法知道特定的内存块应该是映射。任何大的规则结构在着色和对齐时都可能看起来像一个。找到您正在寻找的实际内存是非常困难的。
附加信息:
游戏中的属性图是非常动态的。如果单位或某物移动,则可见性必须更新。因此,像这样的地图的实际格式很可能是没有特定图像格式(png、jpg、...)的二进制位图。
我个人发现在内存中查找映射结构的方法是一种非常低效且耗时的方法。向那些对逆向工程一无所知的人展示是美丽的,但对我来说似乎非常不切实际。最好的方法完全取决于游戏和您的创造力。
我希望我能通过下面的例子帮助你,我是如何为星际争霸 2 制作地图的。
我的想法是加载一个游戏的回放,在那里我可以看到地图的全貌,并找到加载一个我的视力受限的普通游戏的区别。我在回放和正常游戏之间切换了几次,确实可以找到一个状态变量,在正常游戏中为 0,在回放时为 1(用于查找内存的常用工具是作弊引擎)。
接下来,我将游戏加载到调试器中,并在此状态变量上放置内存访问断点。现在,当加载普通游戏时,我会在地图加载时访问它时更改值。通过反复试验,我能够找到负责显示小地图和真实地图的正确位置。剩下的唯一任务是创建一个绕行代码位置的 dll,并确保每次加载地图时始终显示地图。
回复typ1232:你提到在内存中查找map结构既困难又不切实际。这是我取得了巨大成功的方法:在任何带有战争迷雾的游戏中加载地图,例如星际争霸 2。转储内存并保存。派出部队/单位并尽可能多地显示以前未发现的地图并进行另一个内存转储。比较两个转储并仔细查看内存中更改频率较高的区域。这很可能是存储地图的位置。
抱歉,如果我做错了,stackoverflow 的新手 :)
这可能是对“查找数据”主题的更广泛的回答,但那里有二进制分析工具。例如,..cantor.dust..是一个二进制可视化工具(尽管它仅在测试版中,但想法保持不变)。您可以在内存转储中搜索“图像”或结构的不同模式。Youtube cantordust 和创建者在 DerbyCon 上做了一个演示,展示了他如何使用它来查找 EFI 结构,以在 EFI 级别重新创建 PNG 解析器的利用。
我还认为保存可见地图与有限可见性地图的两种内存状态并搜索更改是可行的,如果不是最佳选择,我只是想指出一个替代方案。