溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中混淆技術(shù)有幾種

發(fā)布時(shí)間:2021-12-08 13:45:42 來源:億速云 閱讀:179 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)Java中混淆技術(shù)有幾種的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

到目前為止,對(duì)于Java程序的保護(hù),混淆技術(shù)還是最基本的保護(hù)方法。Java混淆工具也非常多,包括商業(yè)的、免費(fèi)的、開放源代碼的。Sun公司也提供了自己的混淆工具。它們大多都是對(duì)Class文件進(jìn)行混淆處理,也有少量工具首先對(duì)源代碼進(jìn)行處理,然后再對(duì)Class進(jìn)行處理,這樣加大了混淆處理的力度。目前,商業(yè)上比較成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和4thpass.com的SourceGuard等。

主要的混淆技術(shù)按照混淆目標(biāo)可以進(jìn)行如下分類,它們分別為符號(hào)混淆(Lexical Obfuscation)、數(shù)據(jù)混淆(Data Obfuscation)、控制混淆(Control Obfuscation)、控制流重組(Control-flow restructuring)、預(yù)防性混淆(Prevent Transformation)。

一、符號(hào)混淆

在Class中存在許多與程序執(zhí)行本身無關(guān)的信息,例如方法名稱、變量名稱,這些符號(hào)的名稱往往帶有一定的含義。例如某個(gè)方法名為getKeyLength(),那么這個(gè)方法很可能就是用來返回Key的長(zhǎng)度。符號(hào)混淆就是將這些信息打亂,把這些信息變成無任何意義的表示,例如將所有的變量從vairant_001開始編號(hào);對(duì)于所有的方法從method_001開始編號(hào)。這將對(duì)反編譯帶來一定的困難。對(duì)于私有函數(shù)、局部變量,通??梢愿淖兯鼈兊姆?hào),而不影響程序的運(yùn)行。但是對(duì)于一些接口名稱、公有函數(shù)、成員變量,如果有其它外部模塊需要引用這些符號(hào),我們往往需要保留這些名稱,否則外部模塊找不到這些名稱的方法和變量。因此,多數(shù)的混淆工具對(duì)于符號(hào)混淆,都提供了豐富的選項(xiàng),讓用戶選擇是否、如何進(jìn)行符號(hào)混淆。

二、數(shù)據(jù)混淆

數(shù)據(jù)混淆是對(duì)程序使用的數(shù)據(jù)進(jìn)行混淆?;煜姆椒ㄒ灿卸喾N,主要可以分為改變數(shù)據(jù)存儲(chǔ)及編碼(Store and Encode Transform)、改變數(shù)據(jù)訪問(Access Transform)。

改變數(shù)據(jù)存儲(chǔ)和編碼可以打亂程序使用的數(shù)據(jù)存儲(chǔ)方式。例如將一個(gè)有10個(gè)成員的數(shù)組,拆開為10個(gè)變量,并且打亂這些變量的名字;將一個(gè)兩維數(shù)組轉(zhuǎn)化為一個(gè)一維數(shù)組等。對(duì)于一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),我們將打亂它的數(shù)據(jù)結(jié)構(gòu),例如用多個(gè)類代替一個(gè)復(fù)雜的類等。

另外一種方式是改變數(shù)據(jù)訪問。例如訪問數(shù)組的下標(biāo)時(shí),我們可以進(jìn)行一定的計(jì)算,圖5就是一個(gè)例子。 在實(shí)踐混淆處理中,這兩種方法通常是綜合使用的,在打亂數(shù)據(jù)存儲(chǔ)的同時(shí),也打亂數(shù)據(jù)訪問的方式。經(jīng)過對(duì)數(shù)據(jù)混淆,程序的語義變得復(fù)雜了,這樣增大了反編譯的難度。

三、控制混淆

控制混淆就是對(duì)程序的控制流進(jìn)行混淆,使得程序的控制流更加難以反編譯,通??刂屏鞯母淖冃枰黾右恍╊~外的計(jì)算和控制流,因此在性能上會(huì)給程序帶來一定的負(fù)面影響。有時(shí),需要在程序的性能和混淆程度之間進(jìn)行權(quán)衡。控制混淆的技術(shù)最為復(fù)雜,技巧也最多。這些技術(shù)可以分為如下幾類:

增加混淆控制 通過增加額外的、復(fù)雜的控制流,可以將程序原來的語義隱藏起來。例如,對(duì)于按次序執(zhí)行的兩個(gè)語句A、B,我們可以增加一個(gè)控制條件,以決定B的執(zhí)行。通過這種方式加大反匯編的難度。但是所有的干擾控制都不應(yīng)該影響B(tài)的執(zhí)行。

四、控制流重組

重組控制流也是重要的混淆方法。例如,程序調(diào)用一個(gè)方法,在混淆后,可以將該方法代碼嵌入到調(diào)用程序當(dāng)中。反過來,程序中的一段代碼也可以轉(zhuǎn)變?yōu)橐粋€(gè)函數(shù)調(diào)用。另外,對(duì)于一個(gè)循環(huán)的控制流,為可以拆分多個(gè)循環(huán)的控制流,或者將循環(huán)轉(zhuǎn)化成一個(gè)遞歸過程。這種方法最為復(fù)雜,研究的人員也非常多。

五、預(yù)防性混淆

這種混淆通常是針對(duì)一些專用的反編譯器而設(shè)計(jì)的,一般來說,這些技術(shù)利用反編譯器的弱點(diǎn)或者Bug來設(shè)計(jì)混淆方案。例如,有些反編譯器對(duì)于Return后面的指令不進(jìn)行反編譯,而有些混淆方案恰恰將代碼放在Return語句后面。這種混淆的有效性對(duì)于不同反編譯器的作用也不太相同的。一個(gè)好的混淆工具,通常會(huì)綜合使用這些混淆技術(shù)。

感謝各位的閱讀!關(guān)于“Java中混淆技術(shù)有幾種”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI