修改.NET程序或DLL的幾種方法

http://hi.baidu.com/expertsearch/blog/item/3763489498ffe9027bf48092.html

本文目的是回答一個朋友關於修改程序集的留言,都是比較簡單的修改方式,不涉及脫殼等。

1:    利用ILASM和ILDASM

我們先建立如下測試程序:
namespace Test
{
class Program
{
static void Main(string[] args)
{
string s = "hello world!";
Console.WriteLine(s);
Console.ReadKey();
}
}
}

編譯之後得到Test.exe
打開Visual studio提供的命令行工具,它已經默認的設置好了相關的環境變量,輸入如下命令:
ildasm test.exe /OUT=test.il
將得到兩個文件:test.il和test.res,用記事本打開test.il,將看到如下IL代碼:
IL_0000: ldstr      "hello world!"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: call       void [mscorlib]System.Console::WriteLine(string)
IL_000c: call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_0011: pop
IL_0012: ret

我們將第一行修改爲:
IL_0000: ldstr      "hello world! --has been modified"
當然也可以增加一些函數的調用和刪除我們不想要的函數,如果對IL不熟悉,可以先在VS中寫好想要的代碼,反編譯爲IL,然後直接拷貝過來。修改完後,點保存,在命令行運行如下命令:
ilasm /OUT=test2.exe test.il
如果語法沒有錯誤,將看到如下提示
Source file is ANSI

Assembled method Test.Program::Ma
Assembled method Test.Program::.c
Creating PE file

Emitting classes:
Class 1:        Test.Program

Emitting fields and methods:
Global
Class 1 Methods: 2;

Emitting events and properties:
Global
Class 1
Writing PE file
Operation completed successfully

證明已經修改成功,我們可以直接運行test2.exe,發現程序已經按我們修改的輸出了:
hello world! -- has been modified.

2.利用Reflector的插件Reflexil

直接用IL修改比較麻煩,不小心很容易出錯,幸好我們有Jb Evain編寫的Reflexil
Reflexil基於Mono.Cecil,是一個強大的程序集編輯器。
下載完後打開Reflector --> View --> Add-Ins --> Add --> 選擇Reflexil.dll,
以後就可以直接用Reflector的Tools打開了。

開始正式的修改,用Reflector打開test.exe,打開Reflexil,選擇Main函數,可以發現IL代碼顯示在下方了,可以點擊右鍵Edit,Delete,Create等操作,沒錯,你還發現了Replace all with code,通過這個可以直接用C#代碼直接修改。其它的功能多試試就明白了,另外點擊類的時候,還可以修改類的訪問權限等,比如將private改成public。我們選中第0行,直接選擇Edit,將Operand後面的文本修改爲:hello world! -- modified by reflexil.點擊Update,在Reflector中選中Test.exe module,Save as test3.exe。執行test3.exe,就看到我們的修改生效了。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章