導航:首頁 > 源碼編譯 > 防止jar反編譯

防止jar反編譯

發布時間:2022-01-30 15:39:23

1. 怎麼讓android studio的編譯的aar防止反編譯

1、 簡述

在比較大的 Android 項目的開發中,我們經常會遇到工程、jar 包等等之間相互引用的方式。一般我們通過在 gradle 文件中配置依賴來解決

通用配置

Gradle 的一些基本依賴配置方式如下:

compile fileTree(dir: 'xxx', include: ['*.jar', "*.xxx"]):將某個目錄下所有符合擴展名的文件作為依賴;
compile 'com.xx.xx:ProjectName:Version':配置Maven` 庫作為依賴;在 Maven 庫中心 可以搜索自己想用的庫進行依賴;
compile project(':AnotherMole'):配置另一個 Mole 作為本 Mole 的依賴,被依賴的 Mole 必須被導入到當前工程中;
compile files('xxx.jar'):配置某個 jar 包作為依賴。
看起來不錯,基本通用的配置都已經存在了。一般對於中等小型的工程,這種開發方式完全沒有問題。但是有時候 A 和 B 兩個工程,想同時引用另一個公共的 Mole C,而這個 Mole 可能是一個比較復雜的 Android Mole,可能包含了一些主題、UI 、資源文件等等,這時候,如果用 Mole 依賴的方式來配置,不免有些困難,因為 A 和 B 都要導入 C,而且要隨時關注 C 的更改。

好在 Android Studio 提供了 aar 庫的打包方式,我們可以把 C 作為 library 進行打包,輸出 aar 文件,然後在 A 和 B 中,配置 aar 庫依賴,就可以解決。

2、aar 文件簡介

要輸出 aar 文件,必須將 Mole 配置為 library

輸出 aar : apply plugin: 'com.android.library';
輸出 apk :apply plugin: 'com.android.application'。
將 Mole 配置為 library 後,構建輸出一個 aar 文件,根據渠道和 BuildType 的不同,在相應的目錄下可以找到。比如對 BuildType 為 debug 的配置,輸出為:[MoleName]/build/outputs/aar/[MoleName]-debug.aar。一份 aar 文件其實就是一份 zip 包,和 jar 不同的是,它將一些資源文件、第三方庫文件、so 文件等等都打包在內,而代碼文件編譯後壓縮在在 classes.jar 中。

3、導入 aar 的方式引用
這種方式比較簡單,打開 Project Structure,添加一個新 Mole,然後選擇 Import *.JAR or *.AAR Package 的方式導入
導入後,在你的工程下面,會生成一個文件夾,裡面是 aar 文件以及 Android Studio 的配置文件。
接著可以在 gradle 中配置依賴了,其他 Mole 可以引用這個 Mole 了,依賴方式使用 compile project 的方式即可。
缺點:被依賴的 aar 無法 F3 跟進去,無法看到資源文件內容以及目錄層級等等缺陷。

4、使用配置依賴的方式引用

gradle 其實還有另一種依賴可以引用 aar:
compile(name: 'xxx', ext: 'aar')。
首先需要將 aar 文件放入引用 Mole 的 libs 目錄下,和一般的 jar 文件類似。然後在 gradle 配置文件中把 libs 目錄加入依賴:
repositories
flatDir {
dirs 'libs'
}
}
接著在 gradle 的依賴配置中加入 compile(name: 'xxx', ext: 'aar') 這一句,依賴即可關聯完畢。構建一下工程,在 Mole 的build/intermediates/exploded-aar 目錄下,可以看到有一些臨時文件生成
被導入 aar 生成的臨時文件
Android Studio 安裝反編譯插件後,可以通過 F3 跟進到 class 文件裡面,如果你有被依賴 Mole 的源代碼的話,還可以 Attach Source 關聯源代碼查看。另外,可以很方便的查看 aar 中的資源文件。

另外,這種依賴方式更新 aar 後,生成的臨時文件也會隨之變動,不用擔心改動不同步的問題。

2. 如何對java的jar包反編譯

使用現有的反編譯工具或者自己寫一個,jar包實際上是class文件打包的,class文件是二進制文件,使用流將class文件讀入,然後轉為字元再寫入到文件中就完成反編譯了。不過經過混淆過的jar包好像不能反編譯。

3. Android項目里如何混淆自己打的jar包或者防止被反編譯

Android之防止反編譯技巧:

1. 判斷程序是否運行在模擬器上

boolean isRunningInEmualtor() {
boolean qemuKernel = false;
Process process = null;
DataOutputStream os = null;
try{
process = Runtime.getRuntime().exec("getprop ro.kernel.qemu");
os = new DataOutputStream(process.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
os.writeBytes("exit\n");
os.flush();
process.waitFor();
// getprop ro.kernel.qemu == 1 在模擬器
// getprop ro.proct.model == "sdk" 在模擬器
// getprop ro.build.tags == "test-keys" 在模擬器
qemuKernel = (Integer.valueOf(in.readLine()) == 1);
Log.d("com.droider.checkqemu", "檢測到模擬器:" + qemuKernel);
} catch (Exception e){
qemuKernel = false;
Log.d("com.droider.checkqemu", "run failed" + e.getMessage());
} finally {
try{
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {

}
Log.d("com.droider.checkqemu", "run finally");
}
return qemuKernel;
}

2. 檢測keystore簽名,再與之前得做比較

public int getSignature(String packageName) {
PackageManager pm = this.getPackageManager();
PackageInfo pi = null;
int sig = 0;
try {
pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
Signature[] s = pi.signatures;
sig = s[0].hashCode();
} catch (Exception e1) {
sig = 0;
e1.printStackTrace();
}
return sig;
}

3. 檢測包名,版本名和版本號,然後做判斷:

private String getAppInfo() {
try {
String pkName = this.getPackageName();
String versionName = this.getPackageManager().getPackageInfo(
pkName, 0).versionName;
int versionCode = this.getPackageManager()
.getPackageInfo(pkName, 0).versionCode;
return pkName + " " + versionName + " " + versionCode;
} catch (Exception e) {
}
return null;
}

4. 把jpg圖片寫成是png格式得圖片 但是最新版本的apktool已經修復了

5. 花指令,影響jd-gui 但是最新版本的jd-gui已經修復
private static final char[] wJ = "0123456789abcdef".toCharArray();
public static String imsi = "204046330839890";
public static String p = "0";
public static String keyword = "電話";
public static String tranlateKeyword = "%E7%94%B5%E8%AF%9D";
在每個類裡面加入 如上欄位。。。。

https://***/ 一個第三方得」愛加密「網站 1.需要使用官方的打包key工具打包後上傳到"愛加密"網站進行處理,然後到網站上面下載,下載後還要用"愛加密"的打包工具再次進行打包即可。

4. 如何有效的防止Java程序被反編譯和破解

由於Java位元組碼的抽象級別較高,因此它們較容易被反編譯。下面介紹了幾種常用的方法,用於保護Java位元組碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環境和弱點。
1.隔離Java程序
最簡單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實現有多種方式。例如,開發人員可以將關鍵的Java Class放在伺服器端,客戶端通過訪問伺服器的相關介面來獲得服務,而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過介面提供服務的標准和協議也越來越多,例如 HTTP、Web Service、RPC等。但是有很多應用都不適合這種保護方式,例如對於單機運行的程序就無法隔離Java程序。
2.對Class文件進行加密
為了防止Class文件被直接反編譯,許多開發人員將一些關鍵的Class文件進行加密,例如對注冊碼、序列號管理相關的類等。在使用這些被加密的類之前,程序首先需要對這些類進行解密,而後再將這些類裝載到JVM當中。這些類的解密可以由硬體完成,也可以使用軟體完成。
在實現時,開發人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由於安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而後進行解密,最後將解密後的類裝載到JVM當中。在這種保護方式中,自定義的ClassLoader是非常關鍵的類。由於它本身不是被加密的,因此它可能成為黑客最先攻擊的目標。如果相關的解密密鑰和演算法被攻克,那麼被加密的類也很容易被解密。
3.轉換成本地代碼
將程序轉換成本地代碼也是一種防止反編譯的有效方法。因為本地代碼往往難以被反編譯。開發人員可以選擇將整個應用程序轉換成本地代碼,也可以選擇關鍵模塊轉換。如果僅僅轉換關鍵部分模塊,Java程序在使用這些模塊時,需要使用JNI技術進行調用。當然,在使用這種技術保護Java程序的同時,也犧牲了Java的跨平台特性。對於不同的平台,我們需要維護不同版本的本地代碼,這將加重軟體支持和維護的工作。不過對於一些關鍵的模塊,有時這種方案往往是必要的。為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關JNI方法。
4.代碼混淆
代碼混淆是對Class文件進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能(語義)。但是混淆後的代碼很難被反編譯,即反編譯後得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客如果有足夠的時間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研製反混淆的工具。但是從實際情況來看,由於混淆技術的多元化發展,混淆理論的成熟,經過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會詳細介紹混淆技術,因為混淆是一種保護Java程序的重要技術。

5. maven project 怎麼防止反編譯

1.復雜化代碼層次:通過多層抽象、繼承,代碼結構復雜了,反編譯出來的代碼閱讀起來自然難一些了;
2.使用混編器:我用的是proguard,混編出來的代碼基本都是a,b,c什麼的,有一定的效果;
3.打包為exe文件:把jar文件打包為exe文件,也有一定效果。

6. JAR反編譯修改重新打包的問題

用反編譯工具反編譯出jar里的class

把反編譯出來的內容復制到eclipse中

eclipse中src上右擊,export

當然是的 :: 暫時不知道有什麼好辦法
你要重新打包肯定是要修改其中某個class,不必要全部弄

可以把.jar 改成.zip 兩中壓縮的格式演算法一樣,只開始相差四個位元組
改成zip後把裡面你要改的class這樣處理一下再放進去,
然後把後綴還改回來

7. java的打包後jar包裡面的class文件都能被反編譯成為源碼

jd-gui這個工具可以進行反編譯的操作。 不過反編譯的質量隨著混淆的程度而定。
特別復雜的代碼(如加密演算法)反編譯一般都有問題。可以建議用 javap -c -p 來看位元組碼。然後參考jvm指令。
一般編譯的文件,都可以反編譯為源碼,但如果是經過加密、以及代碼異常復雜,是很難恢復全部的源碼。

8. 請教:對Java類庫jar文件,有什麼好的防止反編譯辦法,最好是加密/解密方案,而不是代碼混淆方案。

很久前做過一個項目,用很復雜的演算法加密 class文件,然後在虛擬機載入前調用解密程序。用的是 jvmti。這樣可以防止class loader被反編譯導致加解密演算法泄漏,應該算比較好的一種解決方案了。

9. Java中Jar包為什麼能輕易就給反編譯了

java中jar包輕易的被反編譯是由於java的特性決定的。java中的jar包的實質內容是java源代碼編譯後的.class文件,由於java的面向對象特性和java的反射技術,可以很容易的通過對.class文件進行反射來得到java的源代碼,也就是反編譯!對於java的反編譯,並不是所有內容都會反編譯出來,java源文件中的注釋、泛型等內容在經過編譯和反編譯之後會丟失。

10. myeclipse 生成jar 怎麼防止反編譯

1.下載MyEclipse反編譯Class文件的工具

2.工具的安裝

下載後上面的工具之後,解壓出來,我們可以看到有兩個文件:jad.exe、net.sf.jadclipse_3.3.0.jar 。

第一步:我們將jad.exe文件放到JDK的bin目錄下

第二步:將 net.sf.jadclipse_3.3.0.jar 拷貝到 MyEclipse安裝目錄下的plugins目錄下面D:

第三步:在D:-8.6dropins創建一個eclipse文件夾.

第四步:在創建好的eclipse文件夾下,分別創建featues、plugins兩個文件夾.

第六步:將net.sf.jadclipse_3.3.0.jar 文件分別拷貝到創建好的featues、plugins兩個文件夾裡面.

第七步:重新啟動MyEclipse,在Windows——>Perference——>Java下面應該會多出一個JadClipse目錄. 如果沒有出現的話,多試幾次就OK了,我當時也是這樣.

第八步:點擊JadClipse,在右邊的窗口中配置JadClipse. 設置path to decompiler為jad.exe的全路徑,如:C:jdkinjad.exe,在Directory for temporary files中指定l臨時文件路徑,如 :D:-8.6 esult ,其中result是新建一個文件夾. 同時需要選中 User Eclipse code formatter ,這樣編譯出來的Java 代碼會和Class文件的格式一樣.

為了避免編譯後的中文亂碼問題,我們需要配置Misc

第九步:安裝完成之後,雙擊Class文件,MyEclipse就自動反編譯了.如果沒有出現想要的結果,需要檢查一下「*.class」默認關聯的編輯器為「JadClipse Class File Viewer「

關聯之後,就可以自動的反編譯啦!

閱讀全文

與防止jar反編譯相關的資料

熱點內容
工作三年的大專程序員 瀏覽:726
java畢業設計文獻 瀏覽:140
籌碼集中度指標源碼 瀏覽:478
listsortjava 瀏覽:183
plc閃光電路編程實例 瀏覽:299
socket編程試題 瀏覽:204
華為的伺服器怎麼設置從光碟機啟動 瀏覽:868
程序員真的累嗎 瀏覽:326
學信網app為什麼刷臉不了 瀏覽:873
天蠍vs程序員 瀏覽:994
單片機下載口叫什麼 瀏覽:188
程序員的道 瀏覽:926
雲伺服器不實名違法嗎 瀏覽:558
怎樣查看文件夾圖片是否重復 瀏覽:995
文件怎麼導成pdf文件 瀏覽:808
打開sql表的命令 瀏覽:103
安卓手機如何面部支付 瀏覽:38
天元數學app為什麼登錄不上去 瀏覽:824
明日之後為什麼有些伺服器是四個字 瀏覽:104
安卓系統l1是什麼意思 瀏覽:26