聲明:本文作者授權微信公眾號Android程序員(AndroidTrending)在微信公眾號平臺原創(chuàng)首發(fā)。
最近一段時間因為瑣事(有公有私)太多茫因,加上搬家后,家里斷網(wǎng)了一周馍忽,雖然有很多東西想寫迅矛,但卻遲遲沒有動手妨猩。好在目前基本事情都搞完潜叛,又可以愉快的寫東西了秽褒,所以,接下來博客更新的頻率將會有所提高威兜。寫博客的好處是很多的哈销斟,一方面總結可以分享也方便自己回顧,另一方面是當作者對知識點理解可能存在局限(或者錯誤)時椒舵,讀者也會幫你指出蚂踊。
前言
本文整理了一些自己在開發(fā)過程中經(jīng)常會用到的競品分析工具,這些工具可以幫助分析競品笔宿。讓我們得以了解競品相應的一些技術信息犁钟,例如:代碼質(zhì)量、某種業(yè)務的實現(xiàn)方式泼橘、用了什么第三方庫等涝动。除此之外,也有一些高端玩家會玩起 HOOK 炬灭,更有甚者是通過修改代碼然后進行二次打包醋粟。當然這些損害開發(fā)者利益的事情,是不值得提倡的重归。但如果只是出于學習的目的米愿,我是十分建議多折騰的。
提前聲明:
- 本文只對工具做簡要功能介紹鼻吮,要求面面俱到講解每個工具使用育苟,本人表示能力有限啊椎木;
- 下文所介紹的工具违柏,都會附上這些工具的官方地址以及相應的使用教程鏈接(如果有)笨腥;
- 有童鞋對下文提到的工具已經(jīng)用得出神入化,歡迎寫成文章勇垛,可以的話脖母,也歡迎給個鏈接讓我補充進本文,順帶學習一下闲孤;
- 本文所有提到的工具只做分析學習使用谆级,請不要拿去做損害他人利益的事情;
Apk 內(nèi)部結構
為了方便介紹工具讼积,需要先簡單科普一下 Apk 的內(nèi)部結構肥照,已經(jīng)很熟悉的童鞋可以忽略此章節(jié)。需要注意的是勤众,這里介紹的 Apk 結構并不包含加固的情況舆绎,雖然很多廠家推出了加固服務用于對抗反編譯,但是加固也有諸多的問題存在们颜,另外基本上分析的大廠應用都沒有發(fā)現(xiàn)有加固的吕朵,可能也是考慮到加固后安裝包存在的諸多問題吧。
直接使用 Android Studio 創(chuàng)建一個 HelloWorld 的 Moudle窥突,然后打個 release 的 Apk 安裝包努溃,并修改后綴 apk 為 zip 后進行解壓,可以看到下面一個標準的結構:
- META-INF: 存放簽名文件簽名信息的目錄阻问,用于系統(tǒng)簽名校驗
- res: 存放資源文件的目錄梧税,包含項目中的 xml 和 圖片資源等
- AndroidManifest.xml: Android項目中的配置文件
- classes.dex: 由Java產(chǎn)生的字節(jié)碼文件打包生成為虛擬機可以解讀的字節(jié)碼文件,所有的源碼都在其中
- resources.arsc: 資源文件的ID索引表称近,如:layout第队、drawable、mipmap都會在R文件生成相應的ID資源
- 其他目錄:開發(fā)者自行添加的目錄刨秆,如:存放資源的 asserts 凳谦、存放依賴包的 lib 目錄等
上面介紹完了一個最基本的 Apk 解壓后的目錄結構,下面直接拿微信作為示例坛善,看看大廠應用的結構是怎樣的:
我們可以看到微信除包含了上面提到的晾蜘,還有 asserts、lib眠屎、r 這三個自行添加的目錄剔交,至于前兩個目錄是干嘛的上面已經(jīng)提到,r 目錄里面主要存放了一些 svg 和 xml 文件改衩,有興趣可以自行試試岖常。如果要問為什么微信有3個dex文件的話,只能說它超了 Android 系統(tǒng)設定 65k 方法的限制葫督,所以有多個dex包竭鞍。
OK板惑,關于 Apk 的目錄結構介紹基本到此,這有助于我們?nèi)ダ斫庀旅婕磳⒁榻B的工具偎快!
Apktool
工具名:Apktool
官網(wǎng):http://ibotpeaches.github.io/Apktool/
源碼:
- Github地址:https://github.com/iBotPeaches/Apktool
- Bitbucket地址:https://bitbucket.org/iBotPeaches/apktool/downloads
配置文檔:http://ibotpeaches.github.io/Apktool/install/ 冯乘, 教你如何配置 Apktool 的使用環(huán)境
使用文檔:http://ibotpeaches.github.io/Apktool/documentation/ , 教你各種基本的命令的使用
功能:
- 還原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等文件晒夹;
- 對 Apk 進行重新(二次)打包裆馒;
- 反編譯依賴于 Framework 的 apk 文件;
- 運行調(diào)試 Smali 文件丐怯;
下面以微信的Apk為例簡要介紹每個功能喷好。
1、還原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等文件读跷。通過DOS窗口去到Apktool目錄下梗搅,執(zhí)行如下命令
apktool d XXX.apk
可以看到上圖的反編譯過程中打印信息日志,以及反編譯成功后得到的微信目錄效览。反編譯成功后无切,進入微信目錄可以看到如下的目錄結構
2、對 Apk 進行重新(二次)打包钦铺。通過DOS窗口去到Apktool目錄下订雾,執(zhí)行如下命令:
apktool b 目錄名
本想對微信做重新打包,結果發(fā)現(xiàn)微信果然做了處理了矛洞,打包不成功,大廠考慮得好周到烫映。于是狡猾的拿了另一個對象試手沼本,果然一下子搞定了
可以去到反編譯生成目錄下的dist目錄看到我們重新打包好后的 Apk
這個功能主要有兩個應用場景,一個是對應用進行本地化處理锭沟,例如反編譯后對應用進行漢化抽兆。另一個是無恥的對應用進行廣告植入,重新打包發(fā)放市場并以此牟利(非常強烈的不贊同大家去這么做)族淮。
3辫红、反編譯依賴于 Framework 的 apk 文件。這個功能我并沒有用過祝辣,但是也做了大致的了解贴妻。舉個例子(摘自網(wǎng)絡的栗子):一般來說,你在使用 Apktool 進行反編譯前不需要做其他的事情蝙斜,然而由于有的廠商名惩,如HTC,三星等孕荠,他們定制了 Framework 文件并且在他們的系統(tǒng)應用中使用了這些文件娩鹉,這時攻谁,為了能正常的反編譯這些Apk文件,你就必須從你的設備中拷貝出framework文件并且安裝到apktool中弯予。對這個功能感興趣的童鞋戚宦,可以直接查看這篇文章:http://bbs.gfan.com/android-2657915-1-1.html
4、運行調(diào)試 Smali 文件锈嫩。首先需要解釋一下什么是Smali阁苞,它是 Android 虛擬機所使用的一種機器語言,差不多可以理解成匯編語言那樣子祠挫。利用 Apktool 反編譯后那槽,classes.dex 會被翻譯成 Smali 源代碼
去到下面隨便找個目錄打開,可以看到都是后綴為 smali 的文件等舔,
隨便找個文件打開你會發(fā)現(xiàn)骚灸, smali 的語法還是比較好理解的
有興趣想要了解 smali 語法的,可以看看這位作者寫的文章:http://blog.isming.me/2015/01/14/android-decompile-smali/慌植∩跎看到這里你可能會想問,了解 smali 的語法有什么用呢蝶柿?哈丈钙,非常簡單粗暴,如果懂語法交汤,就能讀懂人家的應用里面的業(yè)務邏輯雏赦,還可以加以修改等。 再加上 Apktool 提供的調(diào)試 Smali 功能芙扎,可以玩得很爽星岗。但是在 2.0.3 的版本上,作者已經(jīng)宣布廢棄此功能戒洼,到了 2.1 時此功能已經(jīng)完全移除掉了俏橘。這也并不意味這我們無法玩轉(zhuǎn) smali 文件。感興趣的童鞋可以直接玩耍下面這個 smali 調(diào)試插件:
SmaliIdea:https://github.com/JesusFreke/smali/wiki/smalidea
反正我一看到 SmaliIdea 是震驚了圈浇。目前 SmaliIdea 最新的版本是 0.03寥掐,喜歡玩耍的童鞋可以到下面的下載地址中:
找到最新版的 SmaliIdea 進行安裝使用
對了,這個插件是基于 IntelliJ IDEA / Android Studio 的磷蜀,還在 Eclipse 下擼碼的童鞋可以忽略召耘。
使用 Apktool 需要注意還需要注意以下幾點:
1、下載完 Apktool 后蠕搜,記得要把 jar 文件改成 apktool.jar怎茫,與 apktool.bat 同名;
2、如果之前使用過舊版的 apktool 轨蛤,記得到自己對應的用戶目錄下將 1.apk 文件刪除蜜宪,否則會造成反編譯失敗祥山;
Clock 是我在 Windows 下的用戶目錄圃验,其他童鞋自己換成自己對應的用戶目錄即可。
3缝呕、不要拿去使用 Apktool 去干違法盜版的事情澳窑,這也是工具的作者特別強調(diào)的;
dex2jar
工具名:dex2jar
官網(wǎng):https://sourceforge.net/projects/dex2jar/
源碼:
- Github地址:https://github.com/pxb1988/dex2jar
- Bitbucket地址:https://bitbucket.org/pxb1988/dex2jar
配置文檔:很簡單供常,去官網(wǎng)鏈接直接下載到本地即可
使用文檔:同樣比較簡單摊聋,直接看下面示例,或者 Google 一下
功能:
- 將 dex 文件還原成為 jar 文件栈暇;
- 將 dex 文件還原成為 smali 文件麻裁;
- 其他一些命令行很少用,喜歡折騰的童鞋源祈,同樣自行摸索煎源;
繼續(xù)拿微信開刀,解壓 Apk 去除一個 dex 包香缺,對其進行如下命令行操作
d2j-dex2jar.bat dex文件名
可以看到生成一個對應的 jar 包手销,這樣就可以結合下一個工具很方便的查看源代碼了。如果想要將 dex 轉(zhuǎn)換成 smali 图张,同樣可以執(zhí)行如下操作:
d2j-dex2smali.bat dex文件名
classes-out 目錄中就可以看到由 dex 包生成的所有 smali 文件了锋拖。想必大家也留意到所有的文件都存在同名但是后綴不同的兩份
bat 后綴的是 Windows 用戶可以調(diào)用的批處理文件,sh 后綴的則是 Linux 用戶的 Shell 腳本埂淮。根據(jù)自己的環(huán)境去選擇用 bat 還是 sh 即可姑隅。
jd-gui
工具名:jd-gui
官網(wǎng):http://jd.benow.ca/
源碼:https://github.com/java-decompiler/jd-gui
功能:
- 查看 dex 文件還原成為 jar 文件代碼;
- 將 jar 文件中所有的 class 文件轉(zhuǎn)換成為 java 文件倔撞;
使用很方便,下載后慕趴,直接把用 dex2jar 生成的微信 jar 包拖曳進去即可查看到對應的源代碼痪蝇。
也可以去到工具欄選擇 File -> Save 或者 File -> Save All Sources 將單個 class 文件或者整個 jar 包保存成為 java 文件∶岱浚可惜的是躏啰,這個工具的作者從 2015 年開始就停止了維護,所以遲早尋求一個替代品耙册。網(wǎng)上有童鞋說给僵,jadx 不錯,可以取代 jd-gui 。我自己還沒玩過帝际,童鞋們可以自行試試:
jadx:https://github.com/skylot/jadx
enjarify
工具名:enjarify
源碼:https://github.com/google/enjarify
配置文檔:下載源碼到本地蔓同,并安裝 Python3 的環(huán)境,同時配置好環(huán)境變量
使用文檔:可以參考上面的源碼地址中的說明蹲诀,或者烏云平臺的文章 http://wiki.wooyun.org/android:tools:enjarify
功能:可直接將 apk 文件還原成為 jar 文件斑粱,也可以和 dex2jar 一樣,直接操作某個dex
這是 Google 出品的一個逆向分析工具脯爪,從反編譯成 jar 包的流程來說则北,要比 dex2jar 方便得多。下載完工具到本地并配置好 Python 環(huán)境后痕慢,需要修改 enjarify 目錄下的 enjarify.bat 文件尚揣,將 python3 改為 python
再通過DOS窗口去到其目錄下,運行如下命令:
enjarify.bat XXX.apk
這里同樣需要注意掖举,一定要將 apk 拷貝到和 enjarify.bat 同級目錄快骗,如果使用 apk 的全目錄的話,會報錯拇泛。
enjarify 相較于 dex2jar 做了更多的優(yōu)化處理滨巴,去避免在反編譯得到 jar 包的過程中出錯。雖然我在使用 dex2jar 的過程中還沒遇到過出錯的情況俺叭,但是在使用 enjarify 時恭取,確實感受到相對更加方便的地方。例如:可以直接對apk進行操作熄守,而不需要先解壓提取classes.dex蜈垮,特別是針對那些本來就不止一個dex包的大型應用。而 enjarfy 也并非萬能的裕照,它目前存在的一些限制攒发,如暫時還無法逆向獲得源文件的屬性、行數(shù)和注釋等晋南。當然惠猿,相信 Google 的工程師也會盡力去優(yōu)化改善 enjarfy 的功能,還是很值得期待的负间。
Procyon
工具名:Procyon
源碼:https://bitbucket.org/mstrobel/procyon
配置文檔:通過下載鏈接 https://bitbucket.org/mstrobel/procyon/downloads 偶妖,下載 jar 包到本地即可
使用文檔:https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler
功能:將反編譯得到 jar 包還原成 java 文件,同時能夠更強的還原代碼的邏輯結構
下面直接對比一下政溃,即可看到 Procyon 的優(yōu)勢所在了趾访。直接去到 Procyon 的目錄下,并將 enjarify 反編譯好的微信 jar 文件放置到同級目錄董虱,同時執(zhí)行如下命令反編譯整個 jar 包:
java -jar procyon-decompiler-0.5.30.jar -jar XXX.jar -o 目錄名
即可看到目錄下指定生成的目錄扼鞋,和控制臺窗口相應的反編譯 log 信息。為了驗證 Procyon 的亮點,我同時將 dex2jar 反編譯微信的某個類拿出來做對比(類名是MCacheItem)得到結果如下:
相同的一個方法體的代碼邏輯云头,圖一是 dex2jar 的捐友,圖二是 Procyon 的,哪個能夠更好的讀懂相信大家自然心中有數(shù)盘寡,像這樣的栗子是很多的楚殿,這里就不一一例舉。除了上面反編譯這個 jar 文件的命令外竿痰,Procyon 還有下面兩個文件使用比較高頻:
java -jar procyon-decompiler-0.5.30.jar 獲取幫助命令
java -jar procyon-decompiler-0.5.30.jar xxx.class 反編譯單個class文件
ClassyShark
工具名:ClassyShark
官網(wǎng):http://classyshark.com/
源碼:https://github.com/google/android-classyshark
配置文檔:通過下載鏈接 https://github.com/google/android-classyshark/releases 脆粥,下載 jar 包到本地即可
使用文檔:
- Github markdown版本:https://github.com/borisf/classyshark-user-guide
- Github PDF版本:https://github.com/google/android-classyshark/blob/master/CommandLine.pdf
- 簡書版本:http://www.reibang.com/p/8e8b88ea2197
功能:可直接瀏覽 Apk,支持對.dex, .aar, .so影涉,.apk, .jar, .class等文件的操作变隔。
ClassyShark 同樣是 Google 的親兒子膘螟,利用它我們可以查看一些 Apk 使用了什么技術方妖,方便作為我們開發(fā)的參考進行使用。同樣以別人家的 Apk 作為分析的栗子稀火,這回不拿微信了鲜棠,因為從 Apk 分析上看肌厨,微信大部分基本上都是用自己的技術,參考價值可能不太大豁陆,換一個目標下手(常常逛知乎柑爸,就拿知乎了)。操作同樣很傻瓜化盒音,去到 ClassShark 的目錄下執(zhí)行如下命令即可:
java -jar ClassyShark.jar -open XXX.apk
可以看到如下界面
我們可以看到如下界面表鳍,左邊包含了 xml 文件、 classes 文件以及 lib 目錄及其所包含的 so 庫祥诽。直接點擊某個 xml 文件即可看到其文件內(nèi)容譬圣,非常方便,不過這個工具的重點不在這里雄坪。直接點擊 classes 目錄下某個 dex 文件
從上面兩張圖中你可以看到知乎兩個 dex 包所包含的方法數(shù)是多少(這個信息對我們可能沒啥用)厘熟,還有就是它使用了 Facebook 開源的圖片加載庫 Fresco、開源數(shù)據(jù)庫 Realm维哈、還有騰訊和新浪的一些SDK盯漂。
如果我切換到另外一個 Tab,還可以看到更多的信息
它分別列出了 Apk 下每個包中的方法數(shù)笨农,并且以直觀的扇形圖展示在右邊。透過這里也可以看到知乎還用了 Apache 的開源庫帖渠、Twitter 的移動開發(fā)檢測平臺 Fabric谒亦、 Rxjava、 Retrofit 以及 Square 出品的 OKIO 庫。發(fā)現(xiàn)大廠引入的開源技術我們也可以進行相應的學習份招,并權衡考慮引入使用切揭。
最后補充一點,ClassyShark 能顯示包中方法數(shù)的這個功能對我們開發(fā)自家產(chǎn)品還是有所幫助的锁摔,假設你引入大量的第三方庫而導致了 Apk 超過了 65K 方法的限制廓旬,可以通過它來查找是哪些第三方庫的方法過多導致。網(wǎng)上很多童鞋都推薦什么計算方法數(shù)的 AS 插件谐腰,個人覺得還不如用 ClassyShark 方便一些孕豹。
TcpDump
工具名:TcpDump
官網(wǎng):http://www.androidtcpdump.com/
下載地址:http://www.androidtcpdump.com/android-tcpdump/downloads
使用文檔:
- Trinea版本:http://www.trinea.cn/android/tcpdump_wireshark/
- MrPeak版本:http://mrpeak.cn/blog/tutorial-tcpdump/
功能:對手機進行網(wǎng)絡抓包,前提是手機已經(jīng)獲取 Root 權限十气。支持 HTTP 和 HTTPS 励背,還支持更多其他協(xié)議。
Tcpdump 的使用就不介紹太多砸西,具體怎么玩可以看上面 Trinea 和 MrPeak 的文章叶眉,已經(jīng)寫得很完善了。TcpDump 沒有GUI芹枷,要查看抓包日志可以通過控制臺窗口衅疙,但明顯很雞肋,為了方便還是把所有網(wǎng)絡日志的抓包信息放到 pcap 文件里面鸳慈,然后結合下面要介紹的 WireShark 進行操作饱溢。
WireShark
工具名:WireShark
官網(wǎng):https://www.wireshark.org/
下載地址:https://www.wireshark.org/#download
使用文檔:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html (非常齊全的文檔)
功能:
- 配置 Tcpdump 生成打 pcap 文件,進行分析蝶涩;
- 或者可以讓電腦建立熱點理朋,手機連上電腦創(chuàng)建的熱點進行抓包,這種方式處理起來更加方便靈活绿聘;
WireShark 支持的協(xié)議也是非常多嗽上,可以看到我抓包出來的結構也非常詳細,WireShark 的基本使用自行參考上面提供的鏈接即可熄攘,如果要玩得很深的話兽愤,需要對網(wǎng)絡協(xié)議有一定深度的了解,童鞋們可以選擇性自由發(fā)揮挪圾。
Fiddler
工具名:Fiddler
官網(wǎng):http://www.telerik.com/fiddler
下載地址:https://www.telerik.com/download/fiddler
使用文檔:直接參考 Trinea 的文章 http://www.trinea.cn/android/android-network-sniffer/ 即可浅萧。
功能:支持對 HTTP 和 HTTPS 兩種協(xié)議進行抓包。
相比 Tcpdump 哲思,它的好處在于手機不需要 Root洼畅,且有自己的 GUI 。不過它只支持 HTTP 和 HTTPS 兩種協(xié)議棚赔。另外在使用時帝簇,手機也需要連接 WIFI 并設置好代理徘郭,具體查看 Trinea 的文章好了。抓包的過程還是能夠獲得不少信息的丧肴,我在抓了新浪微博和微信的包后感受是残揉,微信的防抓包工作比以前做得好了,微博好像就沒發(fā)現(xiàn)有什么變化芋浮,不知道是不是錯覺抱环。
Fiddler 是本文介紹的最后一個工具,需要補充一下纸巷,請教了一些童鞋镇草,它們說 Mac 下使用 Charles 會更爽,額何暇,我是 Windows 用戶陶夜,Mac 下的童鞋就自行折騰吧。
總結
以上就是目前自己常用的一些競品分析工具裆站,有針對 Apk 反編譯的条辟,也有對應用進行網(wǎng)絡抓包的。競品分析并非只是幫助我們?nèi)チ私飧偁帉κ值漠a(chǎn)品宏胯,很多時候我只是出于對某些應用的技術實現(xiàn)感興趣羽嫡,而對其進行一番挖掘,挖掘的過程中你會發(fā)現(xiàn)某種新技術你可以開始學習了肩袍。例如像知乎使用 realm 數(shù)據(jù)庫一樣杭棵,其實 realm 正式版發(fā)布也沒多久,不過既然大廠已經(jīng)投入使用那有空也需要適當?shù)母M學習氛赐,說不定哪天 realm 真的干掉來了 SQLite 呢魂爪。
當然有時候除了學新技術,還派上了另一番用場艰管,諸如某次同事對一個 App 的某些數(shù)據(jù)信息感興趣滓侍,于是乎專門做了爬蟲到網(wǎng)上爬取數(shù)據(jù),后來我反編譯了 App 后大致捋了一遍牲芋,發(fā)現(xiàn)該 App 在 raw 目錄下其實已經(jīng)放著一個本地數(shù)據(jù)庫了撩笆,對比了數(shù)據(jù)基本差別無幾,直接可以拿來用了缸浦∠Τ澹或者可以拿著這些工具來對自家應用動手,找找自家的產(chǎn)品哪里的安全性還不夠裂逐,可以進行完善彌補歹鱼,未嘗不是一件好事。
文章總結到此卜高,本人水平有限醉冤,無法做過多深入講解秩霍,感興趣競品(逆向)分析技術的童鞋可以考慮看看 《Android軟件安全與逆向分析》 或者逛逛看雪論壇膜拜一些大神的奇技淫巧!
- 我的個人博客:http://blog.coderclock.com/
- 我的知乎專欄:https://zhuanlan.zhihu.com/coderclock
- 我的Diycode:https://www.diycode.cc/d_clock
- 我的新浪微博:D_clock愛吃蔥花
- 我的微信公眾號:技術視界