最近因刷逼乎的时候广告满天飞,一般广告就忍了,可是什么贷款啊!脱发 啊!看的烦,于是就萌生了去广告的想法
先看看广告
叔可忍婶不可忍,我大程序员为啥就一定要脱发?
首先祭出神器 Inspeckage,因为Inspeckage在android P上无法使用,本人做了下适配以及增加了一些功能,方便写xposed扩展动态分析APP功能
大概瞄了一眼,APP权限注册的一大坨,行为分析发现这东东有很多东西,这里只想着去广告,就直接把APP down下来了,该应用版本为play版
拖入jadx先静态分析
该APP dex层没加密,其中关键参数用libDexHelper.so来进行加密,不影响去广告分析,加密模块儿可以用 Inspeckage hook关键函数实现动态侦测功能
首先用Layout Inspector分析下界面,发现推荐页是他们自己封装的RecyclerView来实现的
广告布局对应的正是ItemWrapReasonView,该布局最终继承FrameLayout
分析该布局创建的时候是一个空值
通过以下两个函数来添加广告页布局
这就很简单了,通过xposed直接拦截这两个函数,remove掉该view或者直接把该view设置成GONE,下面代码是直接把这两个view设置成GONE直接去广告
Class<?> ItemWrapReasonView = findClass("com.zhihu.android.app.ui.widget.ItemWrapReasonView", loadPackageParam.classLoader);
/**
* 首页推荐去广告
*/
findAndHookMethod(ItemWrapReasonView, "a", View.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
View f = (View) getObjectField(param.thisObject, "f");
if (f != null) {
f.setVisibility(View.GONE);
}
super.afterHookedMethod(param);
}
});findAndHookMethod(ItemWrapReasonView, "b", View.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
View a = (View) getObjectField(param.thisObject, "a");
if (a != null) {
a.setVisibility(View.GONE);
}
super.afterHookedMethod(param);
}
});
至此烦人的推荐页广告已经去除了
下面来去除splash页广告,并定制个性化splash
首先定制化splash页面
Class<?> LauncherActivity = findClass("com.zhihu.android.app.ui.activity.LauncherActivity", loadPackageParam.classLoader);
findAndHookMethod(LauncherActivity, "onStart", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Activity activity = (Activity) param.thisObject;
activity.getWindow().setBackgroundDrawableResource(splashId);
}
});
把它背景修改为我们自己的图片
因为APP启动白屏页直接在style中配置的图片,这边暂时没想到用xposed怎么来修改,只能通过反编译APP,但那样来又得重打包不方便,所以暂时效果不太好,先显示它启动的图片,后续激活后切换到我们的图片
去广告部分因为在LauncherActivity中暂时没有找到好的method来hook所以改在广告页的fragment来拦截
com.zhihu.android.app.ui.fragment.ad.b
直接把入参改为0,跳过广告展示
final Class<?> AdFragment = findClass("com.zhihu.android.app.ui.fragment.ad.b", loadPackageParam.classLoader); findAndHookMethod(AdFragment, "a", int.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); XposedBridge.log("启动广告拦截"); param.args[0] = 0; } });
插件编写到此结束了,后续可以优化的地方还很多,可以慢慢写,先看下效果吧
视频不知道怎么链接上来,传到附件了
xposed编译好的模块传到附件了