、什么是代碼混淆?
代碼混淆 (Obfuscated code)是將計算機程序的代碼,轉換成一種功能上等價,但是難于閱讀和理解的形式的行為。代碼混淆可以用于程序源代碼,也可以用于程序編譯而成的中間代碼。而混淆后的代碼很難被反編譯,即使反編譯成功也很難得出程序的真正語義,通過進行代碼混淆可以有效提升應用被逆向破解的難度。
作為一種跨平臺的解釋型語言,Java 源代碼被編譯成中間“字節碼”存儲于class文件中。由于跨平臺的需要,這些字節碼帶有許多的語義信息,因此很容易被反編譯成Java源代碼。為了很好地保護Java源代碼,開發者往往會對編譯好的class文件進行混淆處理。就是對發布出去的程序代碼進行重新組織和處理,使得處理后的代碼與處理前的代碼能夠完成相同的功能,但是混淆后的代碼很難被反編譯,即使反編譯成功也很難得出程序的真正語義。
二、代碼混淆的方法有哪些?
目前對于代碼混淆的方法,普遍是以Collberg的理論為基礎,分為布局混淆、數據混淆、控制混淆和預防混淆四種類型:
1.布局混淆:是指刪除或者混淆軟件源代碼或者中間代碼中與執行無關的輔助文本信息,增加攻擊者閱讀和理解代碼的難度。
2.數據混淆:是修改程序中的數據域,而對代碼段不作處理。常用的數據混淆方式有合并變量、分割變量、數組重組、字符串加密等。
3.控制混淆:也稱流程混淆,它是改變程序的執行流程,從而打斷逆向分析人員的跟蹤思路,達到保護軟件的目的。
4.預防混淆:一般是針對專用的反編譯器設計的,目的就是預防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進行專門設計。預防混淆對于特定的反編譯器非常有效,所以在使用時要綜合利用各種反編譯器的特點進行設計。
三、有哪些常見代碼混淆工具?
WinLicense是一個強勁的保護系統, 專為了那些想保護自己的程式不被先進的反向工程和黑客軟件破解的軟件開發者而開發的。開發者不需要更改任何的原代碼,不需要程式編制的經驗就可使用WinLicense。
VMProtect 是新一代的軟件保護系統,將保護后的代碼放到虛擬機中運行,這將使分析反編譯后的代碼和破解變得極為困難。使用 MAP 文件或內建的反編譯引擎,您可以快速選擇需要保護的代碼。
.NET Reactor是用于為.NET Framework編寫的軟件的功能強大的代碼保護和軟件許可系統,并且支持生成.NET程序集的所有語言。
.NET Reactor支持所有的dotnet實現,包括.NET Framework、.NET 5.0、.NET Core和ASP.NET Core。通過這種方式,Xamarin、Unity和Blazor組件得到了全面的保護支持。
Allatori Java obfuscator是第二代Java代碼混淆器,為您的知識產權提供全方位的保護。大部分第二代混淆器都具有保護功能。Allatori除了保護功能之外,還附加了一系列的功能,幾乎可以抵御一切的代碼攻擊。同時,Allatori可以讓您的程序體積更小,速度更快,效果簡直讓人難以置信。
dotNet Protector 是一個功能強大的.NET代碼保護系統,它可以防止程序集被反編譯。dotNet Protector使用的是一個新的主體混淆技術保護應用程序和組件。程序集不再需要合并到一個win32可執行文件中,但是會保留其.net特性。dotNet Protector 采用一個命名混淆器結合一個主體混淆器來保護您的代碼。
Themida是一個強勁的保護系統, 專為了那些想保護自己的程式不被先進的逆向工程和黑客軟件破解的軟件開發者而開發的。開發者不需要更改任何的原代碼,和不需要程式編制的經驗使用WinLicense。
Themida使用SecureEngine?的保護技術。它能夠以最高的優先等級運行,這些保護技巧是從來都沒在電腦防御技術領域出現過,使它
Code Virtualizer 是一個強大的代碼攪亂系統。它可以幫助軟件開發者保護他們軟件內重要和敏感的代碼區,防止他人使用逆向工程,而且它只消耗最小的系統資源。
代碼加密,程序保護始終是信息安全的很重要的一部分,未來也將繼續成為IT領域發展的重要方面,但著技術的進步,很多老的技術將會被逐步破解和淘汰,新技術也將源源不斷的被開發出來,但市場需求和安全需求相信只會源源不斷的增加,市面上現存的諸如VMProtect、WinLicense。這樣致力于服務代碼加密混淆的軟件廠商也將不斷迭代技術。
源:科技日報
幾十年來,計算機科學家一直都想驗證是否存在絕對安全的方法來加密計算機程序,讓人們在使用計算機的同時卻無法破解其程序。
在2020年底,幾位學者成功找到了一種加密方式,讓計算機用戶無法通過獲取代碼破解程序。
加密程序代碼
首先要對其進行混淆
不可區分混淆(indistinguishability obfuscation,簡稱IO)是一種強大的加密算法,它不僅能隱藏數據集,還能隱藏程序本身,從而實現幾乎所有的加密協議。
要想知道不可區分混淆是什么,我們不妨先來看一看混淆是什么。
對于程序員來說,最寶貴的自然是代碼,一旦源代碼被人獲取,基本上就等于程序員編寫代碼花費的心血付諸東流,還會涉及到知識產權糾紛。為了保護代碼,有的程序員會在導出程序之前采取一些手段來混淆程序。
當前程序混淆有兩種方式,第一種是全文替換關鍵詞,把整段代碼中所有的“命名”全部替換成數字(例如將ui_controller替代為a0123456);第二種是直接輸出編譯過后的代碼,將人們可以看懂的源代碼轉換成電腦看得懂的機器碼,這樣別人就沒法直接打開這個文件看到原本的代碼了。
這兩種方式的目的都是在導出程序的時候,把標注性的符號摘除。從而達到不暴露源碼信息的效果。
但這兩種方式并不是真正意義上的混淆,因為雖然人類難以理解這串代碼到底要做什么,但如果把這樣的代碼放入編譯器中,讓編譯器去分析整個編程語言的語法結構,把每一行指令所要做的事情都歸納出來的話,那么很容易就能看出些端倪。
真正意義上的混淆被稱作虛擬黑盒(Virtual Black Box Obfuscation,VBB),相當于將一個程序C嵌入一個黑盒中,我們可以在黑盒的一端輸入x,另一頭會輸出C(x)。因為整個程序都藏在黑盒中,我們完全無法得知任何C的構造信息,也無法從輸出反推輸入。
如果實現虛擬黑盒,用戶可以使用程序卻無法理解程序本身,那么就能讓開發的程序永遠不被破解,并且加密程序的過程也會十分高效。
但虛擬黑盒的概念提出不久后,很快就被潑了一盆冷水。2001年,7位研究者聯手提出了一種特殊構造的程序,并證明通用的VBB混淆是絕對不可能的。
不過,這7位研究者的成果中,提出了一種混淆的新型定義——如果一對程序A和B具有相同的功能性,能否通過一種新的混淆算法,使第三方無法區分兩個程序呢?對于這樣的混淆,我們稱之為IO。
其利用的原理是:如果把相同值輸入程序A和B,計算得到O(A)=P和O(B)=P,在無法進入程序A或B的情況下,在計算上分辨P來自于A還是B是不可行的。
有了強大的不可區分混淆,我們就能完美加密已有的程序,使其永遠不會被破解。
IO存在性被證實
但還難以抵御量子計算
2013年,美國加州大學洛杉磯分校的阿米特·沙海教授聯合其他5位學者提出一種IO協議,把一個程序拆分為幾塊,就像拼圖游戲,單個碎片看上去毫無意義,但如果使用多線性配對方法將碎片正確地組合到一起,程序就能正常工作。
多線性配對本質上是一種利用多項式進行計算的方法,多項式是由不同變量和數字組成的數學表達式,如3xy+2yz2。為了保證其安全性,用戶不能獲知整個過程中任何參數。
多線性配對方法中,有一個重要的概念叫做“層數”,它可以理解為運算公式中變量的階數,如3xy+2yz2為2階多項式,即其層數為2;3xy+2yz4為4階多項式,其層數為4。層數越多,多線性配對的安全性越差。
2016年,美國華盛頓大學副教授林惠嘉開始探索能否通過減少多線性配對的層數來實現IO。最初,她想出了如何用30層多線性配對構建IO。接下來,她和其他研究者逐漸實現了只用3層多線性配對來構建IO。
表面上看,這是一個巨大的進步。但有一個問題——從安全的角度來看,3層多線性配對和其他3層以上多線性配對一樣不安全。
此前,研究人員只知道2層及以下的線性配對是絕對安全的。林惠嘉與阿米特·沙海聯手,試圖找出如何用2層線性配對構建IO,但是很長一段時間研究都沒有突破。最終,他們想出了一個折中方案:既然實現IO需要3層線性配對,但為了安全需要減少到2層,那么中間是否存在2.5層呢?
研究人員設想了一個系統,使用戶可以看到部分變量的值,這讓整個機制不需要對太多變量進行加密。但多項式被隱藏的變量必須不能超過2階,如3x2y+2yz4公式中,z的值可以讓用戶看到,而變量x、y的階數由于沒有超過2階因此被隱藏。由此,研究人員在保證線性配對安全性的前提下,成功實現了IO。
雖然幾位科學家聯手證明了IO的存在性,但量子計算機的超強計算能力,會使得目前絕大部分加密算法都無法抵擋,這意味著所有的加密信息,都將會暴露在量子計算機的面前。現在研究者們正試圖開發一條新的通往IO的潛在途徑,希望能抵擋住量子攻擊。
(王昱編譯,據《環球科學》)
止核心代碼泄露以及代碼合并
每日辛辛苦苦碼的代碼被輕松破解?
機密核心模塊被盜用?
數據庫地址和語句暴露?
…… 這些都是由代碼未混淆加密,從而進行泄露的
我們目前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、混淆加密后真的安全?
上一篇:代碼安全之文件上傳漏洞 下一篇:代碼安全之漏洞掃描
*請認真填寫需求信息,我們會在24小時內與您取得聯系。