反转 .Ne​​t CLR 异常处理程序链

逆向工程 拆卸 。网
2021-07-06 07:34:04

我调查了 .Net Framework JITter 编译结果,我想以编程方式获取异常处理程序链。可能有人可以帮助我进行这项调查吗?

为了使任务更容易,我调试以下代码:

class Program
{
    static void Main(string[] args) { MethodA(); }

    static void MethodA() { MethodB(); }

    static void MethodB() 
    {
        try { MethodC(); } 
          catch (Exception exception)  { MethodC(); }
    }

    static void MethodC() { MethodD(); }

    static void MethodD()
    {
        try { MethodE(); }
          catch (Exception exception) { MethodE(); }
    }

    static void MethodE() { throw new Exception(); }
}

发现了什么?

  1. JITter 使用标准方式构建堆栈帧(locals, EBP, EIP, params)
  2. 第一个参数通过寄存器移动到方法(fastcall)
  3. try-catch-finally 在哪里?我不知道。真的。方法没有任何代码可以从链中注销最后一个处理程序。
  4. 静态方法仅推送到堆栈EBPEIP这意味着,堆栈不能包含链并且链在堆栈外。

我使用的是:MS Visual Studio 2010,用于按地址解析 .Net 对象和元数据的 SOS 扩展。VMMap 来理解,给定地址是什么类型的内存页和(呵呵)MS OneNote 用不同的颜色标记内存转储以标记为已解决(这意味着,我明白我发现了什么)

我很乐意了解这条链在哪里,但我没有这样做的经验。

重要提示:CLR 不使用 SEH 处理异常(很多文章,作者在 CLR 中写了关于 SEH 的文章。CLR 只包装 SEH 以将其异常转换为 CLR 类型)

1个回答

我不能直接告诉你它是如何工作的,但也许这将有助于找到答案。

首先,您希望在 CLR 级别进行调试 - 这完全是关于与您的代码对应的 CLR 指令以及它们如何安装新的异常处理程序。一旦您可以在调试器中执行此操作,您就可以使用 CLR 调试 API 进行自动化。

http://msdn.microsoft.com/en-gb/library/vstudio/bb397953(v=vs.100).aspx

“CLR 调试服务提供了多种方法来控制程序的执行。这些方法包括断点、单步执行、异常通知、函数评估以及与程序启动和关闭相关的其他事件。”

基本上,如果您可以理解安装新处理程序并在引发异常时查找处理程序的机制,那么您可以从那里扩展。也许这个 api 会有所帮助,也许不会。