Android檢測(cè)三方庫(kù)行為


前言

android程序中調(diào)用了很多第三方庫(kù),由于工信部的監(jiān)管政策,各個(gè)業(yè)務(wù)需要對(duì)第三方庫(kù)的具體行為負(fù)責(zé),如果在APP抽查中發(fā)現(xiàn)應(yīng)用中調(diào)用的第三方庫(kù)有違規(guī)行為,APP也會(huì)被通知整改或者下架。

因此有必要使用技術(shù)手段對(duì)第三方庫(kù)的具體行為進(jìn)行測(cè)試,例如檢測(cè)第三方庫(kù)是否有采集MAC地址的行為。由于第三方庫(kù)的網(wǎng)絡(luò)請(qǐng)求都進(jìn)行了加密,因此很難從網(wǎng)絡(luò)層去檢測(cè)是否有敏感信息回傳。但是可以通過xpose hook關(guān)鍵函數(shù)的形式,判斷第三方庫(kù)是否有采集mac信息等行為。

具體方案

一,VirtualXposed的安裝

VirtualXposed是一個(gè)虛擬環(huán)境,可以在設(shè)備沒有Root的情況下hook系統(tǒng)的api。如果有已經(jīng)root的設(shè)備,或者使用的是手機(jī)模擬器,可以使用xposed。

VirtualXposed源碼及APK下載地址:https://github.com/android-hacker/VirtualXposed/releases

將VirtualXposed APK文件安裝到測(cè)試手機(jī)(這里需要注意測(cè)試手機(jī)的CPU架構(gòu)也需要跟VirtualXposed支持的架構(gòu)保持一致),安裝后需手動(dòng)進(jìn)入VirtualXposed的應(yīng)用權(quán)限設(shè)置界面,將所有的權(quán)限都開啟(VirtualXposed并不會(huì)自動(dòng)請(qǐng)求權(quán)限,所以需要手動(dòng)開啟),然后運(yùn)行VirtualXposed。

二,編寫Hook程序

編寫Hook程序前需要先知道通過哪些接口可以獲取到MAC地址

獲取MAC地址方法一:調(diào)用NetworkInterface類的getHardwareAddress()方法

獲取MAC地址方法二:調(diào)用WifiInfo類的getMacAddress()方法

獲取MAC地址方法三:通過Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address ")方法獲取

明確了需要hook的方法,開始編寫Hook程序:

1,新建一個(gè)類,實(shí)現(xiàn)IXposedHookLoadPackage接口

public class Main implements IXposedHookLoadPackage {

private static final String TAG ="Main";

private String HOOK_PREFIX ="getmachook -> ";,

2,針對(duì)上文介紹的三種獲取mac的形式,進(jìn)行hook,通過日志形式進(jìn)行輸出

private void hookMacAddresshighversion(XC_LoadPackage.LoadPackageParam lpparam) {

try {

Class clazz = lpparam.classLoader.loadClass("java.net.NetworkInterface");

String methodName ="getHardwareAddress";

XposedHelpers.findAndHookMethod(clazz,methodName,new XC_MethodHook() {

@Override

? ? ? ? ? ? protected void beforeHookedMethod(MethodHookParam param)throws Throwable {

super.beforeHookedMethod(param);

Log.i(TAG,HOOK_PREFIX +"hookMacAddresshighversion getHardwareAddress");

Log.e(TAG,HOOK_PREFIX + getStackTrace(new Exception()));

}

});

}catch (Throwable e) {

Log.e(TAG,"hookMacAddresshighversion", e);

}

}

/**

* Detects whether the App has obtained? mac , applicable to the system lower 7.0

*/

private void hookMacAddresslowversion1(XC_LoadPackage.LoadPackageParam lpparam) {

try {

Class clazz = lpparam.classLoader.loadClass("android.net.wifi.WifiInfo");

String methodName ="getMacAddress";

XposedHelpers.findAndHookMethod(clazz,methodName,new XC_MethodHook() {

@Override

? ? ? ? ? ? protected void beforeHookedMethod(MethodHookParam param)throws Throwable {

super.beforeHookedMethod(param);

Log.i(TAG,HOOK_PREFIX +"hookMacAddresslowversion1 getMacAddress");

Log.e(TAG,HOOK_PREFIX + getStackTrace(new Exception()));

}

});

}catch (Throwable e) {

Log.e(TAG,"hookMacAddresslowversion1", e);

}

}

private void hookMacAddresslowversion2(XC_LoadPackage.LoadPackageParam lpparam) {

try {

Class clazz = lpparam.classLoader.loadClass("java.lang.Runtime");

String methodName ="exec";

XposedHelpers.findAndHookMethod(clazz,methodName,String.class,new XC_MethodHook() {

@Override

? ? ? ? ? ? protected void beforeHookedMethod(MethodHookParam param)throws Throwable {

super.beforeHookedMethod(param);

Log.i(TAG,HOOK_PREFIX +"hookMacAddresslowversion2 getMacAddress param = " + param.args[0]);

Log.e(TAG,HOOK_PREFIX + getStackTrace(new Exception()));

}

});

}catch (Throwable e) {

Log.e(TAG,"hookMacAddresslowversion2", e);

}

}

3.新建xposed配置

在src/main/目錄下新建一個(gè)Assets Folder,并在Assets Folder中創(chuàng)建xposed_init文件,xposed_init文件中寫入Main類的完成名稱,例如:com.w.myhook.Main

4.在AndroidManifest.xml中聲明xposed meta-data

<meta-data android:name="xposedmodule"

? ? android:value="true"/>

<meta-data android:name="xposedminversion"

? ? android:value="53"/>

<meta-data android:name="xposeddescription"

? ? android:value="myAppHook"/>

5.配置xposed庫(kù)依賴

compileOnly'de.robv.android.xposed:api:82'

compileOnly'de.robv.android.xposed:api:82:sources'

6.編譯運(yùn)行

三,安裝MyHook模塊到VirtualXposed

1. 啟動(dòng)VirtualXposed后,點(diǎn)擊底部的按鈕 - 添加應(yīng)用 - 選擇MyHook - 點(diǎn)擊安裝 - 選擇VirtualXposed

2,2.返回VirtualXposed首頁(yè),向上滑動(dòng)打開抽屜,啟動(dòng)Xposed Installer,開啟getmachook模塊

3.重啟VirtualXposed

不需要重啟手機(jī),只需要將VirtualXposed APP的進(jìn)程重啟即可

四,安裝需要檢測(cè)的APP

可以直接從手機(jī)SD卡中安裝,也可以像第三步的第1步安裝MyHook那樣把需要檢測(cè)的APP安裝到VirtualXposed,這里就不再贅述了,注:安裝APP后不需要再添加模塊或重啟VirtualXposed了

五,運(yùn)行被檢測(cè)的APP

返回VirtualXposed首頁(yè),向上滑動(dòng)打開抽屜,點(diǎn)擊運(yùn)行需要檢測(cè)的APP.

過濾日志關(guān)鍵字getmachook,就可以看到mac地址的調(diào)用情況和調(diào)用堆棧.

demo代碼地址

https://github.com/crazydigua/getmachook

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容