iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Security

Windows Security 101系列 第 19

[Day19] .NET - PE Format

  • 分享至 

  • xImage
  •  

今天是 .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!");
        }
    }
}

編譯完執行的結果

https://ithelp.ithome.com.tw/upload/images/20231003/20120098MvyaUOLmTL.png

這個 PE 可以算是最簡單的 .NET PE File,接下來會以這個 PE 為範例,介紹 .NET PE 的結構。

dotnetfile Open Source Python Library: Parsing .NET PE Files Has Never Been Easier

PaloAlto 在這篇文章中大致介紹了 .NET PE File 的結構,並且實作了用來 parse .NET PE 的 python module dotnetfile

Execution

根據 Palo Alto 的這篇文章,.NET 的 PE 在執行上會經過以下流程:

https://ithelp.ithome.com.tw/upload/images/20231003/20120098Opl4uh7M3y.png
(ref: https://unit42.paloaltonetworks.com/dotnetfile/)

實際上存在 PE File 的 .NET 程式碼是 CIL Code,在執行時才會被轉換成 machine code 由 CPU 執行。

PE Format

以這個 .NET PE File 為例,可以看到比起一般的 PE,Directories 多了 .NET Directory,並且裡面包含了許多前面 PE 沒出現過的結構。

https://ithelp.ithome.com.tw/upload/images/20231003/20120098z1rXALv4Rg.png

IAT (Import Address Table) 中通常只會有 mscoree.dll,也就是 .NET Runtime Library

https://ithelp.ithome.com.tw/upload/images/20231003/20120098dGRGJXYYeA.png

.NET Directory (Cor20 Header) 可以在被細分為:

  • MetaData Header (Storage Header)
    • 會記載 Signature, Metadata Version 和 NumberOfStreams

https://ithelp.ithome.com.tw/upload/images/20231003/20120098Vi6P9Mt4UV.png

  • MetaData Stream
    • 通常會有 5 個 stream
      • #~ 或 #-

        • 主要差異是 #~ 表示 optimized,而 #- 沒有。

        • 存放許多 metadata tables

          • 許多 tables 的內容會指向 CIL code,像是 Method 中的每個 method 都會指向 CIL code 的 method 起始位置
          • MemberRef 存放 methods, properties, fields 等資訊
          • ImplMap 存放 unmanaged methods
        • https://ithelp.ithome.com.tw/upload/images/20231003/20120098dFEje2l69j.png

      • #Strings

        • 存放字串的地方,包含 member names, class names, method names
      • #US

        • 存放使用者的字串 (user string )
      • #GUID

      • #Blob

        • 存放一些 binary 結構,像是 binary array 和 methods’ signatures

整個 .NET PE File 結構會如下圖所示

https://ithelp.ithome.com.tw/upload/images/20231003/201200983cdlp0Bo0w.png
(ref: https://unit42.paloaltonetworks.com/dotnetfile/)

以上就是非常粗略的 .NET PE 介紹。

下一篇,我要介紹的是 .NET Framework 的 CIL Code!

References


上一篇
[Day18] Bypass UAC
下一篇
[Day20] .NET - Common Intermediate Lanaguage (CIL Code)
系列文
Windows Security 10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言