利用反組譯工具修改 .Net 程式

第一次嘗試解開程式的限制,將操作過程記錄下來,日後方便參考。使用到的工具有 de4dot (去混淆工具)、dnSpy (反組譯編輯工具)。原本還會用到 .Net Reflector9.0 + Reflexil2.1(搜尋字串工具),但後來發現 dnSpy 功能已經足夠強大,所以就不需要使用 .Net Reflector 9.0。

先將程式去混淆

並不是每隻程都需要進行這個步驟。可以先利用 dnSpy 開啟程式,查詢看看要修改的目標,通常都是找到片段資料而已。這就表示程式已經被加入混淆,此時就得使用 de4dot 的功能。

de4dot 可以在 https://github.com/0xd4d/de4dot/releases 下載得到原始碼,取得後還得自行使用 Visual Studio 編譯;覺得麻煩也可以找看看有沒有人已經編譯好的程式。但需要小心的是別人已經編譯好的程式,是否帶有木馬或是病毒。

使用方式不困難,只要把目標程式和 de4dot 放在相同目錄下,再執行

de4dot -f source_file -o result_file –dont-rename

因為 de4dot 預設會修改程式內部的 Method 名稱,為了不造成更多的問題,需要在執行時加入 –dont-rename 的參數。而且在執行過後可以發現,檔案的大小縮減快 50%。

編輯程式

如果有進行去混淆步驟,記得要將程式再複製 (移動) 回原本的目錄;在載入 dnSpy 時,才會將相關聯的程式(DLL) 一起載入。

直接利用搜尋功能,找到相要修改的程式碼。

利用右鍵內的 Analyze 功能,分析這個 Method 在哪些地方有使用到。

找到之後,逐一清掉 Used By 內的程式片段。

首先,調閱出相關程式片段;直接在程式片段上右鍵,找到 Edit IL Instructions …

接著就是要修改或是刪除這此 Binary Codes,直接將程式幫我們抓取到的範圍,設定成 NOP (意指 No Operation Performed)。設定完成後,按下 OK,即完成修改。

這個畫面就是按下 NOP 後的結果。

回到程式碼內,可以發現,原本 1174 行的相關指令,已經被刪除了。

最後,再選擇 Save Module 的方式,就能完成修改。

這樣子的修改就一定會成功嗎?

不見得,以這次的例子來說,雖然做了這麼多的修改,最後還是失敗。只是將這個失敗的經驗記錄下來,日後有空再研究。

.Net deobfuscator and unpacker (de4dot) (12 downloads) .NET debugger and assembly editor (11 downloads)

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *