Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發之反編譯與防止反編譯

Android開發之反編譯與防止反編譯

編輯:關於Android編程

Android開發之反編譯與防止反編譯

防止反編譯是每個程序員的必修課,因為當你辛辛苦的研發一個應用,被人家三下五除二給反編譯了,是一件多麼尴尬的事啊。那麼如何防止反編譯啊?這裡就用Google Android自帶的代碼混編的方式來防止反編譯。孫子兵法中講得好:“知彼知己百戰不殆”,所以在講解防止反編譯之前,先讓我們了解一下如何反編譯一個應用。

一、反編譯Android應用

實驗環境:

Windows8.1企業版、dex2jar-0.0.9.9

反編譯工具包:

Android反編譯工具包(升級版)

1.將Apk反編譯得到Java源代碼

具體步驟:

1) 首先將apk文件後綴改為zip並解壓,得到其中的classes.dex,它就是java文件編譯再通過dx工具打包而成的,將classes.dex復制到dex2jar.bat所在目錄dex2jar-0.0.9.9文件夾。

在命令行下定位到dex2jar.bat所在目錄,運行

dex2jar.bat classes.dex

如圖:

dex2jar.bat    classes.dex

生成classes_dex2jar.jar

如圖:

生成classes_dex2jar.jar

2) 進入jdgui文件夾雙擊jd-gui.exe,打開上面生成的jar包classes_dex2jar.jar,即可看到源代碼了,如下圖:


2. 將apk反編譯生成程序的源代碼和圖片、XML配置、語言資源等文件

具體步驟:

1) 下載上述反編譯工具包,打開apk2java目錄下的apktool1.4.1文件夾,內含三個文件:apktool.jar ,aapt.exe,apktool.bat,

注:裡面的apktool_bk.jar是備份的老版本,最好用最新的apktool.jar

在命令行下定位到apktool.bat文件夾,輸入以下命令:apktool.bat d -f abc123.apk abc123

如下圖:

上圖中,apktool.bat 命令行解釋:apktool.bat d -f [apk文件 ] [輸出文件夾]



    
    
    
    
    
    
        
            
                
                
            
        
        
        
        
        
    


將反編譯完的文件重新打包成apk,很簡單,輸入apktool.bat b abc123(你編譯出來文件夾)即可,命令如下:

打包apk後的文件在目錄C:\HelloAndroid下,生成了兩個文件夾:

build

dist

其中,打包生成的HelloAndroid.apk,在上面的dist文件夾下,Ok


3. 圖形化反編譯apk

上述步驟一、二講述了命令行反編譯apk,現在提供一種圖形化反編譯工具:Androidfby

首先,下載上述反編譯工具包,打開Androidfby目錄,雙擊Android反編譯工具.exe,就可以浏覽打開要反編譯的apk文件。

圖形化反編譯apk


二、防止應用被反編譯

先介紹一下什麼是代碼混淆:

代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為。代碼混淆可以用於程序源代碼,也可以用於程序編譯而成的中間代碼。執行代碼混淆的程序被稱作代碼混淆器。目前已經存在許多種功能各異的代碼混淆器。

將代碼中的各種元素,如變量,函數,類的名字改寫成無意義的名字。比如改寫成單個字母,或是簡短的無意義字母組合,甚至改寫成“__”這樣的符號,使得閱讀的人無法根據名字猜測其用途。重寫代碼中的部分邏輯,將其變成功能上等價,但是更難理解的形式。比如將for循環改寫成while循環,將循環改寫成遞歸,精簡中間變量,等等。打亂代碼的格式。比如刪除空格,將多行代碼擠到一行中,或者將一行代碼斷成多行等等。

混淆前和混淆後反編譯出來的代碼對比:

混淆前和混淆後反編譯出來的代碼對比

提示:有心的朋友可以發現:混淆後生成apk文件比混淆前生成的apk文件要小不少。這樣不僅減小了項目的大小而且可以提高代碼的執行速度。如下圖:

混淆前和混淆後反編譯出來的代碼對比2

具體步驟:

1) 查看項目中有沒有proguard.cfg。

如果沒有的話從這下載:

proguard.cfg

然後將proguard.cfg復制到項目中。

2) 在項目中的project.properties文件中添加:proguard.config=proguard.cfg

3) 然後按照正常的簽名對自己的應用進行簽名,生成後的apk經過反編譯後就會和源代碼有很大的不一樣。

注意:一定要通過正常的簽名方式對應用進行簽名,項目bin目錄中生成的apk文件是使用系統默認簽名的方式,沒有達到代碼混編的效果的。

如果簽名不成功請往下看:

4) 不過這一步你會遇到很多問題,根本就簽名不成功。例如:①如果工程引入了android-support-v4的jar類庫,那麼在工程打包混淆時,就會出現報錯提示你:You may need to specify additional library jars (using'-libraryjars')。②引用第三方包等問題

如果工程引入了android-support-v4的jar類庫,那你就在proguard.cfg裡的後面,添加如下內容:

-libraryjars /android-support-v4.jar

-dontwarn android.support.v4.**

-keep class android.support.v4.** { *; }

-keep public class * extendsandroid.support.v4.**

-keep public class * extendsandroid.app.Fragment

然後你再打包看看,應該可以正常生成apk安裝包了。

如果出現:"類1 can't find referenced class 類2" 字面上的意思就是類1找不到類2的引用;它會建議你:"You may need to specify additional library jars (using'-libraryjars').";

需要使用-libraryjars加上項目中使用到的第三方庫就OK了。

例如:-libraryjars /android-support-v4.jar

注意:這裡引用方式是當前工程的根目錄(也可以配置其他目錄),也就是說,你要把第三方jar放到當前目錄下,否則就會警告說找不到jar文件!

如果出現: can't find superclass or interfaceandroid.os.Parcelable$ClassLoaderCreator,碰到這樣的情況,可以使用-dontwarncom.xx.yy.**,不對錯誤提出警告。

注意:使用這個方式的話,要確保自己沒有用到這個庫裡面的類!否則就會拋ClassNotFoundException!

如果在工程中確實用到了該類,采用上面方式還是不行。這個時候就要再增加一項:-keep class com.xx.yy.** { *;},讓當前類不混淆。

總結:

對於引用第三方包的情況,可以采用下面方式避免打包出錯:

-libraryjars /aaa.jar

-dontwarn com.xx.yy.**

-keep class com.xx.yy.** { *;}

最後打包成功,祝君成功混淆加密!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved