使用Xposed框架Hook第三方庫API——以Google Admob廣告為例
一.背景
筆者一開始接觸Xposed框架的時候荠呐,也是在此平臺的博客上看到的一篇關(guān)于利用Xposed框架劫持登錄界面的用戶名和密碼,鏈接如下 :Android逆向分析之Xposed的hook技術(shù)。關(guān)于Xposed環(huán)境的搭建也可以參考上述鏈接室琢,在此不作贅述遮糖。
由于其用到的是XposedHelpers.jar的findAndHookMethod,這個方法要傳遞待Hook函數(shù)的參數(shù)列表速客,比較麻煩。利用XposedBridge.jar的hookMethod五鲫,這個方法只需傳入待Hook函數(shù)的實例(instance)溺职,再實現(xiàn)XC_MethodHook這個回調(diào)接口就能完成對任意API的Hook。
回到主題位喂,要獲取函數(shù)的實例浪耘,可以使用Java反射機制,對于Android系統(tǒng)的API可以很容易地反射得到函數(shù)的實例塑崖,但對于本文提到的第三方庫API七冲,反射獲取第三方庫API的實例會在跨應(yīng)用時失效,需要換一種方式來獲取第三方庫API的實例规婆,以下將作詳細說明澜躺,并以廣告API作為例子。
二.類/API說明
IXposedHookLoadPackage接口
方法 描述
handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam)
這個方法用于在加載應(yīng)用程序的包的時候執(zhí)行用戶的操作
loadPackageParam這個參數(shù)包含了加載的應(yīng)用程序的一些基本信息抒蚜,可以利用此參數(shù)獲取API所在類的Class對象掘鄙,從而獲取API的實例。
XposedBridge類
方法 描述
hookMethod(Member hookMethod, XC_MethodHook callback)
1.參數(shù):Member hookMethod是待hook的API實例嗡髓,即方法對象操漠。
2.回調(diào)接口:實現(xiàn)XC_MethodHook接口,重寫待Hook API運行前和運行后的處理方法beforeHookedMethod和afterHookedMethod(舉例如下)饿这。
XposedBridge提供了很多API幫助開發(fā)者對函數(shù)進行hook浊伙,舉個例子如下:
XposedBridge.hookMethod(method, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d(TAG, "原函數(shù)執(zhí)行前執(zhí)行");
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d(TAG, "原函數(shù)執(zhí)行后執(zhí)行");
}
});
三.編寫Xposed模塊Hook廣告API
要對Google AdMob平臺的API進行Hook,并且能夠限制廣告的顯示长捧。首先我們需要知道AdMob平臺用于顯示廣告的API嚣鄙,通過查看AdMob廣告接入指南,以橫幅廣告為例串结,其顯示廣告的API是屬于com.google.android.gms.ads.AdView類的loadAd()拗慨。Hook此API,并禁止它的運行奉芦。具體實現(xiàn)如下赵抢。
編寫Xposed模塊
public class Module implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
try {
Class c = loadPackageParam.classLoader.loadClass("com.google.android.gms.ads.AdView");//關(guān)鍵一步,獲取Class對象
Method method = null;
for (Method m : c.getDeclaredMethods()) {//獲取loadAd的實例
if (m.getName().equals("loadAd")) {
method = m;
}
}
Log.d("Module", method.toString());//查看loadAd是否獲取成功
XposedBridge.hookMethod(method, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
param.setResult(null);//限制loadAd的運行
Log.d("Module", "Confine loadAd");//打印日志
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
}
});
}catch (Exception ex){
ex.printStackTrace();
}
}
四.運行效果
1.LogCat顯示
在com.bigduckgames.flow這個包加載的時候声功,獲取了loadAd這個API的實例烦却,并限制了它的運行。
五.總結(jié)
實際上先巴,Xposed提供豐富的API給開發(fā)者對目標函數(shù)進行hook其爵,由于本文是專門對于第三方庫的函數(shù)進行hook冒冬,只提到了一些與之相關(guān)的API。在獲取第三方庫Class的時候摩渺,要利用到loadPackageParam這個參數(shù)简烤,所以要實現(xiàn)IXposedHookLoadPackage這個接口。雖然摇幻,本文只是簡單地提到了第三方廣告庫函數(shù)的hook横侦,但可以擴展到通用的第三方庫,可以以此提供參考绰姻。