如何防止MSIL运行时注入?

如此处所示的程序化MSIL注入或此处http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time您可以使用一些棘手的注入在运行时修改IL代码。

我的问题是:如何预防? 例如,如果有人使用它来绕过安全function,我该如何避免安全漏洞?

怎么预防?

据我所知 ,你不能。 但你可以做到这一点并不容易。

在简单的情况下,您甚至不需要注入IL。 您可以进行IL编织以修改assembly。 例如,您可以找到登录方法ant删除原始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进行操作,例如,您可以查看StaticProxy.Fody 。

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

  1. 当代码没有被jitted时\ ngen’d
  2. 当代码被jitted时\ ngen’d

对于第一种情况更容易,您仍然拥有每种方法的IL并且您注入自己的IL指令。

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

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

  • Codecope
  • 第1条
  • 第2条

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

对于上述所有方法,有些情况下工作更复杂。 例如,Generics,DynamicMethods,阻止加载程序集到您的进程(在某些情况下需要)。

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