【问题标题】:Is the result of MethodBody.GetILAsByteArray Method being cached? If so, how to clear the cache?MethodBody.GetILAsByteArray 方法的结果是否被缓存?如果是这样,如何清除缓存?
【发布时间】:2014-06-01 11:58:28
【问题描述】:

作为一名安卓游戏开发者,我使用 MethodBody.GetILAsByteArray 方法来获取 IL 代码,以检测给定方法是否已被用户使用其他应用程序(例如作弊引擎)修改(注入)。例如,

class A
{
    public foo()
    {
        // do something here.
    }

    public static byte[] GetILByteCode() {
        return typeof(A).GetMethodInfo("foo").GetMethodBody().GetILAsByteArray();
    }
}

如果在函数“foo”被注入后调用函数 A.GetILByteCode(),我可以获得函数“foo”的注入版本。

如果我先调用 A.GetILByteCode(),然后在“foo”中注入一些代码。当我再次调用 A.GetILByteCode() 时,它将返回函数“foo”的原始版本,而不是注入的版本。

GetILAsByteArray() 的结果好像被缓存了。

所以我的问题是,我们能否清除GetILAsByteArray()的缓存,获取目标方法的最新IL代码?

【问题讨论】:

    标签: c# android mono unity3d il


    【解决方案1】:

    因为反射非常昂贵。 .net 运行时缓存通过反射提取的类型,并在每个缓存成员中通过反射调用。

    我相信您可以尝试耗尽类型缓存,因为它只有几个成员(我认为它是 16 个成员)。成员缓存可能是无限的。

    但是,如果他们使用的是作弊引擎,我认为他们不是在更改 IL,而是实际上更改了实际的 jitted 代码。所以我不认为你可以在这里做很多事情。

    CLR jit 编译每个被调用的方法,我不知道 Mono 是否提供解释模式。

    【讨论】:

    • 关于CheatEngine的部分是正确的。通常为了对抗它,您会将关键信息存储在服务器上而不是本地。
    • 感谢您的建议。我们确实为 100 多个类使用了 System.Type.GetType,但没有帮助耗尽 ILAsByteArray 缓存。 :(
    • 仅供参考,我们正在使用 Unity3D 开发游戏(即使用 Mono),并且已经发布。我们确认一些作弊者正在使用类似应用程序的作弊引擎来修改游戏逻辑(而不是信息),例如绕过一些函数调用。
    • 对不起,这是我对 .net RuntimeTypeCache 的阅读,它可以在单声道中以不同的方式实现。我记得读过他们创建句柄基本上是为了避免深度变形的严格规定。在 .net 4 中,句柄似乎只是包装了类型,所以我认为他们可能已经切换了缓存的实现方式。我也弄错了号码。抱歉,ActivatorCache 有 20 个成员。我在运行时类型缓存中找不到数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多