Dotfuscator針對C#程式碼混淆方法總結
前言:
C#編寫的程式碼如果不進行一定程度的混淆和加密,那麼是非常容易被反編譯進行破解的,特別是對於一些商業用途的C#軟體來說,因為盯著的人多,更是極易被攻破。現今很多用C#編寫的專案,做出的產品,都會遇到這種情況:C#的程式碼辛辛苦苦寫出來之後,一個反射工具,就可以完全顯露出來,這樣會是個什麼結果,不說被反射出來照搬功能,就是註冊和加密的那一部分都會被輕易拿到,所以就必須使用程式碼混淆器。
C#的程式碼混淆器有很多了,比如Dotfuscator、xeoncode、foxit等等。這些混淆器大多是需要注意的,使用效果各不相同。普通的程式碼混淆器只是把私有欄位和變數轉換成隨機碼,如果是小程式,還可以猜一猜,如果是比較大的程式,猜起來可就不會那容易了。高階一點的是混淆成不可閱讀的字元,這樣的混淆後的程式碼乾脆就比機器碼還難懂,基本上是翻譯不出來了。但這些程式碼混淆器都有一定的風險,即混淆後的程式碼實然無法正常呼叫了。
這裡介紹的是DotfuscatorPro_4.9.7750版本,安裝 Dotfuscator 好 開啟介面,有幾個需要配置的地方: Options、Input、Rename、String Encryption、Build,其他的預設即可,下面一一講解。
-
Settings->Global Options
這是全域性配置選項,把 Disable String Encryption 設為 NO,即啟用字串加密;檢查 Disable Control flow、Dsiable Renaming 也為 NO,即保證控制流和混淆功能開啟,其他預設。如下圖:
-
Input 選項
選擇你需要混淆加密的 dll、exe檔案,其中Library不要勾選,否則有些類、變數等等不會混淆。
-
Rename 選項
勾選“use enhanced overload induction”(使用增強模式),注意:不要勾選下方的“ Do not suppress on serializable types”,即序列化型別的變數不加密,否則編譯後可能異常; “Renaming Scheme” 選擇“Unprintable”(不可列印字元,即亂碼),也可以選擇其他如小寫字母、大寫字元、數字的方式。
-
String Encryption 選項
include裡勾選需要字串加密的工程檔案exe、dll等。
-
Settings->Build Settings 選項
設定輸出目標資料夾,點選上方的執行按鈕即可重新生成新的 exe、dll檔案了。
接下來來看一下一段簡單的C#程式碼加密混淆後的效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using
System; using
System.Collections.Generic; using
System.Linq; using
System.Text; namespace
ConsoleApplication1 { class
Program { static
readonly
int
A = B * 10; static
readonly
int
B = 10; //const
int A = B * 10; //const
int B = 10; public
static
void
Main( string []
args) { Person
p = new
Person(); Console.WriteLine( "A
is {0},B is {1} " ,
A, B); } } public
class
Person { static
int
age; } } |
使用Dotfuscator進行程式碼混淆後 我們使用著名的反編譯軟體 Reflector 來檢視,可以發現函式體內的程式碼已經看不到了,字串也變成了亂碼,函式名稱也不可見了,效果圖如下:
總結:
Dotfuscator作為一款程式碼混淆的軟體,具有很強的反編譯功能,但使用時應注意以下幾點:
- 如果你加密的dll、exe裡有public類,需要被外部引用的話,那麼引用這個public的相關dll、exe也要一起放到Dotfuscator Input 裡,同時進行混淆加密,不然外部呼叫出錯。
- 如果有public類,但是你不想照著第1點的方式做的話,可以勾選 Library 模式(input 裡 展開專案,見下圖),或者不選擇 rename 選項,僅僅用 control flow 混淆(該種方式下會看見類名、函式名,但是看不到函式體)。
- 如果有public類,但是你也不想按照我的第一點、第二點的方法做的話,可以在rename選項裡排除這些public的類名、方法名、屬性名即可:使用 rename exclude 裡左側排除專案,或 右側 正則排除方法。
當然如果你編寫的軟體不涉及商業用途的話,本著開源的思想,不推薦使用程式碼混淆器。使用程式碼混淆器存在一定的風險,在使用前最好做好相關程式碼備份。
相關文章
- 程式碼混淆軟體 DotFuscator 非常嚴重的問題,放在首頁通知一下各位。
- Flutter 程式碼混淆 混淆Dart程式碼FlutterDart
- 對.net 程式進行原始碼混淆原始碼
- c#程式碼優化總結1C#優化
- 【程式碼混淆】react-native 程式碼混淆React
- 程式碼混淆的原理和方法詳解
- JS混淆程式碼資料集構建方法JS
- 保護C#程式碼的藝術:深入淺出程式碼混淆技術C#
- C#讀取Excel方法總結C#Excel
- ios加固,ios程式碼混淆,ios程式碼混淆工具, iOS原始碼混淆使用說明詳解iOS原始碼
- Android程式碼混淆&元件化混淆方案Android元件化
- 結對程式設計總結程式設計
- 鴻蒙程式碼配置混淆鴻蒙
- Android程式碼混淆Android
- iOS安全/程式碼混淆iOS
- android混淆總結(基礎版)Android
- Python程式碼混淆工具,Python原始碼保密、加密、混淆Python原始碼加密
- C#中常用的ToString()方法總結C#
- 程式碼混淆工具ipaguard:如何使用ipaguard保護和混淆iOS應用程式程式碼iOS
- 程式碼混淆與反混淆學習-第二彈
- powershell程式碼混淆繞過
- 前端程式碼安全與混淆前端
- iOS 初探程式碼混淆(OC)iOS
- 程式碼混淆的規則
- MySQL 常用易混淆知識點總結MySql
- c#實現的破解程式--針對軟體使用時間限制C#
- 如何進行程式碼混淆?方法與常見工具介紹行程
- 各種排序演算法總結及C#程式碼實現排序演算法C#
- DDD領域驅動設計總結和C#程式碼示例C#
- Nginx常見錯誤程式碼總結和分析方法Nginx
- C++程式碼最佳化方法總結(一) (轉)C++
- C++程式碼最佳化方法總結(四) (轉)C++
- C++程式碼最佳化方法總結(三) (轉)C++
- C++程式碼最佳化方法總結(二) (轉)C++
- .Net下C#針對Excel開發控制元件彙總(ClosedXML,EPPlus,NPOI)C#Excel控制元件XML
- C#獲取根目錄的方法總結C#
- 針對負載均衡叢集中的session解決方案的總結負載Session
- 針對neumann邊界條件的差分法程式碼