Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、什么是代碼混淆?
代碼混淆 (Obfuscated code)是將計算機(jī)程序的代碼,轉(zhuǎn)換成一種功能上等價,但是難于閱讀和理解的形式的行為。代碼混淆可以用于程序源代碼,也可以用于程序編譯而成的中間代碼。而混淆后的代碼很難被反編譯,即使反編譯成功也很難得出程序的真正語義,通過進(jìn)行代碼混淆可以有效提升應(yīng)用被逆向破解的難度。
作為一種跨平臺的解釋型語言,Java 源代碼被編譯成中間“字節(jié)碼”存儲于class文件中。由于跨平臺的需要,這些字節(jié)碼帶有許多的語義信息,因此很容易被反編譯成Java源代碼。為了很好地保護(hù)Java源代碼,開發(fā)者往往會對編譯好的class文件進(jìn)行混淆處理。就是對發(fā)布出去的程序代碼進(jìn)行重新組織和處理,使得處理后的代碼與處理前的代碼能夠完成相同的功能,但是混淆后的代碼很難被反編譯,即使反編譯成功也很難得出程序的真正語義。
二、代碼混淆的方法有哪些?
目前對于代碼混淆的方法,普遍是以Collberg的理論為基礎(chǔ),分為布局混淆、數(shù)據(jù)混淆、控制混淆和預(yù)防混淆四種類型:
1.布局混淆:是指刪除或者混淆軟件源代碼或者中間代碼中與執(zhí)行無關(guān)的輔助文本信息,增加攻擊者閱讀和理解代碼的難度。
2.數(shù)據(jù)混淆:是修改程序中的數(shù)據(jù)域,而對代碼段不作處理。常用的數(shù)據(jù)混淆方式有合并變量、分割變量、數(shù)組重組、字符串加密等。
3.控制混淆:也稱流程混淆,它是改變程序的執(zhí)行流程,從而打斷逆向分析人員的跟蹤思路,達(dá)到保護(hù)軟件的目的。
4.預(yù)防混淆:一般是針對專用的反編譯器設(shè)計的,目的就是預(yù)防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進(jìn)行專門設(shè)計。預(yù)防混淆對于特定的反編譯器非常有效,所以在使用時要綜合利用各種反編譯器的特點進(jìn)行設(shè)計。
三、有哪些常見代碼混淆工具?
WinLicense是一個強(qiáng)勁的保護(hù)系統(tǒng), 專為了那些想保護(hù)自己的程式不被先進(jìn)的反向工程和黑客軟件破解的軟件開發(fā)者而開發(fā)的。開發(fā)者不需要更改任何的原代碼,不需要程式編制的經(jīng)驗就可使用WinLicense。
VMProtect 是新一代的軟件保護(hù)系統(tǒng),將保護(hù)后的代碼放到虛擬機(jī)中運(yùn)行,這將使分析反編譯后的代碼和破解變得極為困難。使用 MAP 文件或內(nèi)建的反編譯引擎,您可以快速選擇需要保護(hù)的代碼。
.NET Reactor是用于為.NET Framework編寫的軟件的功能強(qiáng)大的代碼保護(hù)和軟件許可系統(tǒng),并且支持生成.NET程序集的所有語言。
.NET Reactor支持所有的dotnet實現(xiàn),包括.NET Framework、.NET 5.0、.NET Core和ASP.NET Core。通過這種方式,Xamarin、Unity和Blazor組件得到了全面的保護(hù)支持。
Allatori Java obfuscator是第二代Java代碼混淆器,為您的知識產(chǎn)權(quán)提供全方位的保護(hù)。大部分第二代混淆器都具有保護(hù)功能。Allatori除了保護(hù)功能之外,還附加了一系列的功能,幾乎可以抵御一切的代碼攻擊。同時,Allatori可以讓您的程序體積更小,速度更快,效果簡直讓人難以置信。
dotNet Protector 是一個功能強(qiáng)大的.NET代碼保護(hù)系統(tǒng),它可以防止程序集被反編譯。dotNet Protector使用的是一個新的主體混淆技術(shù)保護(hù)應(yīng)用程序和組件。程序集不再需要合并到一個win32可執(zhí)行文件中,但是會保留其.net特性。dotNet Protector 采用一個命名混淆器結(jié)合一個主體混淆器來保護(hù)您的代碼。
Themida是一個強(qiáng)勁的保護(hù)系統(tǒng), 專為了那些想保護(hù)自己的程式不被先進(jìn)的逆向工程和黑客軟件破解的軟件開發(fā)者而開發(fā)的。開發(fā)者不需要更改任何的原代碼,和不需要程式編制的經(jīng)驗使用WinLicense。
Themida使用SecureEngine?的保護(hù)技術(shù)。它能夠以最高的優(yōu)先等級運(yùn)行,這些保護(hù)技巧是從來都沒在電腦防御技術(shù)領(lǐng)域出現(xiàn)過,使它
Code Virtualizer 是一個強(qiáng)大的代碼攪亂系統(tǒng)。它可以幫助軟件開發(fā)者保護(hù)他們軟件內(nèi)重要和敏感的代碼區(qū),防止他人使用逆向工程,而且它只消耗最小的系統(tǒng)資源。
代碼加密,程序保護(hù)始終是信息安全的很重要的一部分,未來也將繼續(xù)成為IT領(lǐng)域發(fā)展的重要方面,但著技術(shù)的進(jìn)步,很多老的技術(shù)將會被逐步破解和淘汰,新技術(shù)也將源源不斷的被開發(fā)出來,但市場需求和安全需求相信只會源源不斷的增加,市面上現(xiàn)存的諸如VMProtect、WinLicense。這樣致力于服務(wù)代碼加密混淆的軟件廠商也將不斷迭代技術(shù)。
源:科技日報
幾十年來,計算機(jī)科學(xué)家一直都想驗證是否存在絕對安全的方法來加密計算機(jī)程序,讓人們在使用計算機(jī)的同時卻無法破解其程序。
在2020年底,幾位學(xué)者成功找到了一種加密方式,讓計算機(jī)用戶無法通過獲取代碼破解程序。
加密程序代碼
首先要對其進(jìn)行混淆
不可區(qū)分混淆(indistinguishability obfuscation,簡稱IO)是一種強(qiáng)大的加密算法,它不僅能隱藏數(shù)據(jù)集,還能隱藏程序本身,從而實現(xiàn)幾乎所有的加密協(xié)議。
要想知道不可區(qū)分混淆是什么,我們不妨先來看一看混淆是什么。
對于程序員來說,最寶貴的自然是代碼,一旦源代碼被人獲取,基本上就等于程序員編寫代碼花費(fèi)的心血付諸東流,還會涉及到知識產(chǎn)權(quán)糾紛。為了保護(hù)代碼,有的程序員會在導(dǎo)出程序之前采取一些手段來混淆程序。
當(dāng)前程序混淆有兩種方式,第一種是全文替換關(guān)鍵詞,把整段代碼中所有的“命名”全部替換成數(shù)字(例如將ui_controller替代為a0123456);第二種是直接輸出編譯過后的代碼,將人們可以看懂的源代碼轉(zhuǎn)換成電腦看得懂的機(jī)器碼,這樣別人就沒法直接打開這個文件看到原本的代碼了。
這兩種方式的目的都是在導(dǎo)出程序的時候,把標(biāo)注性的符號摘除。從而達(dá)到不暴露源碼信息的效果。
但這兩種方式并不是真正意義上的混淆,因為雖然人類難以理解這串代碼到底要做什么,但如果把這樣的代碼放入編譯器中,讓編譯器去分析整個編程語言的語法結(jié)構(gòu),把每一行指令所要做的事情都?xì)w納出來的話,那么很容易就能看出些端倪。
真正意義上的混淆被稱作虛擬黑盒(Virtual Black Box Obfuscation,VBB),相當(dāng)于將一個程序C嵌入一個黑盒中,我們可以在黑盒的一端輸入x,另一頭會輸出C(x)。因為整個程序都藏在黑盒中,我們完全無法得知任何C的構(gòu)造信息,也無法從輸出反推輸入。
如果實現(xiàn)虛擬黑盒,用戶可以使用程序卻無法理解程序本身,那么就能讓開發(fā)的程序永遠(yuǎn)不被破解,并且加密程序的過程也會十分高效。
但虛擬黑盒的概念提出不久后,很快就被潑了一盆冷水。2001年,7位研究者聯(lián)手提出了一種特殊構(gòu)造的程序,并證明通用的VBB混淆是絕對不可能的。
不過,這7位研究者的成果中,提出了一種混淆的新型定義——如果一對程序A和B具有相同的功能性,能否通過一種新的混淆算法,使第三方無法區(qū)分兩個程序呢?對于這樣的混淆,我們稱之為IO。
其利用的原理是:如果把相同值輸入程序A和B,計算得到O(A)=P和O(B)=P,在無法進(jìn)入程序A或B的情況下,在計算上分辨P來自于A還是B是不可行的。
有了強(qiáng)大的不可區(qū)分混淆,我們就能完美加密已有的程序,使其永遠(yuǎn)不會被破解。
IO存在性被證實
但還難以抵御量子計算
2013年,美國加州大學(xué)洛杉磯分校的阿米特·沙海教授聯(lián)合其他5位學(xué)者提出一種IO協(xié)議,把一個程序拆分為幾塊,就像拼圖游戲,單個碎片看上去毫無意義,但如果使用多線性配對方法將碎片正確地組合到一起,程序就能正常工作。
多線性配對本質(zhì)上是一種利用多項式進(jìn)行計算的方法,多項式是由不同變量和數(shù)字組成的數(shù)學(xué)表達(dá)式,如3xy+2yz2。為了保證其安全性,用戶不能獲知整個過程中任何參數(shù)。
多線性配對方法中,有一個重要的概念叫做“層數(shù)”,它可以理解為運(yùn)算公式中變量的階數(shù),如3xy+2yz2為2階多項式,即其層數(shù)為2;3xy+2yz4為4階多項式,其層數(shù)為4。層數(shù)越多,多線性配對的安全性越差。
2016年,美國華盛頓大學(xué)副教授林惠嘉開始探索能否通過減少多線性配對的層數(shù)來實現(xiàn)IO。最初,她想出了如何用30層多線性配對構(gòu)建IO。接下來,她和其他研究者逐漸實現(xiàn)了只用3層多線性配對來構(gòu)建IO。
表面上看,這是一個巨大的進(jìn)步。但有一個問題——從安全的角度來看,3層多線性配對和其他3層以上多線性配對一樣不安全。
此前,研究人員只知道2層及以下的線性配對是絕對安全的。林惠嘉與阿米特·沙海聯(lián)手,試圖找出如何用2層線性配對構(gòu)建IO,但是很長一段時間研究都沒有突破。最終,他們想出了一個折中方案:既然實現(xiàn)IO需要3層線性配對,但為了安全需要減少到2層,那么中間是否存在2.5層呢?
研究人員設(shè)想了一個系統(tǒng),使用戶可以看到部分變量的值,這讓整個機(jī)制不需要對太多變量進(jìn)行加密。但多項式被隱藏的變量必須不能超過2階,如3x2y+2yz4公式中,z的值可以讓用戶看到,而變量x、y的階數(shù)由于沒有超過2階因此被隱藏。由此,研究人員在保證線性配對安全性的前提下,成功實現(xiàn)了IO。
雖然幾位科學(xué)家聯(lián)手證明了IO的存在性,但量子計算機(jī)的超強(qiáng)計算能力,會使得目前絕大部分加密算法都無法抵擋,這意味著所有的加密信息,都將會暴露在量子計算機(jī)的面前?,F(xiàn)在研究者們正試圖開發(fā)一條新的通往IO的潛在途徑,希望能抵擋住量子攻擊。
(王昱編譯,據(jù)《環(huán)球科學(xué)》)
止核心代碼泄露以及代碼合并
每日辛辛苦苦碼的代碼被輕松破解?
機(jī)密核心模塊被盜用?
數(shù)據(jù)庫地址和語句暴露?
…… 這些都是由代碼未混淆加密,從而進(jìn)行泄露的
我們目前DLL文件存在的風(fēng)險:
一、直接引用
二、反編譯
三、反射
如果DLL一點措施都不做的話,上面任意一種都可以達(dá)到破解目的的。
如果通過反編譯軟件:ILSpy、Reflector,輕而易舉,那相當(dāng)于直接copy代碼了。
那么要怎么樣才能保護(hù)我們的代碼呢?
今天帶大家進(jìn)入代碼的另一個世界,代碼混淆與DLL融合
目錄:
01 混淆原理
反編譯軟件就是能讓你看到代碼,進(jìn)行Copy使用,那怎么讓它不能看,不能調(diào)呢。這個時候就需要說一說模糊處理。
模糊處理:意在引起混淆,實質(zhì)上是將在代碼中找到的標(biāo)識符重命名為不可讀的內(nèi)容。它們可能使用哈希技術(shù),或者對字符集進(jìn)行算術(shù)偏移,將字符變?yōu)椴豢勺x字符或不可輸出字符。這些技術(shù)雖然表面上很有效,但是它們都是可逆的,因此很難起到保護(hù)作用。
編譯原理
模糊處理這一過程應(yīng)用于已編譯的 MSIL 代碼而不是應(yīng)用于源代碼(源代碼不會不會被讀取和更改), 經(jīng)過模糊處理的在功能上等同于你的源代碼,它在公共語言運(yùn)行庫 (CLR) 上執(zhí)行并產(chǎn)生與原始 MSIL 代碼相同的結(jié)果。(但是,它是不可逆的,即使通過反編譯和原始的源代碼相比,它在語義上也將有重大不同。)
Dotfuscator的定位
代碼安全已經(jīng)演變出許多加密、加殼的軟件,如:PreEmptive ,它是得到Micorsoft和Sun公司的認(rèn)可的以Java和.Net混淆器出名的公司,其中比較出名的軟件: PreEmptive Protection Dotfuscator
Dotfuscator工具,它使用很多其他頗具獨(dú)創(chuàng)性的 “ 引起混淆 ”的算法,使得代碼幾乎不能被反編譯(還是存在一定機(jī)率可逆,但代價太大,得不償失)。
Dotfuscator工具主要使用模糊處理這種技術(shù)能夠?qū)Τ绦蚣械姆?、變量、字符串等進(jìn)行無跡可尋的重命名,并提供很多其他手段,從而阻止進(jìn)行反編譯。
Dotfuscator安裝
VS自帶混淆軟件:Dotfuscator,在VS2019前版本都會自動安裝,2019版本就需要手動安裝了,可搜索: Dotfuscator,預(yù)計安裝10分鐘,安裝完成后,需要進(jìn)行郵箱注冊才可以使用,但非正式版限制太多。
介紹的是一款破解版:DotfuscatorPro 4.9
安裝后使用時,它依賴.Net Framework 2.0和3.5,會進(jìn)行第一次更新,需確認(rèn)windows的自動更新服務(wù)是打開的
DotfuscatorPro 4.9
02 如何對代碼加密
1、創(chuàng)建新的工程文件。INPUT 選項里 選擇你需要混淆加密的 DLL、EXE文件:
2、進(jìn)入Settings選項 –> 把 Disable String Encryption 設(shè)為 NO,即啟用字符串加密;
檢查 Disable Control flow、Dsiable Renaming 也為 NO,即保證控制流和混淆功能打開,其他默認(rèn)。
3、進(jìn)入Rename-> Options選項 勾選“use enhanced overload induction”(使用增強(qiáng)模式),
注意:不要勾選下方的“ Do not suppress on serializable types”,即序列化類型的變量不加密,否則編譯后可能異常;
“Renaming Scheme” 選擇“Unprintable”(不可打印字符,即亂碼),也可以選擇其他如小寫字母、大寫字符、數(shù)字的方式
4、進(jìn)入String Encryption 選項 include里勾選需要字符串加密的工程文件EXE、DLL等
5、轉(zhuǎn)入Output目錄,點擊Build,查看輸出結(jié)果為 Build Finshed 即為成功。
操作步驟
提醒:編譯過程中可能提示會代碼框架為4.5及以上,需要手動配置編譯環(huán)境的路徑,在Settings ->Porjcet properties 設(shè)置編譯環(huán)境地址,如下圖:
反編譯前后對比
Dotfuscator 可對代碼中的變量值進(jìn)行模糊處理,大大增加閱讀難度,反編譯出來的代碼也如混淆后的代碼
混淆前后對比
甚至連exe文件都能執(zhí)行模糊處理
混淆前后對比
03 代碼融合
有時系統(tǒng)中我們關(guān)聯(lián)了太多第三方DLL,以及自身建了多個類庫,等到系統(tǒng)發(fā)布時發(fā)現(xiàn)DLL文件有幾十個,實在太夸張。萬一丟掉一個未復(fù)制, 整個程序都無法運(yùn)行。
微軟推出一款I(lǐng)LMerge打包合并工具,它可以將程序集合并到一個目標(biāo)程序集中。輸入程序集列表中的第一個程序集是主程序集。當(dāng)主程序集是可執(zhí)行文件時,目標(biāo)程序集將創(chuàng)建為具有與主程序集相同的入口點的可執(zhí)行文件。此外,如果主程序集具有強(qiáng)名稱,并且提供了.snk文件,則使用指定的鍵重新簽名目標(biāo)程序集,以使其具有強(qiáng)名稱。
它是命令行形式運(yùn)行:
1、打開cmd,轉(zhuǎn)至安裝目錄(最好是以管理員權(quán)限運(yùn)行)
2、ILMerge.exe /targetplatform:v4,“.NETFramework安裝目錄” /target:winexe /union /xmldocs /copyattrs /allowMultiple /internalize /closed /ndebug /out:“新文件” /log “dll1” “dll2” /log:“日志目錄”
參數(shù)說明:
/targetplatform 輸出文件的.net運(yùn)行版本
/target 生成的文件,winexe應(yīng)用程序,library DLL文件
/closed 排除引用文件相互引用
/log 需要合并的DLL或EXE,需要把所有的合并的EXE或DLL囊括進(jìn)來
/ndebug 為非調(diào)試版本,即發(fā)布版本,如果去掉,將會生成.pdb拓展名的調(diào)試文件
/log 日志,可以不加
提醒:要集成的程序最好是release過的,不然會出一些莫名其妙的問題。
圖形界面
我們找到一款圖形化界面,可以輕松合并
圖形工具
合并后的反編譯
圖形界面使用: https://jingyan.baidu.com/article/59a015e3204d87f794886529.html
那看到這里,拋出2個問題,供大家討論:
1、打包工具還能做什么呢?
2、混淆加密后真的安全?
上一篇:代碼安全之文件上傳漏洞 下一篇:代碼安全之漏洞掃描
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。