Android混淆總結篇(二)

Ⅰ.前言

上篇文章總結混淆相關的知識點,基本的技術點都有羅列到。如果項目開發比較緊張,可以考慮套用混淆配置的模板,複製粘貼的基礎上再修修補補. 上篇文章說到和朋友討論的問題,前幾天也基本探究完了,那麼也得理理思路~總結總結,期望有更多的問題出現~纔可以去探討.

Ⅱ.異常收集

上篇混淆知識點的總結文章寫得還是挺完整的,可點擊查看 Android混淆總結篇(一)

這篇文章主要的技術點是異常收集,項目上線前除了混淆、打包、加固、簽名和發佈等,還有一項是無可避免的,就是對線上的應用進行各種統計,對應用進行各種統計包括異常的收集統計、應用的渠道下載率、活躍量、留存率和頁面訪問路徑統計等等,有很多第三方的統計SDK可供接入使用,比如友盟+、百度、諸葛IO 等第三方,精細點的話可以考慮下無埋點技術等. 只要在上線前集成了統計SDK,那麼就可以在其相應的後臺看到上線後各種數據的統計報表.

統計對於運營和項目維護還是很有必要的,開發人員可以看到收集到的異常,然後對異常進行分析並找到相應解決的方案,那麼這裏就要開始文章的主題了,下面的截圖是友盟+後臺收集到的異常信息,在其異常信息下面還可以收集到該異常發生的手機型號、版本和渠道。看下異常信息吧,當看到紅圈圈出來的部分,是不是就迷惑了,異常信息裏怎麼會有abc 這樣的替代符,本來異常信息可以讓開發者清楚知道異常發生的地方,可以使其輕易定位到,但現在呢?難不成靠猜的方式去定位異常,那就呵呵了.怪不得朋友說異常信息定位問題非常迷惑,那麼下面開始來整整這迷惑.

Ⅲ.還原混淆信息的方式

umeng+_error.png

針對上面的異常信息出現abc 的替代符,主要是由於混淆打包導致的,上面abc 其實是項目的類名或變量名的代替符,那麼如果apk沒有經過混淆就會導致apk源碼泄露或被二次打包,雖說混淆了之後的apk還是很大風險會泄露,但相對來說代碼泄露的難度是增大了,所以混淆是不可缺的。那麼上面的異常信息又該如何定位Bug呢?

Android SDK工具包就提供瞭解決的工具,sdk\tools\proguard\bin路徑下名爲”proguardgui.bat”和”retrace.bat”(windows和linux下,工具的後綴名不同)的兩個工具,前者是通過圖形化的方式去將被混淆的異常信息反編譯,後者則通過命令行的方式將被混淆的異常信息反編譯.那麼在使用這工具前,還得有一個叫”mapping.txt”的文件,看下面截圖,這是在打包apk完成後生成的一個文件,主要記錄着混淆前後的信息映射關係。

mapping_file_img.png

每次打包apk 完成後生成的mapping.txt 都是有必要保存的,那怎麼使用上面提到的 “proguardgui.bat”和”retrace.bat” 這兩個工具呢?看下面截圖即可,簡簡單單搞定proguardgui.bat ,但抱歉的是本人試了很多次,都不能將異常信息轉換回去,而最無語的是搜索到的文章介紹的方法跟我操作的完全一樣,這時候我就發現了經常碰到的奇葩問題,基本文章上演示截圖的異常信息都是一樣的,尼瑪這些文章的截圖既然都是抄襲的,難不成Android SDK提供的”proguardgui.bat” 圖形化工具已經失效了,接着試試”retrace.bat” 工具.上面也提到了 “proguardgui.bat”和”retrace.bat” 這兩個工具基本是一樣的,只是使用方式不同,一個是圖形化方式,一個則是命令行方式。

proguardGui_used.png

在retrace.bat命令行工具裏反編譯異常,使用的指令爲

格式:retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:retrace.bat -verbose d:/mapping.txt d:/wyk_stacktrace.txt

那麼接着就驗證下命令行形式的 “retrace.bat”,並不同於上面的proguardgui.bat 工具有面板可以粘貼報錯信息,所以先把異常信息保存爲txt文件,然後命令行進入Android SDK存放的路徑sdk\tools\proguard\bin目錄,根據上面的指令格式進行輸入,結果如下:

proguard_used.png

結論:”proguardgui.bat”和”retrace.bat” 這兩個工具包無法還原Apk線上被混淆的異常信息.


上面的截圖就是使用”retrace.bat” 工具的反編譯異常信息的結果,可以看到abc 的標識符依然存在,所以仍得不到完整的異常信息。反覆試了很多次,依舊無果,還是找找有沒有其他方式吧~~話說在Android SDK的sdk\tools\proguard\lib目錄下有”proguardgui.jar”和”retrace.jar” 這兩個jar包,上面使用到的”proguardgui.bat”和”retrace.bat” 這兩個工具可能是基於這兩個jar包的,思考如果直接使用這兩jar包嘗試反編譯異常信息的話是否有解。先試試retrace.jar 這個jar包,命令行進入到jar包所在的目錄,在命令行輸入如下指令,輸出的信息和上面的retrace.bat工具輸出的一樣,依然沒有完整的異常信息.

格式:java -jar retrace.jar [-verbose] mapping.txt [<stacktrace_file>]
例如:java -jar retrace.jar -verbose d:/mapping.txt d:/error.txt 

接着試試proguardgui.jar,命令行進入jar包所在的目錄,輸入 “java -jar proguardgui.jar” 啓動proguard工具,看到的界面和proguardgui.bat 是一樣的,應該說proguardgui.bat 啓動的也是這個jar包,驗證之後還是沒有得到完整的異常信息.

結論:”proguardgui.jar”和”retrace.jar” 這兩個jar包無法還原Apk線上被混淆的異常信息.


Ⅳ.根據mapping.txt文件驗證

上面的工具可以還原被混淆的異常信息,其原理是因爲mapping.txt存在其混淆前後的映射信息,那是不是可以根據被混淆的一小段異常信息在mapping.txt文件查找相應的映射關係,拷貝被混淆的異常信息在mapping.txt文件進行全文搜索,下面圖1是收集在統計異常後臺的信息,圖2是在mapping.txt文件查找圖1紅圈部分的映射信息.圖3也是異常信息和映射關係.

3.11.2.png

3.11.1.png

3.11.3.png

結論:通過上面異常信息混淆前後的映射關係,切記打包時將相應的apk和生成的mapping.txt進行對應保存,這將對上線之後的Bug追蹤和維護起着非常重要的作用;


Ⅴ.其他還原混淆異常信息的方式

上面根據mapping.txt查找信息映射關係的方式,顯然不適合線上Bug的追蹤和應用的維護,因此就得另找出口,經常使用到的統計異常SDK有友盟+和Bugly,早前一直都在用友盟+的統計異常SDK,之後由於統計數據不及時和疏漏,所以之後的應用選擇接入Bugly,Bugly針對異常的收集還是非常及時和準確的。

這些統計異常的SDK其實都有提供還原被混淆異常信息的功能,這樣對開發者就非常友好了,該功能的位置在SDK後臺的異常信息上邊,只需要導入異常信息對應的應用版本的mapping文件,點擊”解析”按鈕就可以看到原始的異常信息。

bugly_mapping01.png

bugly_mapping02.png

在友盟+的統計後臺親測發現,被混淆的異常無法還原,探究了幾番仍找不到原因.而在Bugly的統計後臺親測是有效的,可以看到下面被混淆的異常信息和還原之後的異常信息.

bugly_can_useed.png


Ⅵ.總結

  • App線上異常的追蹤,可以選擇友盟+、百度、諸葛IO等第三方,精細點的話可以考慮下無埋點技術等;
  • 經過測試發現,Android SDK包的”proguardgui.bat” 和”retrace.bat” 這兩個工具包無法還原Apk線上被混淆的異常信息;
  • Apk打包後生成的的mapping文件保存着代碼混淆前後的映射關係;
  • 第三方SDK的統計後臺一般都提供還原 “被混淆異常信息” 的功能;
  • 切記 打包時將apk版本和生成的mapping.txt進行對應保存.

本篇章總結的點,有不對的地方,請多多指正.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章