Java字節碼能夠很容易被反編譯
今天下午我為了得到一個心儀已久的JBuilder Opentools
於是我不惜放下其他工作
研究了一把該軟件加密方法的破解和反破解
結合以前的一些經驗
作文一篇與大家共飨
破解之道
如今市面上的java obfuscator很多(可以從google分類中列出)比較著名的有
thpass的產品
不要錢的可以用JODE(JODE即是Obfuscator也是Decompiler
還提供源程序
推薦初用者使用)
一般來說代碼擾亂器工作原理有三種
最初級的有比如Jbuilder自帶的(缺省情況下該項功能關閉)
能把私有變量和方法的名稱用亂碼代替
稍微高級一點的能把公開變量和方法也能用亂碼代替
通常是輸入你要擾亂的jar和一個腳本(用來控制保留部分
否則你的主程序也不能執行了)
有些不用亂碼代替變量名
而是直接用Java的關鍵字
讀者可能會感到疑惑
其實這種工具是繞過了Java編譯器的限制
輸入class或jar(不是源程序)
擾亂後輸出class或Jar
當然JVM還是能夠執行的!如果用一般的方法這些類文件是沒法經過反編譯後修改再用javac或jikes編譯的
破解之道是先用反編譯軟件發編譯出來(所有非法變量名加前綴)
然後依樣畫葫蘆用同樣的擾亂器生成修改好的類文件以達到目的
再高級一點就不是用常規方法了
一些是針對市面上出現反編譯軟件做一些陷阱
使得這些反編譯軟件不能工作
還有一種是自己做一個Java編譯器(JDK裡也有一個java實現的編譯器)
在符合JVM規范的前提下亂編譯
一般用在applet上
使得一般的反編譯軟件根本就解釋不了
目前我只能搞搞中等擾亂的程序
最著名的反編譯器有JAD
e是用C++寫的
前台還有一個Delphi的界面
用它可以很快的編譯
我順便寫了一個perl小程序
可以批量編譯上千個class
對一些提供license
key(包含授權信息的加密文件)的軟件
一般這種文件會采用DES
RAS和CRC校驗而且一般是二進制的(即使有時輸出成BASE
編碼)
直接修改文件是浪費時間的
你可以先反編譯通過閱讀源程序來探究解密過程
如果過程是可逆的
那麼你自己實現一個加密過程
可以很容易的生成你自己想要的license key
如果過程不可逆也不是就搞不定了
有些強度不大的加密算法還是可以用暴力破解法來搞定
還有一種情況是對數字加密(一般指過期時間)如果你能修改這個過期時間那麼你就可以多用一會兒了
用數學方法描述一下
假設集合X是明文包含的元素集合
Y是X經過算法後的映射
包含密文元素
如果有存在兩個算法A和B
能使得{Y-A
>X}={Y
B
>X}
A算法可逆
但B算法是不可逆的
生產方用A的逆算法加密授權信息(X:String)到(Y:byte[])
並在軟件中用B算法解密
這樣你就搞不定了
但如果集合X的元素是有限的
假設只有
(new Date()
getTime()格式)
那麼算法B就稱為不可逆但不可靠的
因為你通過一個樣本(一般都會給你評價版的license啦!)
是可以得到某些Y集合中元素在X集合中的逆映射的
這樣你可以直接用這張映射表來修改license了
反破解之道
如果是做產品或提供演示程序
加密還是有好處的
加密的軟件可以用上面提到的JODE
一般都是對編譯好的class文件進行擾亂
因為並不是所有的符號都需要擾亂
如果你開發的是一個類庫
或者某些類需要動態裝載
那些公共API就必須保留符號不變
這樣別人才能使用你的類庫
先編寫腳本對那些需要保留的符號名稱進行配置
某些擾亂器能夠調整字節碼的順序
使反編譯更加困難
如果你用的代碼擾亂器能保證別人不能通過反編譯來修改或代替你的class
那麼你還得注意不要用不可靠的加密算法
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19309.html