0x00 软件中的广告
什么是广告?
任何与软件本身无关的内容都属于广告;
广告的表现形式很多,有的时候是一个界面(activity),有的时候是局部在上方或下方的一个区域视图(view),有的时候可能是工具条(toolbar),也可能是一个对话框(dialog)里出现广告内容。
但是看到的并不一定是表现出来的;有时候看到的区域视图、对话框、工具条都有可能是一个activity。
广告来源
- push推送
- 第三方SDK
广告常见的就是push推送广告,这也就要求了在配置清单xml 中,需要声明必要的service 和receiver,同时还应要求有pushid。推送广告内容基本都是来源于广告服务商的服务器。另一方面,注入的第三方SDK,只需要添加个人注册的id,便可以实现盈利,同样广告内容来源于广告服务商。
广告商与盈利模式
针对Android平台
国内常见广告商:友盟、腾讯、有米、百度等
国外常见广告商:Facebook、Admob等
盈利模式
商家投放广告->广告商平台->开发者编写应用嵌入广告商提供的SDK->用户点击、用户消费->商家获益->广告商平台获益->开发者获益
0x01 去除广告思路
广告去除的基本原理与思想
上述已经说明,无论怎样形式、怎样来源的广告,在本地一定需要一个容器去当作广告内容的载体,如果可以把容器去除掉,那么就完成了去广告。
广告的容器就是一些界面、视图等,以往课程已经说过,对于页面,即可以利用静态的布局,也可以在代码中动态生成。
根据上述理论知识,思路就可以分为以下两个方向:
- 对于简单的静态布局编写的广告界面,我们可以直接从配置清单xml文件,或相应的布局xml文件入手;
- 对于复杂的,也就是已经形成了第三方SDK的,可能配置清单xml文件难以处理,或即使处理了相关的xml文件依然存在广告,或采用动态编写和检测,广告页面循环出现等等问题,我们采用从代码逻辑上入手。
根据思路进行的操作大概如下:
- 通过删除配置清单Androidmainfest. xml文件关于广告界面的相关声明,来去除广告页面。
- 广告在代码中往往出现较早,一般会在入口点的oncreate()方法处注入,我们分析代码逻辑,让广告页面不出现,或删除动态生成广告页面的代码。另外,任何拥有广告的软件,一定会有自己的广告消失方法,找到后进行自行调用。同理,如果采用了动态代码生成广告页面,在拥有创建相应页面视图的方法同时,一定会有关闭、隐藏广告页面的方法,找到方法,然后在创建时就调用,这就可以做到,刚刚创建就进行关闭和隐藏
- 由于广告以push广告为主,如果删除对应的pushid,那么特别对于第三方广告商的广告,是无法识别该广告的推广者或推广内容是什么,那么就不会给广告拓展:因为推送广告内容基本都是从网络获取的,如果截断了这条路,如把获取广告的IP地址改为127.0.0.1,那么本地没有广告内容,也就不会有广告。
0x02 实际案例
准备:
- 二维码扫描apk
- Android killer
- JEB
- 手机或者模拟器
去广告目标:一个自己常用的工具:“二维码扫描”;
打开界面如下:
每次打开都有广告,很烦;
用Burpsuite抓包查看广告来源(这时候会遇到各种抓不到的情况,应对的方法也很多,我这个目标是个简单的应用,直接用Burpsuite就抓到了)
打开应用抓到五个数据包,查看这几个数据包发现广告来自第二个;
重放第二个数据包,
分析数据包,查看链接,确定为广告的来源;
http://pgdt.gtimg.cn/gdt/0/DAAUZSFAKAAPAABgBa10d4DzY5_9VS.jpg/0?ck=896de5f38d9a9f831bee6a75c669297e
在Android killer中搜索mi.gdt.qq.com、gdt_mview.fcg;即使分开单个关键词搜索也一无所获;但是可以看到返回来的数据为json格式,并不是h5的广告也不直接是图片,应用还需要对json数据进行处理,这里转换思路寻找处理的函数,将处理的结果修改为return空值,这样就不会返回广告了。
继续在Android kill中搜索关键字getAd,Ad,结果如下,看了下getAd的结果,也没有什么发现;Ad的结果太多,懒得看;这时候还有什么办法呢?
提供几个思路:
- 分析数据包的相关参数;
- 查看logcat日志;
- 继续硬着头皮分析代码的执行流程;(静态分析、动态调试)
回到数据包那里,继续看其他参数,发现一个posid,猜测此id的作用是通过此id访问广告,从而统计并结算收益,搜索8060013973605191,结果如下:
分析代码,这里如果看不懂smali的话,可以借助JEB来分析,可以查看谁调用了a(),同样的,如果查看logcat日志,当广告出现,点击广告或者跳过广告等操作是也是可以定位到这里。
此时,尝试删掉posid的值,再访问看会出现什么结果,
这样返回来的数据就没有可以访问的广告链接,这样就没有广告了;
说干就干,修改、保存、编译、签名、安装、打开,
真的没有广告了,但是还有一个升级提示,也很烦;
其实这个升级的查询就在应用打开时的第五个数据包中,
同样搜索关键字AppUpgrade;
相同操作,打包完后就ok了。
再次打开广告没了,升级提示也没有了,舒服.
结:
简单介绍了下Android去广告的思路和一个简单案例,当然因为此次目标的APP相对简单,不存在混淆、加壳、反调试等加固手段,然后这篇文章也是APP对抗最原始和最早的方法,思路不仅适用与去广告,也是早期黑灰产的常用手段,如内购、破解、恶意脚本等。
引申下几点:
- 灰产会怎么利用?(批量修改,将广告改为自己的,从中获利)
- 如果应用对完整性做了验证,重打包后自动退出或者不能正常使用,还有什么方式去广告?(同样的分析方式绕过验证,或者利用Xposed,HOOK对应需要修改的值,前提是需要ROOT权限和会Xposed插件开发)