如此处Programmatic MSIL injection或此处http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time所示,您可以使用一些棘手的注入在运行时修改IL代码。
我的问题是:如何预防?例如,如果有人使用它来绕过安全功能,我该如何避免安全漏洞?
答案 0 :(得分:1)
如何预防?
你不能,据我所知。但你可以做到这一点并不容易。
在简单的情况下,您甚至不需要注入IL。您可以进行IL编织以修改装配。例如,您可以找到登录方法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。
另一种情况是为运行程序集注入代码。这分为两种情况:
对于第一种情况更容易,您仍然拥有每种方法的IL并且您注入了自己的IL指令。
第二种情况更复杂,因为Jitter将IL指针重定向到机器代码。
对于其中两个你可以看到一堆文章\ libraris来使注入工作。
但即使你无法注射,你仍然没有受到保护。因为你可以修改字节本身。有关详细信息,请参阅this article。
对于上述所有方法,有些情况下工作更复杂。例如,Generics,DynamicMethods会阻止加载程序集(在某些情况下需要)。
总而言之,您很难注入代码但不能阻止它。