veridex 使用教程_掃描非法API調用

1. 限制非SDK接口背景

從Android P開始,谷歌就開始限制開發者,禁止反射調用系統的一些方法,特別是谷歌給出的黑名單裏面的方法.固然,這是爲了提高開發者體驗和加強APP穩定,更是爲了安卓的生態發展.linux

那些官方限制的都是一些非SDK接口,就是一些private的或者是hide的方法或字段,這些由於是沒有公開的,可能會在某個版本就消失了.因此不該該訪問這些SDK中未列出的方法或字段.android

2. 下載掃描工具

好了,廢話很少說.最近公司爲了適配Android Q,其實都還好,仍是比較好適配的.什麼存儲權限,定位,惟一碼.不清楚的看這裏.windows

本文主要是教你們如何使用veridex.這個工具能夠幫咱們查找出一個APK中有哪些地方使用了非SDK接口.主要是項目若是特別大的話,查找哪裏調用了非SDK接口很是麻煩,,並且最麻煩的是第三方SDK中的一些騷操做,你不知道它幹了啥,也不能改代碼,只能經過工具來掃描.api

3. 開始查找非SDK接口調用

在官方的工具中,分別提供了linux,mac,windows的工具.veridex-linux是給linux用的,veridex-mac是給mac用的.bash

若是你是linux或者macOS還好,直接用就行(下面會介紹使用方式).若是是windows,則必須是Windows 10,並且必須打開WSL,具體教程看這裏;app

好了,如今準備工做OK了,無論你是什麼系統,要使用工具,首先須要進入veridex目錄,使用下面的命令行方式.ide

./appcompat.sh --dex-file=test.apk
複製代碼

test.apk是你的apk名稱,儘可能把apk放到veridex工具的同一目錄下.執行上面的命令後,會獲得一些輸出,可是這些輸出是在命令行上的,一晃而過,很差觀察.咱們使用下面的命令行將其掃描內容輸出到文件中工具

./appcompat.sh --dex-file=test.apk >> happy.txt
複製代碼

固然也能夠加一個--imprecise參數,加這個參數是爲了讓輸出內容更加詳細,可是也可能存在誤報.我在使用過程當中,發現不少誤報,明明沒什麼問題的,結果報出來了.post

./appcompat.sh --dex-file=test.apk --imprecise >> happy2.txt
複製代碼

掃描出來的內容大概以下所示:測試

......

#62: Linking blacklist Ljunit/textui/TestRunner;->fPrinter:Ljunit/textui/ResultPrinter; use(s):
       Ljunit/textui/TestRunner;-><init>(Ljunit/textui/ResultPrinter;)V
       Ljunit/textui/TestRunner;->doRun(Ljunit/framework/Test;Z)Ljunit/framework/TestResult;
       Ljunit/textui/TestRunner;->doRun(Ljunit/framework/Test;Z)Ljunit/framework/TestResult;
       Ljunit/textui/TestRunner;->pause(Z)V
       //表示junit.textui.TestRunner的setPrinter方法裏面在調用非SDK接口
       Ljunit/textui/TestRunner;->setPrinter(Ljunit/textui/ResultPrinter;)V
.......

//這種是灰名單,不用管
#71: Reflection greylist Lsun/misc/Unsafe;->theUnsafe use(s):
       Lcom/bonree/gson/internal/UnsafeAllocator;->create()Lcom/bonree/gson/internal/UnsafeAllocator;

71 hidden API(s) used: 4 linked against, 67 through reflection
       57 in greylist
       28 in blacklist
       0 in greylist-max-o
       14 in greylist-max-p
To run an analysis that can give more reflection accesses, 
but could include false positives, pass the --imprecise flag. 
複製代碼

上面是一個簡單示例,能夠看到我這裏掃描的時候有28處黑名單(公司項目中不會有這麼多的,放心,否則得累死).

從上面的文件中咱們讀取到以下信息:

  • 調用某個API是否非法
  • 該方法限制級別是什麼
  • 調用該方法的位置是哪裏

在Android Q版本,爲了更精準的控制與兼容,對非SDK接口分類進行修改,修改後以下所示:

  • whitelist 白名單 可隨意調用
  • greylist 灰名單 警告
  • greylist-max-o targetSDK>=O時不容許調用,targetSDK<O時警告
  • greylist-max-p targetSDK>=P時不容許調用,targetSDK<P時警告
  • blacklist 黑名單 不容許調用

因爲我上面是測試,我將Junit的引入方法改成api,平時應該這樣寫testImplementation 'junit:junit:4.12'.這樣在打包的時候就會將Junit也打進去,掃描的時候也會把Junit裏面的東西掃出來,就會出現不少黑名單裏面的API.

這個時候咱們須要根據這個掃描出來的文件去項目中,一個一個地找黑名單調用處.若是是本身的代碼,則本身修改,使用SDK公開的方法,別反射.若是是第三方SDK中的代碼,則給該SDK提工單.由於三方SDK通常公司用的時候都是給了錢的,提工單的時候回覆仍是比較快的,解決也很快.

由於我在公司不是用的macOS,也是我裝了個虛擬機Ubuntu,把上面的東西跑出來,而後一個一個地將項目中的黑名單移除.還好工程量不大,哈哈,開心.

相關文章
相關標籤/搜索