標籤:style blog http color io os 使用 ar strong
以下幾個方面用來區分不同的程式集:
○ 程式集名稱:Name
○ 程式集版本:Version
○ 程式集公匙: Public Token
○ 程式集文化:Culture
如果沒有很嚴格地按照上面的幾個方面來建立程式集,程式集是很容易被篡改的。本篇體驗篡改程式集。
→清空F盤as檔案夾下的所有檔案
→在as檔案夾下建立Dog.cs類,用記事本開啟,編寫如下,儲存
using System;
public class Dog
{ public static void MakeSound()
{ Console.WriteLine("汪汪汪"); }
}
→把Dog.cs編譯成程式集
→反編譯Dog.dll程式集,查看IL代碼
// Metadata version: v4.0.30319
.assembly extern mscorlib
{ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly Dog
{ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module Dog.dll
// MVID: {A8BAEEAB-2DF4-425C-B851-87260378D735}.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x00400000
// =============== CLASS MEMBERS DECLARATION ===================
.class public auto ansi beforefieldinit Dog
extends [mscorlib]System.Object
{ .method public hidebysig static void MakeSound() cil managed
{ // 代碼大小 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr bytearray (6A 6C 6A 6C 6A 6C ) // jljljl
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Dog::MakeSound
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{ // 代碼大小 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Dog::.ctor
} // end of class Dog
○ .assembly Dog表示程式集的名稱是Dog
○ .assembly Dog語句塊中的.ver 0:0:0:0表示程式集的版本沒有經過特別的設定
○ .assembly Dog語句塊中也沒有Public Token和Culture相關資訊
→在as檔案夾下建立MainClass.cs類,用記事本開啟,編寫如下,儲存
using System;
class MainClass
{ static void Main()
{ Dog.MakeSound();
}
}
→編譯MainClass.cs,引用Dog.dll,產生MainClass.exe
→執行MainClass.exe
→現在要篡改Dog.dll,先刪除Dog.dll
→在as檔案夾下建立AnotherDog.cs類,用記事本開啟,編寫如下,儲存
using System;
public class Dog
{ public static void MakeSound()
{ Console.WriteLine("小狗怎麼叫~"); }
}
→編譯AnotherDog.cs類,同樣產生一個Dog.dll程式集
→再次運行MainClass.exe
篡改程式整合功。
總結:在產生程式集的時候,如果沒有對程式集的版本、公匙、文化等進行特別的設定,程式集很容易被篡改。
“C#程式集系列”包括:
C#程式集系列01,用記事本編寫C#,IL代碼,用DOS命令編譯器集,運行程式 C#程式集系列02,使用記事本查看可執行程式集的IL代碼 C#程式集系列03,引用多個module C#程式集系列04,在程式集包含多個module的情境下理解關鍵字internal C#程式集系列05,讓程式集包含多個module C#程式集系列06,資訊清單,EXE和DLL的區別 C#程式集系列07,篡改程式集
參考資料:
http://www.computersciencevideos.org/ created by Jamie King
C#程式集系列07,篡改程式集