談到"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檔案的首碼 ——即修改檔案名稱,如果是一個個檔案去修改,表單比較多的話,是一件非常重複而無聊的事,於是 就上網找 "批量修改檔案名稱"的工具,下載了一兩個感覺都不好用,找不到,只能自己搞了,再說這東西簡單,說白了就是 遍曆檔案夾中檔案並'重新命名'(代碼就不貼出了,文章後 附有 自己寫的 "批量修改檔案名稱"工具)。
到此,程式就可以真正跑起來了。別看我寫出來,似乎'破解'就是一會兒的事,但我做的時候,卻幾經折騰 好幾次都感覺"算了,又卡住了...",有些或大或小問題,在這裡因為時間的原因 及有些步驟一時半會也想不起來了,但主要的方法應該都沒有落下,如果有不明白的朋友,可以留言交流,再做解答;也希望在'破解'方法有經驗的,能多提些意見,分享下你的‘破解’經驗!
後附:
批量修改檔案名稱工具.rar
(Reflector外掛程式)Reflector.FileDisassembler.rar