java字節碼能夠很容易被反編譯大家都曉得啦, 今天下午我為了得到一個(gè)心儀已久的j
builder opentools(昨天1.0 Released,新鮮出爐!但只能用14天,這怎么行~@@#!@#
!#@!@#%%^@,少說(shuō)也要140天嘛?。?,于是我不惜放下其他工作,研究了一把該軟件加密
方法的破解和反破解,結合以前的一些經(jīng)驗,作文一篇與大家共饗,并不是鼓勵大家..
.
破解之道:
如今市面上的java obfuscator很多(可以從google分類(lèi)中列出)比較著(zhù)名的有4thpass的
產(chǎn)品(呵呵,胖友們!KBrowser都用過(guò)了吧),不要錢(qián)的可以用JODE(JODE即是Obfusc
ator也是Decompiler,還提供源程序,推薦初用者使用),一般來(lái)說(shuō)代碼擾亂器工作原
理有三種,最初級的有比如Jbuilder自帶的(缺省情況下該項功能關(guān)閉),能把私有變
量和方法的名稱(chēng)用亂碼代替;稍微高級一點(diǎn)的能把公開(kāi)變量和方法也能用亂碼代替,通
常是輸入你要擾亂的jar和一個(gè)腳本(用來(lái)控制保留部分,否則你的主程序也不能執行了
),有些不用亂碼代替變量名,而是直接用Java的關(guān)鍵字,讀者可能會(huì )感到疑惑,其實(shí)
這種工具是繞過(guò)了Java編譯器的限制,輸入class或jar(不是源程序),擾亂后輸出cl
ass或Jar,當然JVM還是能夠執行的!如果用一般的方法這些類(lèi)文件是沒(méi)法經(jīng)過(guò)反編譯后
修改再用javac或jikes編譯的,破解之道是先用反編譯軟件發(fā)編譯出來(lái)(所有非法變量
名加前綴),然后依樣畫(huà)葫蘆用同樣的擾亂器生成修改好的類(lèi)文件以達到目的;再高級
一點(diǎn)就不是用常規方法了,一些是針對市面上出現反編譯軟件做一些陷阱,使得這些反
編譯軟件不能工作;還有一種是自己做一個(gè)Java編譯器(JDK里也有一個(gè)java實(shí)現的編譯
器),在符合JVM規范的前提下亂編譯,一般用在applet上,使得一般的反編譯軟件根本
就解釋不了。目前我只能搞搞中等擾亂的程序。
最著(zhù)名的反編譯器有JAD1.58e是用C++寫(xiě)的,前臺還有一個(gè)Delphi的界面。用它可以很快
的編譯,我順便寫(xiě)了一個(gè)perl小程序,可以批量編譯上千個(gè)class。
對一些提供license.key(包含授權信息的加密文件)的軟件,一般這種文件會(huì )采用DES
,RAS和CRC校驗而且一般是二進(jìn)制的(即使有時(shí)輸出成BASE64編碼),直接修改文件是浪
費時(shí)間的,你可以先反編譯通過(guò)閱讀源程序來(lái)探究解密過(guò)程,如果過(guò)程是可逆的,那么
你自己實(shí)現一個(gè)加密過(guò)程,可以很容易的生成你自己想要的license key;如果過(guò)程不可
逆也不是就搞不定了,有些強度不大的加密算法還是可以用暴力破解法來(lái)搞定,還有一
種情況是對數字加密(一般指過(guò)期時(shí)間)如果你能修改這個(gè)過(guò)期時(shí)間那么你就可以多用
一會(huì )兒了,用數學(xué)方法描述一下:
假設集合 X 是明文包含的元素集合,Y是X經(jīng)過(guò)算法后的映射,包含密文元素,,如果有
存在兩個(gè)算法A和B,能使得{ Y -A-> X } = { Y -B-> X },A算法可逆,但B算法是不
可逆的,生產(chǎn)方用A的逆算法加密授權信息(X:String) 到(Y:byte[]),并在軟件中用B
算法解密,這樣你就搞不定了,但如果集合X的元素是有限的,假設只有0-9 (new Dat
e().getTime()格式),那么算法B就稱(chēng)為不可逆但不可靠的,因為你通過(guò)一個(gè)樣本(一
般都會(huì )給你評價(jià)版的license啦?。?,是可以得到某些Y集合中元素在X集合中的逆映射的
,這樣你可以直接用這張映射表來(lái)修改license了...
反破解之道:
如果是做產(chǎn)品或提供演示程序,加密還是有好處的,加密的軟件可以用上面提到的JODE
,一般都是對編譯好的class文件進(jìn)行擾亂,因為并不是所有的符號都需要擾亂,如果你
開(kāi)發(fā)的是一個(gè)類(lèi)庫,或者某些類(lèi)需要動(dòng)態(tài)裝載,那些公共API就必須保留符號不變,這樣
別人才能使用你的類(lèi)庫。先編寫(xiě)腳本對那些需要保留的符號名稱(chēng)進(jìn)行配置,某些擾亂器
能夠調整字節碼的順序,使反編譯更加困難。如果你用的代碼擾亂器能保證別人不能通
過(guò)反編譯來(lái)修改或代替你的class,那么你還得注意不要用不可靠的加密算法。我自己寫(xiě)
了一個(gè)不可逆且可靠的算法,正在申請專(zhuān)利中....
聯(lián)系客服