APK反編譯-混淆

放下你的浮躁伸刃,放下你的懶惰谎砾,放下你的三分鐘熱度,放空你禁不住誘惑的大腦捧颅,放開你容易被任何事物吸引的眼睛景图,放淡你什么都想聊兩句八卦的嘴巴,靜下心來做你該做的事碉哑,該好好努力了挚币!有時候真的努力后,你會發(fā)現(xiàn)自己要比想象的優(yōu)秀很多妆毕。記住一句話笛粘,越努力,越幸運

APK你不加固就好比一個妹子全裸在你面前,你可以看到里面的源碼例诀,很危險,哪怕是現(xiàn)在市面上一些APP也有百分之三十左右也沒有加固的扔罪。當然也可以用第三方框架加密矿酵。

一般APP快上線的時候,我們才會做這一步,一年也就這么幾次评疗,因為我是做SDK開發(fā)的砌些,所以經(jīng)常混淆不可避免有巧。

目前反編譯工具有四類

1示姿、apktool 主要用于資源文件的獲取
2岂傲、dex2jar 將apk中的dex文件編譯成jar文件
3、jd-gui 查看反編譯后的jar中的class
4褂痰、jadx 直接查看資源與代碼

apktool:如果APK未加固归薛,解壓后可以看到APK里面的一些資源文件,比如我們看中了某個APP的一些UI控件,或者想分析AndroidManifest里面的啟動是怎樣的诅炉,或者游戲apk包需要改icon和名稱,直接用apktool解壓就行了。

網(wǎng)上隨便找一個apktool版本瞻凤,盡量高一點的,我們反編譯可以用這種方式蛛壳。在當前目錄浮创,存在一個apktool和一個apk溜族,并且在當前目錄打開cmd文件,輸入java -jar apktool_2.4.0.jar d app-debug.apk -o dir摧玫,最后可以得到一個dir文件闸婴,資源什么的都出來了对竣。對于僅僅只需要反編譯需求蛋褥。


image.png

指令很多,我通常用我自己的一套反編譯方法,有反編譯,回編譯。
反編譯:需要當前目錄的apk,apktool.jar,apktool.bat,執(zhí)行命令后就會得到一個test的文件夾,注意配置好jdk環(huán)境變量啥的。

image.png

xdqxz.keystore是你的簽名文件遥倦,里面包含簽名密碼和alias
Test.apk是要反編譯的目標apk
apktool是你要反編譯工具的版本,名稱就改成apktool
apktool.bat里面的東西為下圖

@echo off
set PATH=%CD%;%PATH%;
java -jar "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9

Test文件夾就是你反編譯之后的文件夾

回編譯
比如我改了游戲apk里面的icon等等之后,想讓他重新變?yōu)樾碌腶pk
我先把Test文件夾改成huanxiang這個名字,其實改成什么名字都一樣,到時候執(zhí)行命令的時候要同步變化即可
apk解壓后的文件變成APK,但這僅僅是沒簽名的APK
apktool b huanxiang -o new_huanxiang_unsign.apk

image.png

要變成簽名的apk執(zhí)行命令jarsigner -verbose -keystore xdqxz.keystore -storepass 123456 -keypass 123456 -signedjar new_huanxiang_signed.apk new_huanxiang_unsign.apk android.keystore -sigalg SHA1withRSA -digestalg SHA1


image.png

dex2jar是將apk中的dex文件編譯成jar文件
如果我們有個apk赶撰,想看編譯apk里面dex文件的源碼瘤载,可以用這個工具墨技。
下載dex2jar工具,在工具當前目錄打開cmd文件挎狸,如果目標文件叫app-debug.apk
執(zhí)行命令d2j-dex2jar.bat app-debug.apk -o app-debug.jar就可以在當前目錄得到一個app-debug.jar的jar包
然后用jdu工具去查看這個jar包里面的東西就可以了扣汪。直接把jar拖進去就可以看

image.png

jadx
這個工具的作用就是直接可以查看apk里面的代碼,雙擊jadx工具選擇對應的apk就會出現(xiàn)目錄結構锨匆。

image.png

混淆

Proguard是一個代碼優(yōu)化和混淆工具崭别。
能夠提供對Java類文件的壓縮、優(yōu)化恐锣、混淆茅主,和預校驗。壓縮的步驟是檢測并移除未使用的類侥蒙、字段暗膜、方法和屬性。優(yōu)化的步驟是分析和優(yōu)化方法的字節(jié)碼鞭衩⊙眩混淆的步驟是使用短的毫無意義的名稱重命名剩余的類娃善、字段和方法。壓縮瑞佩、優(yōu)化聚磺、混淆使得代碼更小,更高效炬丸。

開啟proguard

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

我們常用的混淆方法其實可以有個模板在AS里面能找到


image.png

可以拿以上圖左參考瘫寝,混淆的規(guī)則還是挺多的,講幾個最常用稠炬,用的最多最有效的吧焕阿。

我們代碼里面很多沒有在程序里面使用過調(diào)用過的類,打包出去的時候可以混淆過濾掉首启,可以在根目錄的proguard-rules.pro文件里面添加-dontoptimize屬性暮屡,一般來說這個屬性都要添加。

另外用的最多的混淆的三個地方就是:

-keep 指定類和類成員(變量和方法)不被混淆毅桃。
    -keep class com.dongnao.proxy.guard.test.Bug
    (保護了類名)
    -keep class com.dongnao.proxy.guard.test.Bug{
        public static void *();
    }
    (保護了 public static void的沒有參數(shù)的函數(shù))
    -keep class com.dongnao.proxy.guard.test.Bug{
        *褒纲;
    }
    (保護所有)
-keepclassmembers 指定類成員不被混淆(就是-keep的縮小版,不管類名了)钥飞。
    -keepclassmembers
    class com.dongnao.proxy.guard.test.Bug
    (都被混淆了)
-keepclasseswithmembers 指定類和類成員不被混淆莺掠,前提是指定的類成員存在。
    -keepclasseswithmembers class   com.dongnao.proxy.guard.test.Bug
    (保護類名读宙,但是沒指定成員彻秆,所以函數(shù)名被混淆)
    -keepclasseswithmembers class       com.dongnao.proxy.guard.test.Bug{
        native <methods>;
    }

全被混淆了。注意 前提是指定的類成員存在 因為不存在native函數(shù)论悴,所以這條語句等于無效掖棉,

然后混淆后的apk通過jadx來查看,就會看到類名變成了a/b/c這樣的膀估。那如果我們集成了類似友盟幔亥、bugly等異常上報功能,那么我們怎么知道這個異常到底出現(xiàn)在哪里察纯?

我們在Activity中主動寫一個bug
image.png

然后生成一個debug的apk


image.png

運行產(chǎn)生這樣的日志:
image.png

這個日志有兩個問題:
1帕棉、 我們不知道是哪個類報告出的。
2饼记、 不知道這個類是哪一行報出的香伴。

混淆后的代碼錯誤棧恢復方法(outputs/mapping/debug/mapping.txt文件中保存了混淆前后的對應關系)
1.把錯誤信息保存到文件
2.使用工具 sdk/tools/groguard/bin/retrace.bat先配置 -keepattributes SourceFile,LineNumberTable再執(zhí)行 retrace.bat -verbose mappint文件 bug文件

第一個問題很顯然是由于我們的代碼進行了混淆具则。
在開啟混淆后即纲,我們生成apk會產(chǎn)生


image.png

dump.txt
說明 APK 中所有類文件的內(nèi)部結構。
這個文件內(nèi)容非常多博肋,可讀性也并不高

mapping.txt
提供原始與混淆過的類低斋、方法和字段名稱之間的轉換蜂厅。

seeds.txt

列出未進行混淆的類和成員。我們保護的zip沒有被混淆
image.png

usage.txt
列出從 APK 移除的代碼膊畴【蛟常可以在這個文件中查看是不是有我們不想被移除的類

image.png

最重要的當然就是我們的mapping文件了。通過這個文件我們就能定位到:


image.png

出現(xiàn)錯誤的函數(shù)是Bug類中的test函數(shù)唇跨。

我們現(xiàn)在比較簡單稠通,所以一下子就能定位到錯誤函數(shù),如果函數(shù)層級較深买猖,光靠自己比對來查找難度就比較大了改橘。所以sdk中提供了一個工具在tools/proguard/bin中。
我們把logcat里面保存的錯誤堆棧復制到一個文件中:


image.png

然后執(zhí)行retrace 腳本(在 Windows 上為 retrace.bat政勃;在 Mac/Linux 上為 retrace.sh)
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]

image.png

image.png

現(xiàn)在錯誤日志一句mapping還原了唧龄。
所以我們每次在發(fā)布版本之后都需要保留這個mapping文件。所以一般異常上報平臺都會提供mapping上傳然后幫助我們分析奸远。
第一個問題解決的,第二個問題是行數(shù)顯示的是Unknow Source


image.png

如果希望出現(xiàn)具體行數(shù),我們需要在配置文件中加入
拋出異常時保留代碼行號讽挟,在異常分析中可以方便定位
-keepattributes SourceFile,LineNumberTable


image.png

另外還可以配合
-renamesourcefileattribute AAA
使用字符串"AAA"來替代真正的類懒叛,避免泄漏更多的信息
image.png

雖然我們的代碼經(jīng)過了混淆,但是實際上耽梅,對于有耐心有條件的人來說薛窥,還是能夠從混淆過后的代碼中看到蛛絲馬跡。

dex2jar: java
https://sourceforge.net/projects/dex2jar/

image.png

反編譯后生成了一個jar
image.png

然后使用jd-gui打開:
http://jd.benow.ca/
直接跳到了眼姐,更加方便诅迷。
image.png

所以只要花功夫,混淆完全能夠被完整的解讀出來众旗。當然并不是說混淆就沒用罢杉。混淆之后解讀難度更大了贡歧。
proguard移除無用代碼還能縮小apk大小滩租。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市利朵,隨后出現(xiàn)的幾起案子律想,更是在濱河造成了極大的恐慌,老刑警劉巖绍弟,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技即,死亡現(xiàn)場離奇詭異,居然都是意外死亡樟遣,警方通過查閱死者的電腦和手機而叼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門身笤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澈歉,你說我怎么就攤上這事展鸡。” “怎么了埃难?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵莹弊,是天一觀的道長。 經(jīng)常有香客問我涡尘,道長忍弛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任考抄,我火速辦了婚禮细疚,結果婚禮上,老公的妹妹穿的比我還像新娘川梅。我一直安慰自己疯兼,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布贫途。 她就那樣靜靜地躺著吧彪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丢早。 梳的紋絲不亂的頭發(fā)上姨裸,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音怨酝,去河邊找鬼傀缩。 笑死,一個胖子當著我的面吹牛农猬,可吹牛的內(nèi)容都是我干的赡艰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盛险,長吁一口氣:“原來是場噩夢啊……” “哼瞄摊!你這毒婦竟也來了?” 一聲冷哼從身側響起苦掘,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤换帜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鹤啡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惯驼,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祟牲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隙畜。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖说贝,靈堂內(nèi)的尸體忽然破棺而出议惰,到底是詐尸還是另有隱情,我是刑警寧澤乡恕,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布言询,位于F島的核電站,受9級特大地震影響傲宜,放射性物質(zhì)發(fā)生泄漏运杭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一函卒、第九天 我趴在偏房一處隱蔽的房頂上張望辆憔。 院中可真熱鬧,春花似錦报嵌、人聲如沸虱咧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彤钟。三九已至,卻和暖如春跷叉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背营搅。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工云挟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人转质。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓园欣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親休蟹。 傳聞我的和親對象是個殘疾皇子沸枯,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容