【问题标题】:How to prevent MSIL runtime injection? [closed]如何防止 MSIL 运行时注入? [关闭]
【发布时间】:2016-07-04 21:06:25
【问题描述】:

Programmatic MSIL injectionhttp://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time 所示,您可以在运行时使用一些棘手的注入来修改 IL 代码。

我的问题是:如何防止这种情况发生?例如,如果有人使用它来绕过安全功能,我该如何避免该安全漏洞?

【问题讨论】:

  • 这个问题根本上是有缺陷的。如果可以通过修改 MSIL 来绕过某些安全功能,那么也可以在不修改 MSIL 的情况下绕过相同的安全功能。您想到了什么安全功能?提供详细信息,然后答案可以解释如何完全防止绕过,或者为什么永远无法完全防止绕过。
  • 有趣的问题,欢迎了解为什么有些企业的唯一目的是阻止这些类型的措施。我没有答案,但我可以说,大约 15 年前,我曾经为各种邪恶目的使用 SoftICE 调试器破解软件获得了很多乐趣。我当时学到的教训是“他们(我们)总能找到方法!”。这些天来要困难得多,但它很快就会在烦人的合法用户和防止不良行为之间取得平衡。
  • 究竟预防什么?用户能否在他们的机器上运行任何代码或以任何他们想要的方式修改二进制文件?在您自己的服务器上运行代码是唯一可用的选择,除非您有能力构建类似于 Xbox/PS 的封闭系统
  • 例如用于登录目的。您登录一个应用程序,该过程通过 ssl、哈希验证、防篡改、防调试等进行保护。但现在“坏人”所要做的就是登录普通帐户然后解锁应用程序功能通过在运行时注入 msil。我想防止这种情况发生。

标签: c# security cil


【解决方案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

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

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

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

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

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

但是,即使您使注射成为不可能,您仍然没有受到保护。因为您可以修改字节本身。详情请见this article

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

总而言之,您几乎可以做到注入代码但不能阻止它。

【讨论】:

  • "你可以做IL weaving来修改程序集,比如你可以找到login方法ant删除原来的IL代码直接返回true,也可以跳转到你自己的login方法。"不,因为我的应用程序受防篡改保护。因此,目前绕过我的登录系统的唯一方法是在运行时注入 MSIL。这是可能的,因为我很容易破解了我自己的程序。我正在寻找的是如何保护我的程序免受运行时注入,而不是如何注入本身。不过,感谢您的回答。
  • @JacquesMartin 我了解您要搜索的内容。我的回答是,你不能 AFAIK,我解释了原因。如果有人能回答如何防止注射,我会很高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2019-08-26
  • 2016-06-10
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多