Android 第三方应用广告拦截实现

本文介绍了如何在Android系统中实现第三方应用广告的拦截。通过分析广告加载机制,包括WebView、HTTP请求和动态库注入等方式,讨论了各种拦截方法的优缺点。最终,选择了通过扫描应用广告特征库并匹配包名+类名来拦截广告,同时提到了广告特征库的完善和系统层面的处理策略。
摘要由CSDN通过智能技术生成

前段时间,公司制造的机器里应用装有不良广告,严重影响了儿童客户使用者的思想健康,导致被人投诉。于是乎,就有了想研发一款类似于360广告屏蔽的应用的念头。嗯,事情就是这样,现在切入主题。

目前市场上有很多安全软件,它们拦截第三方应用广告的方式都不一样,比如说有 以so 注入方式来拦截弹出广告
现在我们来看下这种方式的详细情况:

要做到拦截,首先我们得知道广告是怎么出来的,原来第三方应用大部分是以加入广告jar形式加入广告插件,然后在AndroidManifest中声明广告service或者在程序中执行广告Api,广告插件再通过Http请求去加载广告。在java中,有四种访问网络的接口,如apache的http库(如下介绍),这几种方式首先都会通过getaddrinfo函数获取域名地址,然后通过connect函数连接到服务器读取广告信息。

  1. WebView(源码文件在frameworks/base/core/java/android/webkit/WebView.java)。通过WebView类的void loadUrl(String url)、void postUrl(String url, byte[] postData)、void loadData(String data, String mimeType, String encoding)、void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)、void evaluateJavascript(String script, ValueCallback resultCallback)等加载网页。
  2. apache-http(源码目录在external/apache-http/ , HttpGet 和 HttpPost类)。通过external/apache-http/src/org/apache/http/impl/client/DefaultRequestDirector.java中的DefaultRequestDirector类的HttpResponse execute(HttpHost target, HttpRequest request, HttpContext context)方法执行访问的网络的动作。
  3. okhttp(源码目录在external/okhttp/)。通过external/okhttp/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java中的HttpEngine类的private void connect(Request request) throws IOException方法连接网络。
  4. URL(源码在libcore/luni/src/main/java/java/net/URL.java)。通过libcore/luni/src/main/java/java/net/URL.java中的URL类的URLConnection openConnection() throws IOException方法和URLConnection openConnection(Proxy proxy) throws IOException方法连接网络。

然后再来说说动态库注入,具体什么是动态库注入,以及如何注入,网上有很多文章,这里就不介绍。动态库注入拦截呢,主要是拦截getaddrinfo,根据条件返回错误来拦截网络请求,达到拦截作用。不过需要注意一点就是拦截之前要确定你所拦截的动态库是否是你需要拦截的库?例如A程序调用了动态库BO和CO,而BO和CO都调用了connect函数,此时需要拦截BO的请求,需要注入到BO动态库并修改GOT表,而不是注入到CO中。

拦截HTTP方式广告在多数广告包中,应用程序首先会通过apache的http库或JDK中的http方法先将广告数据下载过来,然后通过WebView显示。这种方式通过注入拦截进程的/system/lib/libjavacore.so可实现广告地址拦截。

拦截WebView方式广告广告插件也可以直接通过WebView加载URL,通过分析WebView加载流程可知它的网络处理过程均交给libchromium_net库来完成。因此通过注入libjavacore.so是无法实现拦截,而是需要注入到/system/lib/libchromium_net.so。

通过这种方式已经完全能够拦截掉第三方APP广告,但存在一些问题:

1.广告商可以通过JNI方式调用系统getaddrinfo与connect实现自己的解析与连接过程的动态库,从而跳过libjavacore.so导致拦截无效。
2.拦截WebView方式广告虽然能够不显示广告,但通常仍然会有浮动框显示”网页无法打开”,从而影响美观。
3.最重要的是我们机器是没有root权限的!!

第三个问题直接导致了放弃了这种注入做法。
来来去去一段时间后,目前是采用androi

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值