我正在为java游戏制作一个反作弊程序。我想监控所有类的加载情况,找出是从哪个jar文件加载的,或者是动态生成的,这样我就可以计算hash,确认jar包是否合法。
无法通过验证jar包签名来确认合法性,因为大多数jar包都没有签名。我尝试使用jvmti的回调函数,但是找不到可以跟踪jar包的回调方法。
我也尝试从 URLClassloader 中查找 url,但我发现许多类是由自定义类加载器加载的。自定义类加载器太多,难以适应。
客户端反作弊很可能不是您应该做的,只是因为它们很容易被绕过或完全禁用,因为它们在客户端的电脑上运行 - 客户端可以完全控制。特别是像 java 这样的语言很容易进行逆向工程,虽然在 c++ 中使用检查器会使事情变得更难,但仍然可以且容易地规避这一点。
话虽如此,您可以挂钩定义类的本机方法 ClassLoader.defineClass0、.defineClass1 和 .defineClass2,并检查那里的数据。