去广告-安卓-逆向-实操前必备基础理论知识-技术分享学习本文摘要:
把简单介绍一下关于安卓上大部分广告的类型以及去除方法这些,提供一个方向,具体问题还需具体分析。⚠️重要法律提醒:仅用于自主开发 APP 学习逆向原理,禁止私自破解、修改他人商用 APK 并二次分发、商用,修改非自有软件涉嫌侵犯著作权,违反《著作权法》。(简单技术分享,仅供参考)
Manifest / 资源 xml / Smali 代码 / 网络拦截1、优先改 Manifest(禁用组件 / 删权限)不易闪退。2、其次改 res 资源 xml(布局宽高置 0), 只隐藏不破坏逻辑。3、最后改 smali(注释 show/load、return 空),针对动态弹窗。4、远程广告→hosts 屏蔽域名。大部分去广告软件都会内置这种规则。要是上手后分辨不出来时是哪种弹窗的话,由易到难一步步排查就可以了。Splash 开屏,冷启动 / 切后台返回弹出,穿山甲 / 广点通 / 快手 AD 主流1.1、独立广告 Activity(清单注册):单独广告页面,AndroidManifest 注册 LAUNCHER 或跳转 Activity;1.2、启动页 Splash 内嵌广告(代码动态加载):首页 SplashActivity 的 onCreate/onResume 加载广告 View/Dialog;2.1、改 AndroidManifest(最简,独立 Activity 广告) | 搜索关键词(ad、ads、advertisement) |
|---|
| pangle、pangle、com.bytedance.pangle |
| |
| |
| com.baidu.ad、baiduadsdk、baidu |
| com.getui、igexin、admob、faceb00k、offer |
②:在对应广告的Activity里添加android:enabled="false"禁用;③:修改启动入口:把LAUNCHER启动项从广告 Splash 直接改成 MainActivity,跳过开屏页。<activityandroid:name="com.bytedance.pangle.sdk.ad.AdSplashActivity"android:enabled="false"/>
2.2、修改 Splash.smali(内嵌代码广告)①搜索关键词:loadSplashAd、showSplashAd、show();②广告初始化直接 return 空:找到广告 SDK 初始化方法,方法首行插入return-void,终止广告加载;③跳过倒计时:倒计时变量const/4 vx, 0x3(3 秒)改成const/4 vx,0x0,立刻执行finish()跳转主页。2.3、资源法:res/layout 删除开屏广告布局 xml。Interstitial,退出页面 / 点击按钮 / 定时弹出全屏弹窗1.1、Dialog 弹窗(代码动态 new Dialog,无清单注册);1.2、透明主题 Activity 全屏广告(清单注册广告组件);2.1、Dialog 型(改 smali,最常用)全局搜索 smali:show()、dialog、show、AlertDialog、PopupWindowLandroid/app/Dialog;->show()V、InterstitialAd->show(),整行加#注释,禁用弹窗调用:普通对话框弹窗(最常见)#invoke-virtual {v0}, Landroid/app/Dialog;->show()V系统 AlertDialog 弹窗#smaliinvoke-virtual {v0}, Landroid/app/AlertDialog;->show()V底部弹窗 BottomSheet#invoke-virtual {v0}, Lcom/google/android/material/bottomsheet/BottomSheetDialog;->show()VPopupWindow 弹窗#invoke-virtual {v0}, Landroid/widget/PopupWindow;->showAsDropDown(Landroid/view/View;)V自定义弹窗#invoke-virtual {v0}, Lcom/xxx/popup/CustomPopup;->show()V
2.2、Activity 型(改 Manifest)清单禁用插屏广告 Activity、广告广播 Receiver:android:enabled="false";2.3、SDK 初始化拦截:找到loadInterstitialAd()加载方法,方法开头添加return-void,不预加载广告。页面顶部 / 底部常驻广告条,布局嵌入 AdView 控件 1.1、布局 xml 静态嵌入 AdView,或代码动态 addView 添加广告控件res/layout 全局搜AdView、com.qq.e.ads.banner、PangleBannerView,找到广告控件:<!--原广告标签--><com.qq.e.ads.banner.BannerViewandroid:layout_width="match_parent"android:layout_height="wrap_content"/><!--修改宽高为0,隐藏广告-->android:layout_width="0dp"android:layout_height="0dp"
2.2、smali 代码移除:搜索addView(adView),注释 addView 调用,不把广告添加进页面;2.3、禁用权限:删除广告依赖的SYSTEM_ALERT_WINDOW悬浮窗权限。ewardedVideo,看完广告解锁功能 / 免等待,强绑定业务逻辑难点:广告和 APP 功能耦合,删错会导致功能锁定、无法使用找到广告播放成功回调onRewarded(),直接在方法内写逻辑:强制标记广告已观看,不用实际播放视频即可解锁功能,不用删 show/load 代码。smali 处理:回调方法开头const/4 v0,0x1(true),直接走奖励分2.2、禁用预加载:loadRewardedAd()方法首行return-void,不再拉取广告资源。系统上层弹窗,退出 APP 仍显示,依赖悬浮窗权限1.1、申请SYSTEM_ALERT_WINDOW权限,WindowManager.addView 创建悬浮窗2.1、清单删除权限:删掉<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>;2.2、smali 拦截:搜索WindowManager->addView,注释该行,无法创建悬浮控件;2.3、禁用对应广告 Service(后台启动悬浮窗的服务,Manifest 禁用 enable=false)。1.1、实现:广告 SDK 注册静态广播 Receiver,后台联网拉取推送、触发通知2.1、Manifest:搜索广告 SDK 广播com.getui、com.qq.e.push、com.kwad.push,全部android:enabled="false";2.2、smali:NotificationManager->notify()注释,无法创建系统通知;2.3、删权限:POST_NOTIFICATIONS通知权限移除。列表内嵌广告,RecyclerView/ListView 混插广告条目1.1、列表适配器里判断位置,动态插入广告 Item 布局2.1、xml:广告 item 布局宽高 0dp;2.2、smali:搜索isAdItem广告判断字段,把const/4 vx,0x1(true)改为const/4 vx,0x0(false),所有条目判定为非广告,不再渲染广告;2.3、拦截广告数据接口:抓包广告域名,hosts 屏蔽。最难,加固 / 壳包 / 远程 Dex 下发广告,本地无广告代码1.1、DexClassLoader 联网下载广告 dex、js 广告、H5 网页弹窗,本地 dex 无广告类2.1、网络拦截(最简单):抓包获取广告域名,修改手机 hosts,把广告域名指向 127.0.0.1,无法下载广告资源;2.2、smali 拦截 ClassLoader:搜索DexClassLoader、loadDex,注释动态加载远程 dex 代码,阻止广告模块加载;2.3、脱壳处理:加固 APK 先用脱壳工具导出原始 dex,再按前 7 类广告规则处理;2.4、H5 网页广告:拦截 webview 广告 url,webView.loadUrl()注释广告地址。软件。去除面精选合集
《图文合集》▶免责声明:
本公众号所发布的图片源自互联网,如果您发现我们的公众号使用了您的图片或其他内容,请及时与我们联系删除或注明出处。