了解PE可执行文件的.text部分

时间:2014-08-02 14:08:11

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

我试图创建一个简单的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,这是我的预期。现在,当我尝试跳到那个偏移时,我遇到了奇怪的字符(标记为红色),这不是我所期望的。我认为我应该遇到方法标题,无论是小还是大,但它看起来并不像我是正确的。假设方法头的第二个最低位设置不依赖于头类型。

XVI

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

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

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

1 个答案:

答案 0 :(得分:4)

.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