Android簡介
Android是一種基於Linux的自由及開放原始碼的作業系統,主要使用於移動設備,如智慧型手機和平板電腦,由Google公司和開放手機聯盟領導及開發。Android上的APP絕大部分是使用Java語言開發,編譯時會編譯成Dalvik位元組碼(即dex檔案),運行時由Android自帶的Davik虛擬機解釋執行。由Java開發的APP很容易被逆向破解,目前市面上已有的Java程式反編譯工具有baksmali、jd-gui、apktool等。為防止APP被逆向破解,對抗反編譯工具成為重要手段,常見方法有:使反編譯工具無法正常運行、代碼混淆 等。Android代碼混淆技術
代碼混淆技術基本原理是使反編譯工具反編譯出來的代碼人難以閱讀,從而達到防止被逆向破解的目的。PC上的代碼混淆技術已經很成熟,有加花指令、多態變形等技術手法,Android代碼混淆技術才剛剛起步,目前已知的技術手法如下。Java類名、方法名混淆
Dalvik位元組碼包含了大量的調試信息,如類名、方法名、欄位名、參數名、變數名等,使用反編譯工具可以還原這些信息。由於類名、方法名等通常都會遵循一定的命名規範,破解者很容易根據這些信息來猜測代碼功能,閱讀起來就跟查看原始碼一樣。從Android 2.3開始,Google在SDK中加入了一款叫ProGuard的代碼混淆工具,ProGuard會刪除這些調試信息,並用無意義的字元序列來替換類名、方法名等,使得使用反編譯出來的代碼難以閱讀,提升逆向難度。使用ProGuard混淆過過後,反編譯出來的類名和方法名無法閱讀,但是反編譯出來的功能代碼仍然是非常容易閱讀的,和原始碼差不多,破解者仍通過閱讀功能代碼來自行標記類名、方法名等,然後逆向破解。Java代碼混淆
通過對功能代碼流程進行亂序混淆,實際運行時亂序混淆後的代碼流程卻和原始代碼流程是一樣的,但反編譯出來的代碼流程靜態閱讀時與原始流程有很大差異,使破解者很難通過靜態分析理解代碼功能,從而保護代碼不被逆向分析。比如,原始的代碼流程是1->2->3->4->5->6->7,經過亂序混淆後靜態反彙編查看到的代碼流程可能變成2->7->5->1->6->4->3,實際運行時代碼流程仍然是1->2->3->4->5->6->7。目前使用這種代碼混淆技術的Android保護工具有APKProtect。