Reflector反編譯.NET文件后修復


 談到"C#代碼反編譯",大家可能都會想到 Reflector代碼反編譯工具,對其應該也不會太陌生;做C#開發,它算得上是一個不可或缺的實用工具。通過它我們可以很方便的查看一個程序集的源代碼(這是其最基本的使用,也是大家常用的),還可以方便破解軟件...,而我這篇文章要跟大家分享的是:用Reflector將C#的開發的軟件[項目](此文中所說的是winForm項目,對於.net項目可以借鑒或參考)的項目代碼還原——反編譯得到可運行項目源碼。 我所做的反編譯,並不是'破解',其使用的前提或情況是:公司原來請人開發的'配餐軟件(幼兒園版)',現有客戶咨詢想買,並且軟件中存在一些問題需改,——不是本人開發的,該軟件也無源碼,想修改只能想辦法得到軟件的源碼。具體的'破解'方法記錄在下,方便自己以后查看!(ps: '破解'的方法,自己之前就摸索過。但困於反編譯之后的error比較多,沒有耐心,有的問題感覺比較離奇,試了幾次不行就放棄了  ——這就間接的說明:真正的黑客,應該都是比較有耐心的,呵呵..., 但做軟件開發,又何嘗不需要這樣?!)

     a.使用到的工具:Reflector,具體的說是:Reflector插件File disassembler(具體是什么和how to use,直接上網查)。

     b. 打開Reflector,選擇要'破解'的軟件(.exe)主程序,再選擇並點擊 如圖: , 在右側出現的 程序集(輸出)類型選擇界面 選擇類型'windows Appliction' (因為是winForm應用程序,如果是選擇的其它 如'class ...'類庫,則需要在之后的步驟中,改變項目屬性中的 輸出類型,不建議這樣操作),如圖:

 點擊 生成 即可 得到此主程序集的源碼,其它的相關程序集再如此操作即可! ——不要以為大功告成,這只是第一步,麻煩的在后面!

    c.將生成的源碼 在Vs中打開(項目), 先試着運行下,(一般)會報錯,排除'xxx程序集不存在'這類的錯誤,我所遇到的如下:

  

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[CompilerGenerated]
internalclass<PrivateImplementationDetails>{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5}
{
internalstatic Dictionary<string, int> $$method0x600012e-1;
internalstatic Dictionary<string, int> $$method0x6000137-1;
internalstatic Dictionary<string, int> $$method0x6000137-2;
internalstatic Dictionary<string, int> $$method0x600014a-1;
internalstatic Dictionary<string, int> $$method0x6000169-1;
internalstatic Dictionary<string, int> $$method0x60001b6-1;
internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-1; // data size: 20 bytes
internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-2; // data size: 20 bytes
internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-3; // data size: 20 bytes
internalstatic __StaticArrayInitTypeSize=20 $$method0x6000213-4; // data size: 20 bytes

[StructLayout(LayoutKind.Explicit, Size=20, Pack=1)]
privatestruct __StaticArrayInitTypeSize=20
{
}
}

 



 源碼文件中會出現一個 _PrivateImplementationDetails_{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5}.cs 文件名很長 內容如上的 亂碼類,對此解決辦法時:注釋此類 或直接刪除。【程序相關的文件,如圖片、數據庫等要記得放到項目關聯位置,一般在bin/debug/文件夾下】

    d. 添加相關程序集的引用,設置啟動對象。到這兒,差不多程序就可以 跑起來了,但是還沒有完 ——因為 反編譯后的代碼,文件夾的位置和界面與資源引用之間的關聯,基本上都亂了.所以現在要解決的關鍵問題是:恢復文件間的關聯和引用(其它的問題,通過調試就差不多可以解決)。如圖:

   窗體的.cs和.resx(資源)文件不在同一個文件夾中,對應窗體的.resx文件都加上了項目或解決方案名前綴(zhiyiSystem.) ——This is point!  這就是我們要解決問題的關鍵:恢復窗體的.cs和.resx文件間的關聯,操作大致有以下兩步:1.將窗體的.cs和.resx文件放在同一個文件中——即同一目錄。2.去掉窗體的.resx文件的前綴 ——即修改文件名,如果是一個個文件去修改,窗體比較多的話,是一件非常重復而無聊的事,於是 就上網找 "批量修改文件名"的工具,下載了一兩個感覺都不好用,找不到,只能自己搞了,再說這東西簡單,說白了就是 遍歷文件夾中文件並'重命名'

反編譯后的工程文件用VS2010打開后,在打開窗體時會出現一系列錯誤提示:

第一種情況:

“設計器無法處理第 152 行的代碼: base.AutoScaleMode = AutoScaleMode.Font; 方法“InitializeComponent”內的代碼由設計器生成,不應手動修改。請移除任何更改,然后嘗試重新打開設計器”。

解決方法就是:對所有System.Windows.Forms.命名空間里面的控件需要全命名空間的聲明,例如里面上圖的base.AutoScaleMode = AutoScaleMode.Font;就要改成base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
第二種情況:

“變量“manager”未聲明或從未賦值。 ”

解決方法就是:本方法只限於在InitializeComponent中包含System.Resources.ResourceManager調用的窗體

1.資源文件格式轉換,將.resources(二進制)文件轉成.resx文件(XML)  用C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin下 resgen.exe  格式: resgen *.resources *.resx(.resx文件最好與窗體.cs文件同名)

2.將InitializeComponent方法中的對象manager替換為resources(沒錯,只替換變量名^_^,全部都換掉哦,最好的辦法就是更改manager的申明)

3.將資源文件.resx放到窗體文件.cs相同的文件夾下。

4.將所有窗體(.cs)從工程中排除,再添加(這樣可以省去將.resx文件映射到.csproj的過程)。

       到此,程序就可以真正跑起來了。別看我寫出來,似乎'破解'就是一會兒的事,但我做的時候,卻幾經折騰 好幾次都感覺"算了,又卡住了...",有些或大或小問題,在這里因為時間的原因 及有些步驟一時半會也想不起來了,但主要的方法應該都沒有落下,如果有不明白的朋友,可以留言交流,再做解答;也希望在'破解'方法有經驗的,能多提些意見,分享下你的‘破解’經驗!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM