那些值得你試試的 Android 競品分析工具

yangxi_001發表於2016-07-22

最近一段時間因為瑣事(有公有私)太多,加上搬家後,家裡斷網了一週,雖然有很多東西想寫,但卻遲遲沒有動手。好在目前基本事情都搞完,又可以愉快的寫東西了,所以,接下來部落格更新的頻率將會有所提高。寫部落格的好處是很多的哈,一方面總結可以分享也方便自己回顧,另一方面是當作者對知識點理解可能存在侷限(或者錯誤)時,讀者也會幫你指出。

前言

本文整理了一些自己在開發過程中經常會用到的競品分析工具,這些工具可以幫助分析競品。讓我們得以瞭解競品相應的一些技術資訊,例如:程式碼質量、某種業務的實現方式、用了什麼第三方庫等。除此之外,也有一些高階玩家會玩起 HOOK ,更有甚者是通過修改程式碼然後進行二次打包。當然這些損害開發者利益的事情,是不值得提倡的。但如果只是出於學習的目的,我是十分建議多折騰的。

提前宣告:

  • 本文只對工具做簡要功能介紹,要求面面俱到講解每個工具使用,本人表示能力有限啊;
  • 下文所介紹的工具,都會附上這些工具的官方地址以及相應的使用教程連結(如果有);
  • 有童鞋對下文提到的工具已經用得出神入化,歡迎寫成文章,可以的話,也歡迎給個連結讓我補充進本文,順帶學習一下;
  • 本文所有提到的工具只做分析學習使用,請不要拿去做損害他人利益的事情

Apk 內部結構

為了方便介紹工具,需要先簡單科普一下 Apk 的內部結構,已經很熟悉的童鞋可以忽略此章節。需要注意的是,這裡介紹的 Apk 結構並不包含加固的情況,雖然很多廠家推出了加固服務用於對抗反編譯,但是加固也有諸多的問題存在,另外基本上分析的大廠應用都沒有發現有加固的,可能也是考慮到加固後安裝包存在的諸多問題吧。

直接使用 Android Studio 建立一個 HelloWorld 的 Moudle,然後打個 release 的 Apk 安裝包,並修改字尾 apk 為 zip 後進行解壓,可以看到下面一個標準的結構:

  • META-INF: 存放簽名檔案簽名資訊的目錄,用於系統簽名校驗
  • res: 存放資原始檔的目錄,包含專案中的 xml 和 圖片資源等
  • AndroidManifest.xml: Android專案中的配置檔案
  • classes.dex: 由Java產生的位元組碼檔案打包生成為虛擬機器可以解讀的位元組碼檔案,所有的原始碼都在其中
  • resources.arsc: 資原始檔的ID索引表,如:layout、drawable、mipmap都會在R檔案生成相應的ID資源
  • 其他目錄:開發者自行新增的目錄,如:存放資源的 asserts 、存放依賴包的 lib 目錄等

上面介紹完了一個最基本的 Apk 解壓後的目錄結構,下面直接拿微信作為示例,看看大廠應用的結構是怎樣的:

我們可以看到微信除包含了上面提到的,還有 asserts、lib、r 這三個自行新增的目錄,至於前兩個目錄是幹嘛的上面已經提到,r 目錄裡面主要存放了一些 svg 和 xml 檔案,有興趣可以自行試試。如果要問為什麼微信有3個dex檔案的話,只能說它超了 Android 系統設定 65k 方法的限制,所以有多個dex包。

OK,關於 Apk 的目錄結構介紹基本到此,這有助於我們去理解下面即將要介紹的工具!

Apktool

工具名:Apktool

官網http://ibotpeaches.github.io/Apktool/

原始碼

配置文件http://ibotpeaches.github.io/Apktool/install/ , 教你如何配置 Apktool 的使用環境

使用文件http://ibotpeaches.github.io/Apktool/documentation/ , 教你各種基本的命令的使用

功能

  • 還原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等檔案;
  • 對 Apk 進行重新(二次)打包;
  • 反編譯依賴於 Framework 的 apk 檔案;
  • 執行除錯 Smali 檔案;

下面以微信的Apk為例簡要介紹每個功能。

1、還原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等檔案。通過DOS視窗去到Apktool目錄下,執行如下命令

apktool d XXX.apk

可以看到上圖的反編譯過程中列印資訊日誌,以及反編譯成功後得到的微信目錄。反編譯成功後,進入微信目錄可以看到如下的目錄結構

2、對 Apk 進行重新(二次)打包。通過DOS視窗去到Apktool目錄下,執行如下命令:

apktool b 目錄名

本想對微信做重新打包,結果發現微信果然做了處理了,打包不成功,大廠考慮得好周到。於是狡猾的拿了另一個物件試手,果然一下子搞定了

可以去到反編譯生成目錄下的dist目錄看到我們重新打包好後的 Apk

這個功能主要有兩個應用場景,一個是對應用進行本地化處理,例如反編譯後對應用進行漢化。另一個是無恥的對應用進行廣告植入,重新打包發放市場並以此牟利(非常強烈的不贊同大家去這麼做)。

3、反編譯依賴於 Framework 的 apk 檔案。這個功能我並沒有用過,但是也做了大致的瞭解。舉個例子(摘自網路的栗子):一般來說,你在使用 Apktool 進行反編譯前不需要做其他的事情,然而由於有的廠商,如HTC,三星等,他們定製了 Framework 檔案並且在他們的系統應用中使用了這些檔案,這時,為了能正常的反編譯這些Apk檔案,你就必須從你的裝置中拷貝出framework檔案並且安裝到apktool中。對這個功能感興趣的童鞋,可以直接檢視這篇文章:http://bbs.gfan.com/android-2657915-1-1.html

4、執行除錯 Smali 檔案。首先需要解釋一下什麼是Smali,它是 Android 虛擬機器所使用的一種機器語言,差不多可以理解成組合語言那樣子。利用 Apktool 反編譯後,classes.dex 會被翻譯成 Smali 原始碼

去到下面隨便找個目錄開啟,可以看到都是字尾為 smali 的檔案,

隨便找個檔案開啟你會發現, smali 的語法還是比較好理解的

有興趣想要了解 smali 語法的,可以看看這位作者寫的文章:http://blog.isming.me/2015/01/14/android-decompile-smali/。看到這裡你可能會想問,瞭解 smali 的語法有什麼用呢?哈,非常簡單粗暴,如果懂語法,就能讀懂人家的應用裡面的業務邏輯,還可以加以修改等。 再加上 Apktool 提供的除錯 Smali 功能,可以玩得很爽。但是在 2.0.3 的版本上,作者已經宣佈廢棄此功能,到了 2.1 時此功能已經完全移除掉了。這也並不意味這我們無法玩轉 smali 檔案。感興趣的童鞋可以直接玩耍下面這個 smali 除錯外掛:

SmaliIdeahttps://github.com/JesusFreke/smali/wiki/smalidea

反正我一看到 SmaliIdea 是震驚了。目前 SmaliIdea 最新的版本是 0.03,喜歡玩耍的童鞋可以到下面的下載地址中:

https://bitbucket.org/JesusFreke/smali/downloads

找到最新版的 SmaliIdea 進行安裝使用

對了,這個外掛是基於 IntelliJ IDEA / Android Studio 的,還在 Eclipse 下擼碼的童鞋可以忽略。

使用 Apktool 需要注意還需要注意以下幾點:

1、下載完 Apktool 後,記得要把 jar 檔案改成 apktool.jar,與 apktool.bat 同名;

2、如果之前使用過舊版的 apktool ,記得到自己對應的使用者目錄下將 1.apk 檔案刪除,否則會造成反編譯失敗;

Clock 是我在 Windows 下的使用者目錄,其他童鞋自己換成自己對應的使用者目錄即可。

3、不要拿去使用 Apktool 去幹違法盜版的事情,這也是工具的作者特別強調的;

dex2jar

工具名:dex2jar

官網https://sourceforge.net/projects/dex2jar/

原始碼

配置文件:很簡單,去官網連結直接下載到本地即可

使用文件:同樣比較簡單,直接看下面示例,或者 Google 一下

功能

  • 將 dex 檔案還原成為 jar 檔案;
  • 將 dex 檔案還原成為 smali 檔案;
  • 其他一些命令列很少用,喜歡折騰的童鞋,同樣自行摸索;

繼續拿微信開刀,解壓 Apk 去除一個 dex 包,對其進行如下命令列操作

d2j-dex2jar.bat dex檔名

可以看到生成一個對應的 jar 包,這樣就可以結合下一個工具很方便的檢視原始碼了。如果想要將 dex 轉換成 smali ,同樣可以執行如下操作:

d2j-dex2smali.bat dex檔名

classes-out 目錄中就可以看到由 dex 包生成的所有 smali 檔案了。想必大家也留意到所有的檔案都存在同名但是字尾不同的兩份

bat 字尾的是 Windows 使用者可以呼叫的批處理檔案,sh 字尾的則是 Linux 使用者的 Shell 指令碼。根據自己的環境去選擇用 bat 還是 sh 即可。

jd-gui

工具名:jd-gui

官網http://jd.benow.ca/

原始碼https://github.com/java-decompiler/jd-gui

功能

  • 檢視 dex 檔案還原成為 jar 檔案程式碼;
  • 將 jar 檔案中所有的 class 檔案轉換成為 java 檔案;

使用很方便,下載後,直接把用 dex2jar 生成的微信 jar 包拖曳進去即可檢視到對應的原始碼。

也可以去到工具欄選擇 File -> Save 或者 File -> Save All Sources 將單個 class 檔案或者整個 jar 包儲存成為 java 檔案。可惜的是,這個工具的作者從 2015 年開始就停止了維護,所以遲早尋求一個替代品。網上有童鞋說,jadx 不錯,可以取代 jd-gui 。我自己還沒玩過,童鞋們可以自行試試:

jadxhttps://github.com/skylot/jadx

enjarify

工具名:enjarify

原始碼https://github.com/google/enjarify

配置文件:下載原始碼到本地,並安裝 Python3 的環境,同時配置好環境變數

使用文件:可以參考上面的原始碼地址中的說明,或者烏雲平臺的文章 http://wiki.wooyun.org/android:tools:enjarify

功能:可直接將 apk 檔案還原成為 jar 檔案,也可以和 dex2jar 一樣,直接操作某個dex

這是 Google 出品的一個逆向分析工具,從反編譯成 jar 包的流程來說,要比 dex2jar 方便得多。下載完工具到本地並配置好 Python 環境後,需要修改 enjarify 目錄下的 enjarify.bat 檔案,將 python3 改為 python

再通過DOS視窗去到其目錄下,執行如下命令:

enjarify.bat XXX.apk

這裡同樣需要注意,一定要將 apk 拷貝到和 enjarify.bat 同級目錄,如果使用 apk 的全目錄的話,會報錯。

enjarify 相較於 dex2jar 做了更多的優化處理,去避免在反編譯得到 jar 包的過程中出錯。雖然我在使用 dex2jar 的過程中還沒遇到過出錯的情況,但是在使用 enjarify 時,確實感受到相對更加方便的地方。例如:可以直接對apk進行操作,而不需要先解壓提取classes.dex,特別是針對那些本來就不止一個dex包的大型應用。而 enjarfy 也並非萬能的,它目前存在的一些限制,如暫時還無法逆向獲得原始檔的屬性、行數和註釋等。當然,相信 Google 的工程師也會盡力去優化改善 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 的優勢所在了。直接去到 Procyon 的目錄下,並將 enjarify 反編譯好的微信 jar 檔案放置到同級目錄,同時執行如下命令反編譯整個 jar 包:

java -jar procyon-decompiler-0.5.30.jar -jar XXX.jar -o 目錄名

即可看到目錄下指定生成的目錄,和控制檯視窗相應的反編譯 log 資訊。為了驗證 Procyon 的亮點,我同時將 dex2jar 反編譯微信的某個類拿出來做對比(類名是MCacheItem)得到結果如下:

相同的一個方法體的程式碼邏輯,圖一是 dex2jar 的,圖二是 Procyon 的,哪個能夠更好的讀懂相信大家自然心中有數,像這樣的栗子是很多的,這裡就不一一例舉。除了上面反編譯這個 jar 檔案的命令外,Procyon 還有下面兩個檔案使用比較高頻:

java -jar procyon-decompiler-0.5.30.jar 獲取幫助命令

 

java -jar procyon-decompiler-0.5.30.jar xxx.class 反編譯單個class檔案

ClassyShark

工具名:ClassyShark

官網http://classyshark.com/

原始碼https://github.com/google/android-classyshark

配置文件:通過下載連結 https://github.com/google/android-classyshark/releases ,下載 jar 包到本地即可

使用文件

功能:可直接瀏覽 Apk,支援對.dex, .aar, .so,.apk, .jar, .class等檔案的操作。

ClassyShark 同樣是 Google 的親兒子,利用它我們可以檢視一些 Apk 使用了什麼技術,方便作為我們開發的參考進行使用。同樣以別人家的 Apk 作為分析的栗子,這回不拿微信了,因為從 Apk 分析上看,微信大部分基本上都是用自己的技術,參考價值可能不太大,換一個目標下手(常常逛知乎,就拿知乎了)。操作同樣很傻瓜化,去到 ClassShark 的目錄下執行如下命令即可:

java -jar ClassyShark.jar -open XXX.apk

可以看到如下介面

我們可以看到如下介面,左邊包含了 xml 檔案、 classes 檔案以及 lib 目錄及其所包含的 so 庫。直接點選某個 xml 檔案即可看到其檔案內容,非常方便,不過這個工具的重點不在這裡。直接點選 classes 目錄下某個 dex 檔案

從上面兩張圖中你可以看到知乎兩個 dex 包所包含的方法數是多少(這個資訊對我們可能沒啥用),還有就是它使用了 Facebook 開源的圖片載入庫 Fresco、開源資料庫 Realm、還有騰訊和新浪的一些SDK。

如果我切換到另外一個 Tab,還可以看到更多的資訊

它分別列出了 Apk 下每個包中的方法數,並且以直觀的扇形圖展示在右邊。透過這裡也可以看到知乎還用了 Apache 的開源庫、Twitter 的移動開發檢測平臺 Fabric、 Rxjava、 Retrofit 以及 Square 出品的 OKIO 庫。發現大廠引入的開源技術我們也可以進行相應的學習,並權衡考慮引入使用。

最後補充一點,ClassyShark 能顯示包中方法數的這個功能對我們開發自家產品還是有所幫助的,假設你引入大量的第三方庫而導致了 Apk 超過了 65K 方法的限制,可以通過它來查詢是哪些第三方庫的方法過多導致。網上很多童鞋都推薦什麼計算方法數的 AS 外掛,個人覺得還不如用 ClassyShark 方便一些。

TcpDump

工具名:TcpDump

官網http://www.androidtcpdump.com/

下載地址http://www.androidtcpdump.com/android-tcpdump/downloads

使用文件

功能:對手機進行網路抓包,前提是手機已經獲取 Root 許可權。支援 HTTP 和 HTTPS ,還支援更多其他協議。

Tcpdump 的使用就不介紹太多,具體怎麼玩可以看上面 Trinea 和 MrPeak 的文章,已經寫得很完善了。TcpDump 沒有GUI,要檢視抓包日誌可以通過控制檯視窗,但明顯很雞肋,為了方便還是把所有網路日誌的抓包資訊放到 pcap 檔案裡面,然後結合下面要介紹的 WireShark 進行操作。

WireShark

工具名:WireShark

官網https://www.wireshark.org/

下載地址https://www.wireshark.org/#download

使用文件http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html (非常齊全的文件)

功能

  • 配置 Tcpdump 生成打 pcap 檔案,進行分析;
  • 或者可以讓電腦建立熱點,手機連上電腦建立的熱點進行抓包,這種方式處理起來更加方便靈活;

WireShark 支援的協議也是非常多,可以看到我抓包出來的結構也非常詳細,WireShark 的基本使用自行參考上面提供的連結即可,如果要玩得很深的話,需要對網路協議有一定深度的瞭解,童鞋們可以選擇性自由發揮。

Fiddler

工具名:Fiddler

官網http://www.telerik.com/fiddler

下載地址https://www.telerik.com/download/fiddler

使用文件:直接參考 Trinea 的文章 http://www.trinea.cn/android/android-network-sniffer/ 即可。

功能:支援對 HTTP 和 HTTPS 兩種協議進行抓包。

相比 Tcpdump ,它的好處在於手機不需要 Root,且有自己的 GUI 。不過它只支援 HTTP 和 HTTPS 兩種協議。另外在使用時,手機也需要連線 WIFI 並設定好代理,具體檢視 Trinea 的文章好了。抓包的過程還是能夠獲得不少資訊的,我在抓了新浪微博和微信的包後感受是,微信的防抓包工作比以前做得好了,微博好像就沒發現有什麼變化,不知道是不是錯覺。

Fiddler 是本文介紹的最後一個工具,需要補充一下,請教了一些童鞋,它們說 Mac 下使用 Charles 會更爽,額,我是 Windows 使用者,Mac 下的童鞋就自行折騰吧。

總結

以上就是目前自己常用的一些競品分析工具,有針對 Apk 反編譯的,也有對應用進行網路抓包的。競品分析並非只是幫助我們去了解競爭對手的產品,很多時候我只是出於對某些應用的技術實現感興趣,而對其進行一番挖掘,挖掘的過程中你會發現某種新技術你可以開始學習了。例如像知乎使用 realm 資料庫一樣,其實 realm 正式版釋出也沒多久,不過既然大廠已經投入使用那有空也需要適當的跟進學習,說不定哪天 realm 真的幹掉來了 SQLite 呢。

當然有時候除了學新技術,還派上了另一番用場,諸如某次同事對一個 App 的某些資料資訊感興趣,於是乎專門做了爬蟲到網上爬取資料,後來我反編譯了 App 後大致捋了一遍,發現該 App 在 raw 目錄下其實已經放著一個本地資料庫了,對比了資料基本差別無幾,直接可以拿來用了。或者可以拿著這些工具來對自家應用動手,找找自家的產品哪裡的安全性還不夠,可以進行完善彌補,未嘗不是一件好事。

文章總結到此,本人水平有限,無法做過多深入講解,感興趣的競品(逆向)分析技術的童鞋可以考慮看看 《Android軟體安全與逆向分析》 或者逛逛看雪論壇膜拜一些大神的奇技淫巧!

相關文章