請考慮以下.NET 4.5控制台應用程序:
使用系統;命名空間ReversingMSIL101 {類程序{static void Main(string [] args){if(args.Length > 0 && args [0] ==“秘密”)Authenticated(); else Anonymous(); } private static void Authenticated(){Console.WriteLine(“人民的金子!”); } private static void Anonymous(){Console.WriteLine(“給他們銅幣...”); }}}
編譯並打開Ildasm。我們將從加載可執行文件(文件->打開)開始。完成後:將其轉儲(文件->轉儲)。 Ildasm會在一個充滿複選框的對話框中進行響應,因為我們需要盡可能多的信息,請檢查所有內容!
現在讓我們看一下我們反彙編的IL指令,啟動您喜歡的編輯器並打開以前的生成的轉儲。我們對 if
語句特別感興趣,因為它控制所提供的 password 是否正確;請注意,您可以使用生成的註釋輕鬆地找到它。
// 000009:if(args.Length > 0 && args [0] ==“ Secret”)IL_0001:/ * 02 | * / ldarg.0IL_0002:/ * 8E | * / ldlenIL_0003:/ * 69 | * /轉換為i4IL_0004:/ * 16 | * / ldc.i4.0IL_0005:/ * 31 | 12 * / bless IL_0019IL_0007:/ * 02 | * / ldarg.0IL_0008:/ * 16 | * / ldc.i4.0IL_0009:/ * 9A | * / ldelem.refIL_000a:/ * 72 | (70)000001 * / ldstr“ Secret” / * 70000001 * / IL_000f:/ * 28 | (0A)000011 * /調用bool [mscorlib / * 23000001 * /] System.String / * 01000013 * / :: op_Equality(string,string)/ * 0A000011 * / IL_0014:/ * 16 | * / ldc.i4.0IL_0015:/ * FE01 | * / ceq
IL_0017:/ * 2B | 01 * / brss IL_001aIL_0019:/ * 17 | * / ldc.i4.1IL_001a:/ * 00 | * / nopIL_001b:/ * 0A | * / stloc.0IL_001c:/ * 06 | * / ldloc.0IL_001d:/ * 2D | 08 * / brtrue.s IL_0027
我讓讀者執行反轉和分析指令的任務。我們將繼續看最後一個。長話短說:如果第一個參數不是字符串“ Secret”
,我們將轉到該分支並以 IL_0027
結尾:
IL_0027:/ * 28 | (06)000003 * /調用void ReversingMSIL101.Program / * 02000002 * / :: Anonymous()/ * 06000003 * /
還不錯嗎?因此,我們將稍微調整最後一條指令,此外,將其替換為 brfalse.s
:
IL_001d:/ * 2B | 08 * / brfalse.s IL_0027
就這樣,我們完成了!保存文件並打開外殼,導航到包含IL轉儲的文件夾,然後發出 ilasm ReversingMSIL101.il
以便將轉儲重新組裝為可執行文件!
現在是時候驗證我們的工作:
C:\ Users \ dna \ Documents \ Visual Studio 2012 \ Projects \ ReversingMSIL101 \ ReversingMSIL101 \ bin \ Debug>ReversingMSIL101.exe IdoNotKnowGold供人們使用!
>