我正在为游戏编写 C++ WinAPI DLL,它包含一个小的反作弊功能,但如果有人决定 NOP (0x90) 整个反作弊,它可以很容易地绕过(我不是逆向工程的专业人士,但我相信这是可能的)。
有没有办法阻止我的 DLL 被修改?
我会说你最好将任何反作弊功能移到服务器端,或者如果它不是多人游戏,那么根本不要试图阻止作弊。
不过,您可以做的一件事是生成 DLL 的哈希值,并在应用程序代码中根据已知值或服务或网站检查它。您还可以将文件的哈希值用于其他一些任务,以及从本质上迫使黑客广泛修改游戏代码,而不仅仅是反作弊功能。这可能会阻止人们。
但是评论是对的,只要有足够的时间和资源,任何东西都是可以破解的,你只需要让它不值得花时间。
即使您可以阻止人们修改您的 DLL,也没有什么可以阻止某人用他们自己的版本替换您的 DLL,该版本在您的 .exe 可以确定的所有方面都与您的版本一样,但在某些特定方面会有所不同——除非您在 .exe 中保留 DLL 的完整副本。
花费时间和精力使其难以作弊比难以更改 .dll 更好。例如,假设我们有一个吃豆人游戏(因为大多数人都会熟悉它),那么我们可以发送吃豆人在路上吃的所有“白色药丸”的数量(和位置?),然后到达那里所花费的时间。如果游戏随后编辑 .dll 为每个白色药丸提供 10 倍的分数,或者编辑游戏使吃豆人的移动速度加快 10 倍,您可以验证它不可能是正确的,因为在每个级别您都知道吃豆人移动的速度,以及每个白色药丸吃豆人应该得到多少分。玩家被杀的次数等也可以包含在发送到服务器的信息中。
类似的原则可以应用于“射击游戏”游戏,或者依赖于买卖东西的游戏,或其他任何东西。如果您有玩家为获得分数所做的详细记录,您可以验证“这是可能的”或“这是不可能的,因为您无法通过在 1 分钟内击落 10 艘宇宙飞船来获得该分数第二,因为一艘宇宙飞船需要 10 次击落才能击落,而每发子弹需要 1 秒”。