我试图创建一个简单的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
,这是我的预期。现在,当我尝试跳到那个偏移时,我遇到了奇怪的字符(标记为红色),这不是我所期望的。我认为我应该遇到方法标题,无论是小还是大,但它看起来并不像我是正确的。假设方法头的第二个最低位设置不依赖于头类型。
但是,我设法找到了我预期的CIL代码(标记为蓝色)!使用我的参考文献中的CIL操作码,我看到代码符合我的期望:
ldc.i4.s 123
stloc.0
ldc.i4 456
stloc.1
...
现在我很困惑。在我的方法声明之前肯定会有一些东西,但是我找不到关于.text部分的任何内容。如果有人能给我任何线索,我真的很高兴。
答案 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。