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

來源:互聯網
上載者:User

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

產生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檔案。



二、防止應用被反編譯

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

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

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

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


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


具體步驟:

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.** { *;}

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.