眾所周知,java編譯后的class文件是一種中間字節(jié)字文件。很容易被反編譯工具反編譯,而傳統(tǒng)的java源代碼保護(hù)方法基本都是采用混淆的方式,但這樣會(huì)帶來(lái)很多麻煩,而且也不能真正保護(hù)class文件,我采用jni技術(shù)定制classloader調(diào)用經(jīng)過(guò)加密的class來(lái)動(dòng)態(tài)解密,運(yùn)行class文件。class反編譯工具對(duì)加密后的class文件就沒(méi)辦法再反編譯為java文件了!
為了防止Class文件被直接反編譯,許多開(kāi)發(fā)人員將一些關(guān)鍵的Class文件進(jìn)行加密,例如對(duì)注冊(cè)碼、序列號(hào)管理相關(guān)的類(lèi)等。在使用這些被加密的類(lèi)之前,程序首先需要對(duì)這些類(lèi)進(jìn)行解密,而后再將這些類(lèi)裝載到JVM當(dāng)中。這些類(lèi)的解密可以由硬件完成,也可以使用軟件完成。
大家知道class文件加密吧..我想反編譯這個(gè)工程...但是反編譯工具不認(rèn)為它是有效的class文件.試想反編譯工具不認(rèn),jvm又怎么會(huì)認(rèn)呢,查了半天加密與解密,發(fā)現(xiàn)是一個(gè)classloader.dll的問(wèn)題,是jvm在加載class之前,先加載的classloader.dll,是由它進(jìn)行解密的.
遇到了classloader.dll文件,要是C#寫(xiě)的,早就攻破了.是C++寫(xiě)的...只能反匯編,學(xué)了兩個(gè)晚上的匯編.感覺(jué)想把匯編譯成高級(jí)語(yǔ)言并不是那么容易的事.也有人提出說(shuō),在dll設(shè)置斷點(diǎn),在它解密后,用匯編指令去內(nèi)在中讀取字節(jié)碼.
對(duì)于.net 和java “高級(jí)”源代碼加密無(wú)非就是Hook這個(gè)Hook那個(gè)。
對(duì)于解密方法 無(wú)非就是兩個(gè):
1、內(nèi)存DUMP
2、逆向其源代碼。就是類(lèi)似匯編譯成高級(jí)語(yǔ)言。
鄙人周末早上沒(méi)事做,幾分鐘就把網(wǎng)上這些所謂“JavaClass加密專(zhuān)家、加密大師”的源代碼逆向出來(lái)了。
其實(shí)也是爛簡(jiǎn)單,因?yàn)榧用艽a都是Copy網(wǎng)上的,我還有空把原始加密算法Google 出來(lái)了。
這幾天都花在寫(xiě)加密解密程序上,復(fù)習(xí)下JAVA 說(shuō)不定以后都用這個(gè)了。
不說(shuō)了,僅供娛樂(lè)一下,也就拿了“官方”例子解密了下,不保證你的CLass都能解密。
使用方法選擇要解密的文件或者目錄,點(diǎn)擊解密。
早期的某加密工具就是把魔數(shù)從0xCAFEBABE改成0xFECABABE
把地址0x05和0x09、0x07和0x0B的數(shù)值交換一下
把末尾最后2個(gè)字節(jié)位置交換一下,添加一串“XXXXXX”字符 沒(méi)有用密碼學(xué),所以沒(méi)有加入本程序中