1. 程式人生 > >android防止反編譯系列:如何對抗JD-GUI

android防止反編譯系列:如何對抗JD-GUI

一、對抗JD-GUI原理

通常在對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原始碼了。

二、原理實現

(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檔案

(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即可關注,我們可以線上交流。