天天看點

代碼安全之代碼混淆

作者:躺平攻城獅

防止核心代碼洩露以及代碼合并

每日辛辛苦苦碼的代碼被輕松破解?

機密核心子產品被盜用?

資料庫位址和語句暴露?

…… 這些都是由代碼未混淆加密,進而進行洩露的

我們目前DLL檔案存在的風險:

一、直接引用

二、反編譯

三、反射

如果DLL一點措施都不做的話,上面任意一種都可以達到破解目的的。

如果通過反編譯軟體:ILSpy、Reflector,輕而易舉,那相當于直接copy代碼了。

那麼要怎麼樣才能保護我們的代碼呢?

今天帶大家進入代碼的另一個世界,代碼混淆與DLL融合

目錄:

代碼安全之代碼混淆

01 混淆原理

反編譯軟體就是能讓你看到代碼,進行Copy使用,那怎麼讓它不能看,不能調呢。這個時候就需要說一說模糊處理。

模糊處理:意在引起混淆,實質上是将在代碼中找到的辨別符重命名為不可讀的内容。它們可能使用哈希技術,或者對字元集進行算術偏移,将字元變為不可讀字元或不可輸出字元。這些技術雖然表面上很有效,但是它們都是可逆的,是以很難起到保護作用。

代碼安全之代碼混淆

編譯原理

模糊處理這一過程應用于已編譯的 MSIL 代碼而不是應用于源代碼(源代碼不會不會被讀取和更改), 經過模糊處理的在功能上等同于你的源代碼,它在公共語言運作庫 (CLR) 上執行并産生與原始 MSIL 代碼相同的結果。(但是,它是不可逆的,即使通過反編譯和原始的源代碼相比,它在語義上也将有重大不同。)

Dotfuscator的定位

代碼安全已經演變出許多加密、加殼的軟體,如:PreEmptive ,它是得到Micorsoft和Sun公司的認可的以Java和.Net混淆器出名的公司,其中比較出名的軟體: PreEmptive Protection Dotfuscator

Dotfuscator工具,它使用很多其他頗具獨創性的 “ 引起混淆 ”的算法,使得代碼幾乎不能被反編譯(還是存在一定機率可逆,但代價太大,得不償失)。

代碼安全之代碼混淆

Dotfuscator工具主要使用模糊處理這種技術能夠對程式集中的符号、變量、字元串等進行無迹可尋的重命名,并提供很多其他手段,進而阻止進行反編譯。

Dotfuscator安裝

VS自帶混淆軟體:Dotfuscator,在VS2019前版本都會自動安裝,2019版本就需要手動安裝了,可搜尋: Dotfuscator,預計安裝10分鐘,安裝完成後,需要進行郵箱注冊才可以使用,但非正式版限制太多。

介紹的是一款破解版:DotfuscatorPro 4.9

安裝後使用時,它依賴.Net Framework 2.0和3.5,會進行第一次更新,需确認windows的自動更新服務是打開的

代碼安全之代碼混淆
代碼安全之代碼混淆
代碼安全之代碼混淆

DotfuscatorPro 4.9

02 如何對代碼加密

1、建立新的工程檔案。INPUT 選項裡 選擇你需要混淆加密的 DLL、EXE檔案:

2、進入Settings選項 –> 把 Disable String Encryption 設為 NO,即啟用字元串加密;
      檢查 Disable Control flow、Dsiable Renaming 也為 NO,即保證控制流和混淆功能打開,其他預設。
      
3、進入Rename-> Options選項 勾選“use enhanced overload induction”(使用增強模式),
      注意:不要勾選下方的“ Do not suppress on serializable types”,即序列化類型的變量不加密,否則編譯後可能異常;
      “Renaming Scheme” 選擇“Unprintable”(不可列印字元,即亂碼),也可以選擇其他如小寫字母、大寫字元、數字的方式
      
4、進入String Encryption 選項 include裡勾選需要字元串加密的工程檔案EXE、DLL等

5、轉入Output目錄,點選Build,檢視輸出結果為  Build Finshed 即為成功。
           
代碼安全之代碼混淆

操作步驟

提醒:編譯過程中可能提示會代碼架構為4.5及以上,需要手動配置編譯環境的路徑,在Settings ->Porjcet properties 設定編譯環境位址,如下圖:

代碼安全之代碼混淆

反編譯前後對比

Dotfuscator 可對代碼中的變量值進行模糊處理,大大增加閱讀難度,反編譯出來的代碼也如混淆後的代碼

代碼安全之代碼混淆

混淆前後對比

甚至連exe檔案都能執行模糊處理

代碼安全之代碼混淆

混淆前後對比

03 代碼融合

有時系統中我們關聯了太多第三方DLL,以及自身建了多個類庫,等到系統釋出時發現DLL檔案有幾十個,實在太誇張。萬一丢掉一個未複制, 整個程式都無法運作。

微軟推出一款ILMerge打包合并工具,它可以将程式集合并到一個目标程式集中。輸入程式集清單中的第一個程式集是主程式集。當主程式集是可執行檔案時,目标程式集将建立為具有與主程式集相同的入口點的可執行檔案。此外,如果主程式集具有強名稱,并且提供了.snk檔案,則使用指定的鍵重新簽名目标程式集,以使其具有強名稱。

它是指令行形式運作:

1、打開cmd,轉至安裝目錄(最好是以管理者權限運作)
2、ILMerge.exe /targetplatform:v4,“.NETFramework安裝目錄” /target:winexe /union /xmldocs /copyattrs /allowMultiple /internalize /closed /ndebug /out:“新檔案” /log “dll1” “dll2” /log:“日志目錄”

參數說明:
/targetplatform 輸出檔案的.net運作版本
/target 生成的檔案,winexe應用程式,library DLL檔案
/closed 排除引用檔案互相引用
/log 需要合并的DLL或EXE,需要把所有的合并的EXE或DLL囊括進來
/ndebug 為非調試版本,即釋出版本,如果去掉,将會生成.pdb拓展名的調試檔案
/log 日志,可以不加           

提醒:要內建的程式最好是release過的,不然會出一些莫名其妙的問題。

圖形界面

我們找到一款圖形化界面,可以輕松合并

代碼安全之代碼混淆

圖形工具

代碼安全之代碼混淆

合并後的反編譯

圖形界面使用: https://jingyan.baidu.com/article/59a015e3204d87f794886529.html

那看到這裡,抛出2個問題,供大家讨論:

1、打包工具還能做什麼呢?

2、混淆加密後真的安全?

上一篇:代碼安全之檔案上傳漏洞 下一篇:代碼安全之漏洞掃描

繼續閱讀