【问题标题】:Understanding .text section of PE executable理解 PE 可执行文件的 .text 部分
【发布时间】:2014-09-25 13:57:47
【问题描述】:

我正在尝试创建一个简单的 CIL 代码反编译器。我已经设法正确加载标题和部分,现在我正在努力处理 .text 部分。

这是我的测试应用:

using System;

namespace Sample2
{
    class Program
    {
        static void Main(string[] args)
        {
            int localVarriableOne = 123;
            int localVarriableTwo = 654;

            Console.WriteLine(localVarriableOne + localVarriableTwo);
        }
    }
}

.text 部分标题告诉我PointerToRawData = 0x0200,这是我所期望的。现在,当我尝试跳到那个偏移量时,我遇到了奇怪的字符(标记为红色),这不是我所期望的。我以为我应该遇到 Method Header,无论是小还是大,但我似乎并不正确。方法标头应该设置第二个最低位,而不取决于标头类型。

但是,我设法找到了我期望的 CIL 代码(标记为蓝色)!使用我参考中的 CIL 操作码,我看到代码符合我的期望:

ldc.i4.s 123
stloc.0
ldc.i4 456
stloc.1
...

现在我很困惑。在我的方法声明之前肯定有一些东西,但我找不到任何关于 .text 部分的内容。如果有人能给我任何线索,我会很高兴的。

【问题讨论】:

    标签: .net reverse-engineering cil portable-executable


    【解决方案1】:

    .NET 程序集不使用传统的 text 段来存储它们的 .NET 代码 - 只有本地编译的代码才会存储在那里。相反,它们在 PE 中使用只有 .NET 程序集才有的特殊 CLR 结构。

    PE 文件中的“可选”标头之一是 CLR 运行时标头,它包含有关 .NET 特定结构在 PE 中的位置的所有关键信息。

    有关这方面的更多详细信息,请从 msdn.com 下载最新的 PE 规范 ("Microsoft Portable Executable and Common Object File Format Specification")

    有关如何在 PE 中组织许多 .NET 可执行代码和相应数据的更详细说明,请获取Serge Lidin's book on the .NET assembler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多