模糊:让你的代码远离偷窥之眼
生活随笔
收集整理的這篇文章主要介紹了
模糊:让你的代码远离偷窥之眼
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| 來源:? 作者:仙人掌工作室 | ? |
對于商品軟件的開發者,高質量的反編譯代碼帶來了很大的風險:算法可能被竊取和改造,程序代碼可能被復制和更改。(即使單位內部使用的非商品軟件,由于反編譯造成的源代碼泄漏也帶來很大的威脅。例如,用戶將很容易看到訪問數據庫的密碼或程序嵌入的SQL命令。同樣地,使用外單位托管服務器的網站也面臨風險,一旦上載了ASP.NET應用的代碼,托管單位的人就可能隨意查看和更改程序代碼)。
更讓人擔心的是,現在黑客或好奇的用戶能夠方便地得到各種反向工程工具。Microsoft本身就免費提供了一個MSIL反匯編器,稱為ILDASM;這里有一個源代碼開放的.NET反編譯工具Anakrino;當然,還有其他許多廠商提供了商品化的反向工程工具。
一、修改變量名稱
為防止這類反向工程的威脅,最有效的辦法是模糊。(據《美國傳統辭典》,“模糊”的意思是“使混亂,使糊涂迷惑,使過于混亂或模糊,使得難于感覺或理解”)。模糊工具運用各種手段達到這一目標,但主要的途徑是讓變量名字不再具有指示其作用的能力、加密字符串和文字、插入各種欺騙指令使反編譯得到的代碼不可再編譯。
一個即將發布的Visual Studio版本(稱為VS.NET 2003,代碼名稱Everett)將集成一個模糊工具,Microsoft建議用這個工具對.NET中間代碼進行最后的處理。這個模糊器是另一個工具Dotfuscator的所謂Lite版。由Preemptive Solutions公司出品的Dotfuscator功能更強大,這家位于美國俄亥俄州東北部克利夫蘭的公司最初開發Java代碼的模糊技術。Dotfuscator模糊器利用一系列卓越的技術使反向工程徒勞無功,或者至少說使得反向工程很難進行。
Preemptive Solutions公司給它修改中間代碼中變量名稱的專利技術取了一個叫“超載感應”(Overload induction)的名稱,VS.NET 2003帶來的Lite版只有這種模糊功能。(模糊器永遠不會改動原始的源代碼,甚至根本不需要用源代碼作為參考。)這種技術充分運用了VS.NET代碼的特點:同一個標識符可同時運用于具有不同特征的類和方法;在不同的名稱空間中,變量可以有相同的名字而不會沖突。
Dotfuscator充分運用VS.NET這些符號學上的特點,把盡可能多的符號改成字母“A”。據該公司說,某些代碼大約有33%的引用可以改成“A”,還有10%可以改成“B”。經過模糊器這一處理,反向工程得到的代碼將很難理解。下面來看一個例子。
對未經模糊處理的代碼執行反向工程:
| private void CalcPayroll(SpecialList employeeGroup) {while (employeeGroup.HasMore()) {employee = employeeGroup.GetNext(true);employee.updateSalary();DistributeCheck(employee);} } |
同樣的代碼,經過模糊處理再執行反向工程:
| private void a(a b) {while (b.a()) {a = b.a(true);a.a();a(a);} } |
顯然,兩段代碼的處理邏輯相同。但是,要說清楚第二段代碼到底在做些什么極其困難,甚至要判斷它正在訪問哪些方法、哪些變量也很困難。
這種改變變量名稱的功能是可配置的,例如,假設你正在構造一個DLL,可以要求不改動API。有趣的是,這一處理過程顯然只是簡單地把大量變量的名稱簡縮成單個字符,但獲得了非常好的模糊效果。
二、加密字符串
字符串加密對付另一個安全問題,其實這一安全問題在本機代碼中也同樣存在——從二進制代碼提取字符和文字是一件很簡單的事情。例如,用UNIX的strings工具處理任何二進制文件,可以迅速得到該二進制文件包含的ASCII文本清單。
在最簡單的情形下,這個清單只會泄露版權信息和二進制執行文件引用了哪些庫。但是,如果程序要訪問數據庫,這個清單將包含所有的SQL命令;如果代碼模塊中嵌入了密碼,密碼也將不密。
對于中間代碼,未加密的字符串還會帶來一層額外的風險。黑客們通過分析對特定字符串的引用,可以判斷出從哪里開始代碼受到密碼保護,然后加上補丁使代碼繞過密碼驗證部分。
為了解決字符串明文帶來的安全問題,大多數模糊器運用了加密字符串的技術。由于解密操作需要一定的開銷,所以運行時訪問字符串的性能肯定會有所降低。有趣的是,在這方面本機代碼反而不占便宜,因為如果要達到同樣的效果,對于本機代碼開發者必須手工加密和解密每個字符串,而對于中間代碼這些工作卻可以由模糊器代勞。
三、隱藏執行流程
控制流程模糊是一種用來誤導反編譯器的技術,它在原始的代碼中插入許多goto指令,雖然程序最終執行的指令序列仍跟原來的一樣,但太多的“迂回動作”使得分析程序實際的邏輯流程非常困難。下面來看一個例子。
對沒有經過控制流程模糊處理的中間代碼實施反向工程:
| public int CompareTo(Object o) {int n = occurrences - ((WordOccurrence)o).occurrences;if (n == 0) {n = String.Compare(word, ((WordOccurrence)o).word;}return (n); } |
同樣的代碼,經過控制流程模糊處理后再執行反向工程:
| public virtual int a(object A_0) {int local0;int local1;local0 = this.a - (c) A_0.a;if (local0 != 0)goto i0;goto i1;while (true) {return local1;i0: local1 = local0;}i1: local0 = System.String.Compare(this.b, (c) A_0.b);goto i0; } |
可以看到,經過控制流程模糊處理后,代碼被插入了一個偽條件檢測語句,接著又執行了一個goto指令。在goto的目的地,原來的語句(以經過模糊處理后的形式)被執行,接著又是一個goto語句將控制轉到原先的邏輯流程分支。注意while()循環未被執行,它只是起到一種誤導的作用。這個代碼片斷很小,即使沒有原始的代碼可供比較和參考,識別出程序實際流程的可能性仍存在。然而,對于一個規模較大的過程,如果沒有源代碼可供參考,那些專門用來攪渾程序正常執行流程的指令將使分析代碼的人疲于奔命,最終不得不放棄。
也就是說,這種模糊處理的根本思想是讓恢復原始代碼變得極其困難,迫使黑客改變主意,也許是換做輕松一點的,例如“自己寫代碼算了”。
對控制流程進行模糊處理要在二進制文件中插入一些代碼,因而增加了一些運行時間開銷。如果代碼對運行時間的要求非常苛刻,可以只給那些特別重要的部分加上這一層額外的保護。
█ 模糊器和反編譯器大展播:
▲模糊器:
LSW DotNet IL Obfuscator
Demeanor for .NET
Salamander .NET Obfuscator
dotfuscator
Aspose.Obfuscator
.NET IL-Obfuscator
Deploy .NET
Salamander .NET Protector
Thinstall
XenoCode
▲ 反編譯器:
Salamander .NET Decompiler
Exemplar/Anakrino
本文轉自浪子博客園博客,原文鏈接:http://www.cnblogs.com/walkingboy/archive/2005/03/28/127026.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的模糊:让你的代码远离偷窥之眼的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《软件工程导论》之总体设计
- 下一篇: 1.1 《数据库系统概论》之数据库系统概