.net 程序的破解

初學.net程序的破解,瞭解還不是很全面,以後慢慢學習吧,先總結下剛學習的一種方法

1.reflector 反編譯

用reflector打開要反編譯的程序,成功的話該程序所包含的程序集會出現在左側列表中,可能有多個。

打開該程序集,會在右側顯示代碼

切換語言:在工具欄有個下拉列表框,可以切換到 IL、C#等語言

選中程序集後,右鍵“dump”可以把程序集導出爲IL文件

這種導出通常需要大量的修改才能重新編譯


2.IL文件的編輯

UE是最簡單的工具,但需要計算指令長度

可以在網上下載 ILIDE%23.rar

http://download.csdn.net/download/xiangbaichun/1894450


3. ildasm 反編譯

微軟自帶的反編譯工具,修改後可以方便地再用ilasm編譯

但好像對混淆後的程序效果不好,暫沒試過


4.ilasm編譯IL文件


參考文章

http://www.kuqin.com/dotnet/20110518/91678.html

在開發中遇到這樣一個場景,需要修改一個dll文件(.NET程序集)中某些地方的類型名稱,但沒有源代碼,只能修改IL代碼。

操作步驟如下:

1. 運行ildasm

ildasm是由微軟提供的.NET程序反編譯工具,位於“C:Program FilesMicrosoft SDKsWindowsv7.0Ain”。

2. 用ildasm打開要修改的程序集,如下圖:

3. 通過ildasm保存爲IL文件

選擇菜單File>Dump,選擇UTF-8編碼,如下圖:

4. 用文本編輯器打開第3步中得到的.il文件,如下圖:

5. 修改.il文件中的代碼並保存

6. 用ilasm(MSIL彙編程序)將.il文件編譯爲.dll文件

ilasm位於相應的.NET Framework目錄中,比如:C:WindowsMicrosoft.NETFrameworkv2.0.50727ilasm.exe

在命令行中執行下面的命令:

ilasm 源文件.il /output=目標文件.dll /dll

7. 完成。


參考文章2

http://kb.cnblogs.com/page/101162/

這段時間爲跟蹤一個Bug而焦頭爛額,最後發現是Framework的問題,這讓人多少有些絕望。所以到微軟論壇提了個帖子,希望能得到些幫助。雖然論壇智能到能夠判斷樓主是否是MSDN訂閱用戶,以便儘快解決(傳說MSDN訂閱用戶的問題能在兩天內得到回覆的,當時還很得意公司爲我們購買的MSDN訂閱賬號),但得到的回覆是“Could you file a bug report for this issue through Connect?”,絕望之後的又一次寒心啊。

  看過payeasy的廣告之後,便有了以下的這些內容,如何修改.net framework: 

  這裏我們以修改Guid類爲例,我們將修改這個類的內部構造,以便其始終構造值爲0值(00000000-0000-0000-000000000000)的對象

  1,知道你要修改誰(dll的名稱)
  這很簡單, 翻翻MSDN,你應該能找到你所調用的類庫是哪一個,或者使用reflector可以得到更詳盡的信息。從MSDN得知,Guid類在mscorlib.dll中

  2,找到你要修改的dll,並拷貝出來,以便修改
  mscorlib.dll位於GAC中,很可惜,windows只允許按照“可遠觀不可褻玩"的方式靜靜欣賞(儘管心急如焚)

  我們現在需要將該dll在操作系統中的實際路徑找出來。
  2.1 下載FileMon,其用於監視文件的被訪問情況,我們可以通過他,找到文件路徑。
  2.2  寫一個小程序,讓該程序去訪問(引用)你需要查找路徑的文件,這裏也就是我們的mscorlib。

        static void Main(string[] args)
        {
            Guid guid = Guid.New
Guid();
            Console.WriteLine(guid);
            Console.Read();
        }

  代碼中的Guid以及Console等都會訪問mscorlib.dll。
      2.3 運行FileMon,讓他去監視mscorlib的訪問,由於我們不知道mscorlib的具體路徑(廢話),但我們至少知道它在C:\WINDOWS\assembly下(至少知道在系統盤下),那麼我們就將這個文件夾及其所有文件一塊監視吧: 

  2.4,運行我們的小程序,FileMon將監視到所有到C:\WINDOWS\assembly下的訪問,並將包含mscorlib的高亮,雙擊列表中的條目,其將自動打開文件所在的文件夾:

  OK,現在找到該dll文件了,將其拷貝出來,以供我們修改,並將其路徑記錄下來以備將來使用(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089)。另外,建議備份一下拷出來的dll。

  3,利用ildasm反編譯該dll,生成中間語言(IL)文件,我們將修改該IL文件
  ildasm是.net自帶的一個反編譯工具,可以在SDK(C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\)中找到,但通過VS的控制檯便可以使用了(具體使用方式,參考MSDN

  然後可以得到該程序集的IL文件:

  它其實是一個文本文件,所以可以直接打開進行編輯,但建議使用Notepad++或 UltraEdit文本編輯器,但打開後似乎有些讓人有些崩潰,汪洋大海啊,如何找到我們需要修改的代碼所在的位置呢

  4,利用reflector查看所要尋找的類或方法的定義
  打開reflector,查找所要尋找的類或方法,並查看其定義,假設我們需要的是Guid.NewGuid()方法:

  切換到IL視圖:
 
  OK,有了該IL片段,要在mscorlib.dll.il的汪洋大海中查找該方法就很簡單了(Ctrl-F)。

  5,修改IL代碼
  在notepad++或UltraEdit中找到對應的方法。我們發現NewGuid()實際是調用其Guid(bool)方法,我們可以將其替換成默認構造函數(默認構造函數構造的guid爲00000000-0000-0000-000000000000)這樣一來調用NewGuid()方法時則始終返回0值了,也可以在調用Guid(bool)時傳入true,我們採用後者:

  .method public hidebysig static valuetype System.Guid 
          NewGuid() 
cil managed
  {
    
// 代碼大小       7 (0x7)
    .maxstack  8
    
IL_0000:  ldc.i4.0
    
IL_0001:  newobj     instance void System.Guid::.ctor(bool)
    
IL_0006:  ret
  } 
// end of method Guid::NewGuid

  上面代碼中的IL_0000:  ldc.i4.0 表示將0(false)作爲4字節整數入棧,我們將其中的0改成1:

  .method public hidebysig static valuetype System.Guid 
          NewGuid() 
cil managed
  {
    
// 代碼大小       7 (0x7)
    .maxstack  8
    
IL_0000:  ldc.i4.1
    
IL_0001:  newobj     instance void System.Guid::.ctor(bool)
    
IL_0006:  ret
  } 
// end of method Guid::NewGuid

   (注意,這裏的操作很簡單,所以很單純地修改了,若對於比較複雜的操作請先學習IL相關知識
  然後保存你的修改。

  6,編譯IL代碼,生成新的DLL
  利用ms提供的ilasm可以將IL文件編譯成dll:
   (編譯前別忘記關閉文本編輯器,比如ultraEdit會獨佔文件而導致無法訪問)

  7,將修改後的DLL放回到GAC 
  你可能會想到按照MSDN上提到的方法就如同安裝自己普通的程序集一樣將其安裝到GAC,大概能猜想到這是不可行的,否則”不安全了“。 或者,我們剛纔不是記錄了mscorlib的路徑的嗎,直接複製粘貼進去覆蓋不就行了,也許可以,也許不可以,只所以說不可以,原因有可能有二,一是根本不讓訪問頁不讓覆蓋,二是程序.net程序運行時會檢查程序集版本。那麼就試試看吧:
  直接訪問指定的路徑看來是不行的了,正如下圖所示:

  不過沒關係,我們可以通過第三方工具訪問到該目錄,可以通過剛纔的FileMon,雙擊條目可以打開相應的文件目錄,還有一種更常用的方便的方式是用TotalCommander, 可以方便的訪問windows的各種隱藏路徑。

  將文件拖放到對應目錄便可以覆蓋了。

  8, 刪除程序集的本機映像(native image)
  回到剛纔用FileMon監視mscorlib訪問時,大家可能會發現我們的小程序直接訪問的並非mscorlib.dll, 而是一個名爲mscorlib.ni.dll的文件(在C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\9adb89fa22fd5b4ce433b5aca7fb1b07\ 路徑下),這是mscorlib.dll的本機映像(native image),關心過.net優化的朋友應該會知道我們可以通過ngen來將程序集生成本機映像以提高運行速度。那麼程序將直接去訪問該映像而非我們修改過的mscorlib.dll,這會導致我們的修改看不到效果。所以我們要將該映像刪除。爲什麼是刪除,而不是將修改過的mscorlib.dll利用ngen來生成一個新的映像而覆蓋之? 原因很簡單,大家自己想想吧。
首先,利用 ngen uninstall 命令從本機映像緩存中卸載本地映像,然後利用TotalCommander將其刪除(注意,先關閉可以對所覆蓋的程序集有所引用的應用程序,最好重啓一下電腦,應該不用進安全模式刪那麼費勁)

  9,驗證一下成果:

    class Program
    {
        static 
void Main(string[] args)
        {
            Guid guid1 = Guid.NewGuid();
            Guid guid2 = Guid.NewGuid();

            Console.WriteLine(
"the first  GUID: {0}", guid1);
            Console.WriteLine(
"the second GUID: {0}", guid2);

            Console.Read();
        }
     }

  如果使用MS原版的mscorlib.dll我們將得到類似於下面的輸出:   使用我們修改過的mscorlib.dll:

  (另外,值得注意的是,Visual studio對某些程序集的引用來自於C:\Program Files\Reference Assemblies 下,所以,對於某些程序集如果要對VS引用造成影響則應該覆蓋C:\Program Files\Reference Assemblies下的對應文件。這裏的mscorlib不需要)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章