1、對抗JD-GUI原理 java
一般在對apk進行反編譯的時候用到的最多的兩個工具就是apk-tool和dex2jar。利用這兩個工具將apk首先反編譯成classes.dex而後再將classes.dex反編譯成jar文件或者將apk直接反編譯成jar文件;獲得jar文件之後就能夠利用JD-GUI將獲得的jar文件打開就能夠直接查看apk的java源碼了。咱們花了那麼大心思寫的程序就這麼容易被別人拿到源碼是否是很不甘心,如今我就告訴你對抗JD-GUI查看源碼的方法。咱們在用JD-GUI查看源碼時有時有些函數的根本看不到直接提示error錯誤,咱們就利用這點來保護咱們的apk。原來JD-GUI在將通過混淆處理的jar裏面的class字節碼文件轉成java文件時,遇到函數中根本走不到的分支的特殊實現時就會提示函數error。這時咱們只要查看這些提示error的文件或者函數對應的源碼是有什麼語句引發的,將這些語句加到咱們的源碼中就能夠防止利用JD-GUI去查看咱們的apk源碼了。 ide
2、原理實現 函數
(1)假如咱們的apk onCreate的函數實現以下: 工具
?spa
1
2
3
4
5
|
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
|
(2)將咱們的apk通過混淆處理後通過簽名導出咱們的apk,咱們用dex2jar工具將咱們的apk轉換成jar文件 .net
(3)用JD-GUI打開咱們的jar文件就能夠看到咱們的apk onCreate函數的源碼了。以下: code
(4)這時咱們在apk onCreate函數裏面加上不可能的特殊分支語句,代碼以下: blog
?ci
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
switch
(
0
)
{
case
1
:
JSONObject jsoObj;
String date=
null
;
String second=
null
;
try
{
jsoObj=
new
JSONObject();
date=jsoObj.getString(
"date"
);
second=jsoObj.getString(
"second"
);
}
catch
(JSONException e)
{
e.printStackTrace();
}
test.settime(date,second);
break
;
}
}
|
?get
1
2
3
4
|
class
test
{
public
static
void
settime(String a,String b){}
}
|
(5)咱們用(2)中一樣的方法將apk轉成jar文件,而後用JD-GUI打開會看到提示error錯誤。以下:
根據上面的講述相信你們對對抗JD-GUI的方法有了必定的瞭解,我只是舉了其中的一個方法,之因此說是特殊的分支語句是由於不是全部的分支語句均可以讓JD-GUI提示error。咱們能夠根據原理多注意一些這樣的特殊分支語句以便用來保護咱們的apk,