前言
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