C# 如何防止MSIL运行时注入?

C# 如何防止MSIL运行时注入?,c#,security,cil,C#,Security,Cil,如图所示,您可以在运行时使用一些技巧性的注入来修改IL代码 我的问题是:如何防止这种情况?例如,如果有人使用它来绕过一个安全特性,我如何才能避免这个安全漏洞 如何预防 就我所知,你不能。但你可以让它变得不容易 在简单的情况下,你甚至不需要注射IL。您可以执行IL编织来修改部件。例如,您可以找到登录方法并删除原始IL代码,然后简单地返回true,或者您可以跳转到自己的登录方法 public bool Login(string userName) { // original method d

如图所示,您可以在运行时使用一些技巧性的注入来修改IL代码

我的问题是:如何防止这种情况?例如,如果有人使用它来绕过一个安全特性,我如何才能避免这个安全漏洞

如何预防

就我所知,你不能。但你可以让它变得不容易


在简单的情况下,你甚至不需要注射IL。您可以执行IL编织来修改部件。例如,您可以找到登录方法并删除原始IL代码,然后简单地返回
true
,或者您可以跳转到自己的登录方法

public bool Login(string userName)
{
    // original method did security checks 
    // and return true if the user is authorized
    // your implementation can return true or jump to other method
}
为此,必须在应用程序未运行时执行此操作,即修改程序集本身。您可以使用
mono.cecil
来执行此操作,例如,您可以查看

另一种情况是向正在运行的程序集注入代码。这可分为两种情况:

  • 当代码没有jitted时\n
  • 当代码被jitted时\n
  • 对于第一种情况更容易,您仍然拥有每个方法的IL,并且您注入了自己的IL指令

    第二种情况更复杂,因为抖动将IL指针重定向到机器代码

    对于其中两个,您可以看到一堆文章\libraris使注入工作

    但即使你无法注射,你仍然没有得到保护。因为您可以修改字节本身。有关详细信息,请参阅

    对于以上所有的方法,在某些情况下做这项工作会更加复杂。例如,泛型、DynamicMethods可以防止将程序集加载到流程中(在某些情况下需要)


    总而言之,注入代码很难做到,但不能阻止它

    这个问题根本上是有缺陷的。如果可以通过修改MSIL绕过某些安全功能,也可以在不修改MSIL的情况下绕过相同的安全功能。你想要什么安全功能?详细说明这一点,然后回答可以解释如何完全防止绕过,或者为什么永远无法完全防止绕过。有趣的问题,欢迎了解为什么有企业的唯一目的是防止此类措施。我没有答案,但我可以说,大约15年前,我曾经非常喜欢SoftICE调试器破解用于各种邪恶目的的软件。我从中学到的教训是“他们(我们)总能找到办法!”。这几天要困难得多,但很快就会在恼人的合法用户和防止不良行为之间取得平衡。到底要防止什么?用户是否能够在其机器上运行任何代码或以任何方式修改二进制文件?在您自己的服务器上运行代码是唯一的选择,除非您有能力构建类似于Xbox/PSX的封闭系统,例如用于登录目的。您登录到一个应用程序,该过程由ssl、哈希验证、反篡改、反调试等保护。。但现在“坏家伙”所要做的就是登录到一个普通帐户,然后在运行时通过msil注入解锁应用程序功能。我想防止这种情况。“你可以通过IL编织来修改程序集。例如,你可以找到登录方法并删除原始IL代码,然后简单地返回true,或者你可以跳转到你自己的登录方法。”不,因为我的应用程序受到防篡改保护。所以现在绕过我的登录系统的唯一方法是在运行时注入MSIL。这是可能的,因为我很容易破解自己的程序。我要搜索的是如何保护我的程序不受运行时注入的影响,而不是如何保护注入本身。谢谢你的回答。@JacquesMartin我明白你在找什么。我的回答是,你不能害怕,我解释了原因。如果有人能回答你如何预防注射,我会非常高兴。