今天是 .NET 系列的第一篇,我想介紹的是 .NET 的 PE Format。
.NET Framework 是 Windows 上另一種開發應用程式的框架,執行上和一般的 PE 很大的不同,但是卻還是以 PE 的形式儲存。
下面是一個很簡單的C#程式碼,會在 console 印出 Hello World!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
編譯完執行的結果
這個 PE 可以算是最簡單的 .NET PE File,接下來會以這個 PE 為範例,介紹 .NET PE 的結構。
PaloAlto 在這篇文章中大致介紹了 .NET PE File 的結構,並且實作了用來 parse .NET PE 的 python module dotnetfile
。
根據 Palo Alto 的這篇文章,.NET 的 PE 在執行上會經過以下流程:
(ref: https://unit42.paloaltonetworks.com/dotnetfile/)
實際上存在 PE File 的 .NET 程式碼是 CIL Code,在執行時才會被轉換成 machine code 由 CPU 執行。
以這個 .NET PE File 為例,可以看到比起一般的 PE,Directories 多了 .NET Directory,並且裡面包含了許多前面 PE 沒出現過的結構。
IAT (Import Address Table) 中通常只會有 mscoree.dll,也就是 .NET Runtime Library
.NET Directory (Cor20 Header) 可以在被細分為:
#~
或 #-
主要差異是 #~
表示 optimized,而 #-
沒有。
存放許多 metadata tables
Method
中的每個 method 都會指向 CIL code 的 method 起始位置MemberRef
存放 methods, properties, fields 等資訊ImplMap
存放 unmanaged methods#Strings
#US
#GUID
#Blob
整個 .NET PE File 結構會如下圖所示
(ref: https://unit42.paloaltonetworks.com/dotnetfile/)
以上就是非常粗略的 .NET PE 介紹。
下一篇,我要介紹的是 .NET Framework 的 CIL Code!