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,