今天的內容是 CIL Code,也就是 .NET PE File 的程式碼在檔案中儲存的形式。
根據上一篇的實驗,將 C# 程式碼以 CIL Code 來檢視的話會呈現下圖:
從 dnspy 反組譯的結果可以看到 CIL Code 其實和組合語言差不多。
Visual Studio 內建的 ILDASM.exe 也可以用來解析 CIL Code。
我個人覺得這款蠻好用的
也可以得到和 dnspy 一樣的結果。
接下來要介紹一些在反組譯的 CIL Code 裡面會看到的 keywords,主要是根據這篇文章作的筆記:
.
.assembly
, .namespace
, .class
, .method
, .ctor
, .override
public
, extends
, implements
, hidebysig
.NET Runtime 是和 JVM 一樣,都是採用 Stack Machine 的設計,也就是不像 x86 或 ARM 有 registers 可以存放計算過程中的資料。Stack Machine 會將中間產物或函數的參數放在 stack 上,透過 pop 或 push 等價的指令或是以計算位置的方式存取 stack。
.maxstack
表示 stack 的大小。如果沒有特別標示的話,預設值是 8。ld
開頭的就是 pushst
開頭的就是 pop在 CIL Code 中,opcode 的大小都是一個 bytes。
下面是一些常見的指令:
ldc.i4.m1
ldc.i4.s *num*
ldstr
ldfld
ldarg
ldarga
stloc.n
starg.n
pop
ret
ldloc.x
ldloca
ldc.*
br target
br.s target
clt
blt target
bgt target
下一篇要介紹的是 FlareOn 在去年的題目 backdoor!