在去年九月份的時(shí)候,我分享了幾款反編譯工具,里面提到了dnSpy,但是實(shí)際上,我?guī)缀鯖]怎么用過它,只是在Github上大概看了一下,知道它很強(qiáng)大,能夠反編譯、調(diào)試、編輯C# DLL。直到前兩天,我分享了一下用ILspy
配合reflexil
修改現(xiàn)有.net DLL里面的常量參數(shù),這時(shí)有友友再次提到dnSpy
,這才使我想起了它,決定趁這次機(jī)會(huì)學(xué)習(xí)一下,領(lǐng)略一番神器的風(fēng)采。
dnSpy
在Github的熱度還是很高的,已經(jīng)達(dá)到了19k Star
,它整合了眾多強(qiáng)大的開源工具:
ILSpy decompiler engine (C# and Visual Basic decompilers)
Roslyn (C# and Visual Basic compilers)
dnlib (.NET metadata reader/writer which can also read obfuscated assemblies)
VS MEF (Faster MEF equals faster startup)
ClrMD (Access to lower level debugging info not provided by the CorDebug API)
Iced (x86/x64 disassembler)
有了這些開源工具,使dnSpy
變得非常強(qiáng)大。
目前release
為2020年12月8日更新的V6.1.8
。接下來進(jìn)入主題,我們今天依然只是編輯DLL,這里我是下載的dnSpy-net-win64.zip。
解壓后雙擊dnSpy.exe
,會(huì)彈出類似VS的界面。
前面我用ILspy
和reflexil
來修改DLL里面的超時(shí)時(shí)間,這回借助dnSpy
神器來嘗試修改一下,直接將DLL拖拽到dnSpy。
,找到需要修改的位置,右鍵
->編輯IL指令
把1000
改為120000
后,點(diǎn)擊確定
即可在代碼界面看到我們剛才修改后的值。
此時(shí),點(diǎn)擊文件
->保存模塊
,便可保存修改后的DLL。
整個(gè)過程操作起來,確實(shí)比ILspy
配合reflexil
這個(gè)組合要方便得多。據(jù)說dnSpy
還可以調(diào)試,我們來試試看,這里我創(chuàng)建一個(gè)簡單的窗體程序,拖拽一個(gè)按鈕,添加一個(gè)點(diǎn)擊事件。
我們發(fā)布編譯一下。
這里把剛才生成的DLL拖拽到dnSpy
中。
點(diǎn)擊啟動(dòng),會(huì)彈出一個(gè)對(duì)話框,先默認(rèn)即可,點(diǎn)擊對(duì)話框確定
,便會(huì)啟動(dòng)我們的程序。
我們?cè)?/span>dnSpy
加上斷點(diǎn)來假巴意思調(diào)試一下??梢钥吹?,當(dāng)我們點(diǎn)擊按鈕時(shí),會(huì)暫定到剛才打斷點(diǎn)的位置,點(diǎn)擊繼續(xù),讓整個(gè)流程走完。
現(xiàn)在我們來修改一下點(diǎn)擊事件。
這里我們新加入一個(gè)變量,用于累加點(diǎn)擊次數(shù)。
可以看到,dnSpy
會(huì)提供類似VS的智能提示,完成后,點(diǎn)擊右下角的編譯,編譯器會(huì)自動(dòng)為我們優(yōu)化代碼,dnSpy
會(huì)實(shí)時(shí)更新我們修改后的代碼,我們先把修改后的代碼保存一下,然后點(diǎn)擊原來的exe程序。
該文章在 2023/8/8 11:38:52 編輯過