又到週末一我的侘在家裏無事可幹,這就是程序員的悲哀啊。好了咱們利用週末的時間繼續介紹android apk防止反編譯技術的另外一種方法。前三篇咱們講了加殼技術(http://my.oschina.net/u/2323218/blog/393372)、運行時修改字節碼(http://my.oschina.net/u/2323218/blog/396203)和僞加密(http://my.oschina.net/u/2323218/blog/399326),若是有不明白的能夠查看個人博客的前三篇中關於這三種技術的介紹。接下來咱們將介紹另外一種防止apk反編譯的技術-對抗JD-GUI。java
1、對抗JD-GUI原理android
一般在對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源碼了。程序員
2、原理實現web
(1)假如咱們的apk onCreate的函數實現以下:微信
?微信公衆平臺
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文件ide
(3)用JD-GUI打開咱們的jar文件就能夠看到咱們的apk onCreate函數的源碼了。以下:函數
(4)這時咱們在apk onCreate函數裏面加上不可能的特殊分支語句,代碼以下:工具
?加密
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
;
}
}
|
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,下一篇咱們將講解另外一種android apk防止反編譯技術,期待你們的捧場。若是對這篇講的技術有任何疑問:
歡迎關注我的微信公衆平臺:程序員互動聯盟(coder_online),掃一掃下方二維碼或搜索微信號coder_online便可關注,咱們能夠在線交流。