張果
摘 要:本文通過編寫簡(jiǎn)單的可執(zhí)行程序,引用兩個(gè)不同語言編寫的DLL。然后再進(jìn)行反編譯DLL,在可執(zhí)行文件中重新引用,實(shí)現(xiàn)DLL反編譯成功被程序多次引用的效果。
關(guān)鍵詞:可執(zhí)行程序;動(dòng)態(tài)鏈接庫;編譯;反編譯
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1671-2064(2019)11-0019-02
可執(zhí)行程序,是可自行解壓縮文件的集合,包括安裝的所有文件。運(yùn)行可執(zhí)行文件,可將軟件的所有文件釋放到硬盤上,完成修改注冊(cè)表,修改系統(tǒng)設(shè)置、創(chuàng)建快捷方式等工作。在Windows中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對(duì)獨(dú)立的動(dòng)態(tài)鏈接庫(DLL文件),放置于系統(tǒng)中。
DLL中存放各類程序的函數(shù)(子過程)實(shí)現(xiàn)過程,當(dāng)程序需要調(diào)用函數(shù)時(shí)需要先載入DLL,取得函數(shù)的地址,最后相應(yīng)的DLL會(huì)被調(diào)用。使用DLL的好處是程序不需要在運(yùn)行之初加載所有代碼,且通過使用DLL,程序可實(shí)現(xiàn)模塊化,由相對(duì)獨(dú)立的組件組成。DLL有助于促進(jìn)模塊式程序的開發(fā),可開發(fā)進(jìn)行模塊式體系結(jié)構(gòu)的程序,因此在重復(fù)使用DLL時(shí),研究將DLL如何進(jìn)行反編譯重復(fù)利用顯得特別重要。
本文基于ASP.NET技術(shù),.NET Framework框架,Visual studio 2010 集成環(huán)境,C#和Visual Basic語言進(jìn)行開發(fā)。
1 動(dòng)態(tài)鏈接庫(DLL)實(shí)現(xiàn)
文中C#類實(shí)現(xiàn)的DLL功能為圖像色彩反轉(zhuǎn)方法和獲取系統(tǒng)當(dāng)前時(shí)間方法,Visual Basic實(shí)現(xiàn)的是將輸入的原字符串進(jìn)行逆序的方法和將原字符串進(jìn)行大寫轉(zhuǎn)換的方法。
1.1 DLL開發(fā)過程
本地打開Visual studio 2010,選擇新建項(xiàng)目,選擇Visual C#,選擇.NET Framework 4.0框架,選擇類庫,生成相應(yīng)的解決方案,打開類,編寫該DLL所要實(shí)現(xiàn)的功能。因本文著重實(shí)現(xiàn)如何編寫DLL,如何在應(yīng)用程序中引用DLL,然后反編譯DLL,驗(yàn)證再次被應(yīng)用程序引用是否成功,因此,DLL功能及應(yīng)用程序功能相對(duì)簡(jiǎn)單。
1.2 生成DLL
DLL功能編寫完成后,選擇Visual Studio工具欄中的生成,選擇其下的生成解決方案,在該解決方案的Debug目錄下可以找到生成的DLL,該DLL可被應(yīng)用程序直接引用。
2 可執(zhí)行程序?qū)崿F(xiàn)
可執(zhí)行程序引用DLL的方法,將系統(tǒng)時(shí)間、圖像色彩反轉(zhuǎn)、字符串逆序通過界面展示出來。
2.1 開發(fā)過程
本地打開Visual Studio 2010,新建項(xiàng)目,選擇Visual C#語言,選擇Windows窗體應(yīng)用程序,.NET Framework 4.0框架,確定,解決方案建立成功,引用之前已生成的兩個(gè)DLL。
新建Form1,F(xiàn)orm2兩個(gè)設(shè)計(jì)窗口,界面化實(shí)現(xiàn)兩個(gè)dll功能,在后臺(tái)cs代碼中引用命名空間using CsharpDll;using VBasicDll。界面如圖1所示。
運(yùn)行可執(zhí)行程序,界面能夠正確顯示當(dāng)前系統(tǒng)時(shí)間、圖片顏色反轉(zhuǎn)及字符串逆序的功能,界面如圖2所示。
2.2 程序發(fā)布
應(yīng)用程序通運(yùn)行測(cè)試功能正確顯示,將該應(yīng)用程序發(fā)布為可執(zhí)行的應(yīng)用程序,安裝在個(gè)人計(jì)算機(jī)上。應(yīng)用程序發(fā)布主要分以下幾個(gè)步驟:
(1)在VS中選擇“新建項(xiàng)目”(“其他項(xiàng)目類型”(“Visual Studio Installer”(“安裝項(xiàng)目”。(2)確定后,添加要發(fā)布的應(yīng)用程序、設(shè)置應(yīng)用程序的安裝時(shí)所必備的系統(tǒng)環(huán)境、設(shè)置程序安裝時(shí)的路徑及其他信息。(3)應(yīng)用程序發(fā)布基本設(shè)置完成之后,選擇“生成”(“生成解決方案”,若成功,則顯示生成成功,成功生成解決方案后在debug文件夾中有需要的安裝包及系統(tǒng)所必備的環(huán)境下載,到此應(yīng)用程序發(fā)布完成。
3 DLL反編譯
應(yīng)用程序引用的DLL,經(jīng)過一段時(shí)間后,不能清晰記憶該DLL中所包含的方法,因此需要將DLL進(jìn)行反編譯。本文針對(duì).NET程序且程序沒有使用混淆技術(shù)的情況下,使用Reflector將.NET程序集中的中間語言反編譯成C#或者Visual Basic代碼。
3.1 反編譯代碼實(shí)現(xiàn)
Reflector工具安裝完成后,選擇我們反編譯后的語言為C#,.NET框架為.NET 4.0。
在File菜單下選擇“open assembley”,選擇需要反編譯的DLL,加載后顯示DLL中命名空間、類及方法的層級(jí)關(guān)系,也可直接雙擊打開查看方法。選中要導(dǎo)出的DLL,選擇“Export Source Code”,將源代碼導(dǎo)出到默認(rèn)的目錄,若導(dǎo)出成功,則會(huì)有相應(yīng)的提示。
反編譯成功后,打開生成的項(xiàng)目文件,可以看到不管是C#語言還是Visual Basic語言,都按照Reflector所配置的導(dǎo)出語言C#生成。將導(dǎo)出的項(xiàng)目文件使用Visual Studio 2010打開,C#語言反編譯前后與源碼一樣,Visual Basic語言反編譯后按照C#語言語義進(jìn)行了重組。Visual Basic反編譯前后代碼對(duì)照如圖3所示。
3.2 可執(zhí)行程序重引用反編譯DLL
將DLL反編譯后的類文件編輯再重新生成DLL,在可執(zhí)行程序中重引用后,運(yùn)行可執(zhí)行程序,可得到正確的效果,在反編譯后的DLL中,加入了顯示當(dāng)天星期的方法和將字符轉(zhuǎn)換為大寫的方法。界面如圖4所示。
至此,編譯DLL,引用DLL,反編譯DLL及被重新引用這一過程全部實(shí)現(xiàn),并得到驗(yàn)證,可執(zhí)行程序運(yùn)行后顯示正確結(jié)果。
4 結(jié)語
本文以.NET Framework為框架,以Visual Studio2010為開發(fā)環(huán)境,分別采用Visual c#和Visual Basic為開發(fā)語言。編寫簡(jiǎn)單的類庫生成DLL,編寫簡(jiǎn)單的可執(zhí)行程序,該可執(zhí)行程序中調(diào)用DLL,再通過Reflector工具反編譯DLL,反編譯的DLL生成的源碼使用Visual Studio2010打開重新編輯,生成相應(yīng)的DLL,在可執(zhí)行程序中再次引用的時(shí)候,該反編譯后的DLL能被正確引用,得到相應(yīng)的結(jié)果。
本文驗(yàn)證了Reflector工具能夠反編譯DLL,且能再次被可執(zhí)行應(yīng)用程序正確引用,但該Reflector工具只針對(duì).NET Framework框架開發(fā)的DLL,對(duì)其他框架的類及DLL不適用。后續(xù)查找及研究實(shí)現(xiàn)一款能對(duì)其他框架開發(fā)的DLL反編譯工具,并學(xué)習(xí)其他框架開發(fā)工具對(duì)反編譯的DLL進(jìn)行驗(yàn)證。
參考文獻(xiàn)
[1] Christian Nagel,Jay Glynn,Morgan Skinner.C#高級(jí)編程第八版[M].北京:清華大學(xué)出版社,2013.
[2] Benjamin Perkins,Jacob Vibe Hammer.深入理解C#第三版[M].北京:人民郵電出版社,2014.
[3] Daniel M.Solis.圖靈程序設(shè)計(jì)叢書:C#圖解教程第四版[M].北京:人民郵電出版社,2013.