国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

如何有效的保護JAVA程序

2019-11-18 14:47:58
字體:
來源:轉載
供稿:網友

目前關于java程序的加密方式不外乎JAVA模糊處理(Obfuscator)和運用ClassLoader方法進行加密處理這兩種方式(其他的方式亦有,但大多是這兩種的延伸和變異)。這兩種方式不管給JAVA反編譯器造成多少困難, 究竟還是有跡可尋,有機可乘的。本文介紹的方法是對ClassLoader方式加密處理的一種改進,使之達到傳統二進制程序代碼安全。
第一章 流行的加密方式簡介

關于JAVA程序的加密方式,一直以來都是以JAVA模糊處理(Obfuscator)為主。這方面的研究結果也頗多,既有模糊器(如現在大名鼎鼎的JODE),也有針對反編譯器的"炸彈"(如針對反編譯工具Mocha的 "炸彈" Crema和HoseMocha)。模糊器,從其字面上,我們就可以知道它是通過模糊處理JAVA代碼,具體的說,就是更換變量名,函數名,甚至類名等方法使其反編譯出來的代碼變得不可理解。舉個例子來說吧。

先將將下面源代碼編譯成class文件。

public class test

int sortway;
void sort(Vector a)
{
……
}
void setSortWay(int way)
{
……
}
void sort(Vector a, int way)
{
……
}


后通過JODE進行模糊處理后,反編譯過來后, 可能變成下列代碼。

public class OoOoooOo0Oo0O

int OoOo0oOo0Oo0O;
void OoO0ooOo0Oo0O (Vector OoOoo0Oo0OoOO)
{
……
}
void OoOo00oOoOo0O (int Oo0oooOo0Oo0O)
{
……
}
void OoO0ooOo0Oo0O (Vector OoOoo0Oo0OoOO, int Oo0oooOo0Oo0O)
{
OoOo00oOoOo0O (Oo0oooOo0Oo0O);
OoO0ooOo0Oo0O (OoOoo0Oo0OoOO);
}


其實這只是做到了視覺上的處理,其業務邏輯卻依然不變,加以耐心,仍是可以攻破的,假如用在用戶身份驗證等目的上,完全可以找到身份驗證算法而加以突破限制。

而所謂的"炸彈"是針對反編譯工具本身的缺陷,這種方法對于特定的反編譯工具是非常有效的,然而到目前為止,還沒有一個全能型的,對每一種反編譯工具皆有效,其局限性是明顯的!

另一種方法是采用ClassLoader加密。JAVA虛擬機通過一個稱為ClassLoader的對象裝來載類文件的字節碼,而ClassLoader是可以由JAVA程序自己來定制的。ClassLoader是如何裝載類的呢?ClassLoader根據類名在jar包中找到該類的文件,讀取文件,并把它轉換成一個Class對象。該方法的原理就是,對需加密的類文件我們先行采用一定的方法(可以是PGP, RSA, md5等方法)進行加密處理,我們可以在讀取文件之后,進行解密后,再轉換成一個Class對象。

關于ClassLoader工作方式的具體介紹就不在此一一述說了,前面已有文章專題討論了。

有沒有發現,該方法并未解決ClassLoader本身的安全性? 顯然,只要反編譯了該ClassLoader類,就可以順藤摸瓜找到其它的類了。可見ClassLoader本身"明碼"方式仍然造成一定的不安全性,然而,假如該方法解決了ClassLoader本身的安全性,其不失為一個比較好安全方案。

第二章 ClassLoader加密方式改進

JAVA程序是通過java.exe/javaw.exe來啟動的,要對ClassLoader進行解密處理,只能從java.exe/javaw.exe身上著手。

我們先來考察一下JDK的發布路徑, 發現JDK的每一個版本都提供了src.jar,用WinZip打開看看, 可以看到一個launcher的路徑,里面包含的就是java.exe/javaw.exe的程序代碼。哈哈, 這下我們可以隨心所欲了。:-)打開java.c看看,里面有一段, 如下:

jstring mainClassName = GetMainClassName(env, jarfile);
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionDescribe(env);
goto leave;
}
if (mainClassName == NULL) {
f"from %s ", jarfile);
goto leave;
}
classname = (char *)(*env)->GetStringUTFChars(env, mainClassName, 0);
if (classname == NULL) {
(*env)->ExceptionDescribe(env);
goto leave;
}
mainClass = LoadClass(env, classname);
(*env)->ReleaseStringUTFChars(env, mainClassName, classname);
} else {
mainClass = LoadClass(env, classname);
}
if (mainClass == NULL) {
(*env)->ExceptionDescribe(env);
status = 4;
goto leave;
}

其中,函數LoadClass見下:

static jclass
LoadClass(JNIEnv *env, char *name)
{
char *buf = MemAlloc(strlen(name) + 1);
char *s = buf, *t = name, c;
jclass cls;
jlong start, end;

if (debug)
start = CounterGet();

do {
c = *t++;
*s++ = (c == ′.′) ? ′/′ : c;
} while (c != ′

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿荣旗| 柞水县| 馆陶县| 文山县| 遵义县| 观塘区| 利川市| 榆社县| 乌拉特中旗| 永川市| 徐汇区| 凤冈县| 双辽市| 时尚| 仲巴县| 礼泉县| 乐业县| 平罗县| 满城县| 宿松县| 新兴县| 南涧| 昌乐县| 泗水县| 洪江市| 德安县| 滁州市| 略阳县| 丘北县| 杭州市| 大名县| 西峡县| 阿巴嘎旗| 肥乡县| 垦利县| 惠州市| 北流市| 连城县| 东源县| 东明县| 土默特左旗|