Android中静态方式破解某App实现所有视频app去除广告功能

作为一个屌丝程序猿也有追剧的时候,但是当打开视频app的时候,那些超长的广告已经让我这个屌丝无法忍受了,作为一个程序猿看视频还要出现广告那就是打我脸,但是我有没有钱买会员,只能靠着毕生技能去耍耍去除广告了。下面就来介绍一下如何进行视频广告的去除。

一、视频广告播放原理

首先我们需要了解的一个基本知识点那就是广告其实也是一段视频,那么他肯定有请求地址和播放地址。那么我们的思路就来了,如果能够得到这些地址的话,我们就可以去除广告了,为什么呢?因为我们知道所有的网络请求最终会走系统的hosts文件,在这个文件中记录了很多ip地址和域名的映射关系,系统的每一次网络请求都会先去查找系统的hosts文件,如果发现请求的域名在这里有,就是用域名对应的ip地址进行访问了,所以可以看到hosts文件其实相当于本地的一个简单的DNS功能文件。如果我们有了视频广告请求地址,那么就可以修改hosts文件,将广告请求地址的域名映射成本机地址127.0.0.1,那么这样就肯定会出现广告请求错误,本地播放广告错误,就会直接跳过广告了。当然具体的方式有三种:

第一种方式:设备root之后,修改设备的hosts文件

缺点:设备需要root

优点:一次修改,终身受用,一机在手,天下我有!

第二种方式:设备无root,可以设置电脑作为代理,修改电脑的hosts文件

缺点:设备播放视频必须依赖于电脑代理,不方便

优点:无需进行设备root

第三种方式:修改路由器过滤规则,添加地址屏蔽规则

缺点:设备播放视频必须依赖于路由器的局域网内,不方便

优点:无需进行设备root

但是这种方式可以受益多人使用,一般这种方式用于家庭的局域网内,这样一家人看视频都没有广告了。

二、破解app获取广告域名

上面分析了技术原理,那么下面就要来开始破解了,因为看到上面的原理之后发现最关键的就是如何得到视频广告的地址?在我所知道的就这么几种方式:

第一种:使用抓包工具进行抓包

这种方式难度在于要分析每个地址的请求信息

第二种:破解具体视频app

这种方式成本过大,耗时很久

第三种:从市场中找一个可以过滤广告的app进行破解

这种方式是最方便的,也是最靠谱的。

下面咋们去市场搜一下视频广告过滤的app,结果搜到了一个app名为:净网大师

下面在来分析一下,这个app的去除广告原理:

当有了视频广告的播放地址,方式还是很多的,一种是设备root之后修改hosts文件或者是拦截网络请求进行过滤,一种是非root设备采用VPNService功能进行网络请求拦截

从他的界面看来他是用了第二种方式,而对于Android中VPN开发不熟的同学可以自己去网上搜一些资料,就是注册一个VPNService,然后获取到系统的VPN权限,然后设备的网络请求都会通过这个Service,只要在这个Service中做处理就可以了。那么这个app中肯定有一个过滤库用来存放市面上所有视频播放的广告地址,这也是我们破解的入口。那么下面就来进行破解操作了。

首先还是使用apktool工具进行反编译,幸运的是他没有做应用加固,反编译很顺利。不过这里最好使用一个jadx工具,他是一个可视化反编译工具,比较方便,查看他的AndroidManifest.xml文件,找到VPNService声明:

然后去查看VPNRouterService类实现:

然后可以全局搜一下Builder这个名称,因为构建VPN必须使用到这个类:

这段代码就是开始构建VPNService了。下面继续深入跟进,最终到了run方法中:

然后在看一下startTunnel方法:

好了,这是一个native方法,下面继续来分析so文件了:

使用IDA工具打开,查看这个so文件内容:

发现这个方法中做了一些初始化工作,那么猜想视频广告地址应该是保存在一个加密的文件中,而且最有可能是一个数据库文件,同时这个过滤地址可以支持服务端更新,因为现在视频广告地址发生了改变了,这个app也是需要感知的。可以看到的确有一个入口可以更新过滤规则:

通过上面的代码可以分析到过滤规则文件加密了,那么可以进入这个加密方法中看看,这里使用IDA的F5功能键得到汇编对应的C代码:

这里就可以清晰的看到了,在这个应用的沙盒中有一个txt文件,这个文件中保存了数据库文件的路径:

然后我们把这个文件导出来,记得他为了掩人耳目,把db后缀名删了,我们需要手动的加上后缀名:v_0.0.32.db文件,可惜的是打开文件之后发现报错:

因为这个数据库文件是加密的,加密算法是AES:

看到这里,我们可能想到了,需要动态调试so得到这个加密的密码了,但是这里不这么干,因为我很懒,动态调试感觉老费劲了,所以就发现了一个捷径,我的思路是这样的:

前面分析了这个app过滤广告的原理是借助于VPN进行拦截请求,那么拦截到请求得到指定域名肯定是去和过滤规则进行比较判断的,因为这些规则是放在数据库中的,所以不可能每次都是去查询数据库中的记录进行比较,这样效率会很低下的,所以这里在想他为了提高效率,应该做了一个缓存池用来存放命中的域名地址。那么就好办了,如果做了缓存池的话,域名地址就是一些字符串值了,从另一方面在本地他应该也有默认的一些字符串地址,防止更新过滤规则失败作为备用的,从这两方面可以知道应该本地有一些广告域名字符串内容。

在IDA中我们可以使用Shift+F12查看一个so文件中的字符串值:

我们可以看到这里有很多字符串的值,可以往下查看,我们关注的内容是域名字符串,那么域名字符串的值有一个特点就是以.com结尾的,所以我们可以这么干,把这些内容复制出来放到一个txt文件中:

然后写一个简单的程序进行过了即可,忘记了python脚本了,只能靠着老本行的Java语言写了:

代码很简单的,就是读取每一行内容,然后进行字符串过滤,得到域名,因为后面我们得到这个域名之后也是要添加到hosts文件中,所以就直接在这里构造一个ip地址和域名的映射关系了。运行程序之后,生成的文件内容如下:

感觉有点像是各家视频广告请求的域名地址了。

三、修改hosts文件进行验证

那么到这里我们就通过静态方式破解了净网大师得到了市面上视频app播放广告的域名地址了,下面就赶紧操作一下看看效果,这里为了方便,手上正好有一个root的手机,所以直接把上面生成的规则加到设备的hosts文件中,Android中的hosts文件存放的目录是在根目录下的  /etc/hosts

然后咋们添加成功之后,就立马来体验一下,这里选择了爱奇艺和腾讯视频作为案例操作一下:

首先来看一下爱奇艺的广告过滤效果:

看到了,这里点了两个热门视频都是没有广告的,再来看一下腾讯视频:

看到啦,也是没有广告了,看来是成功了,还有其他视频app,感情去的同学可以自己去尝试了。这里就不在演示了。

说明:

有的同学会好奇,既然这个app可以做到过滤广告,那还破解干嘛,直接用就可以了呀,其实这么想就是对程序猿的侮辱,其次是这个app使用了vpn功能,怎么说了,个人对这个功能和app并不怎么放心,感觉设备的所有网络请求都能被他拦截到是件多么恐怖的事,最重要的一点是,本文使用了root设备之后修改hosts文件实现的,如果哪天想通过修改路由器中添加规则,电脑挂代理方式操作那不就扯淡了,你都没有域名怎么办,所以不管怎么样都得破解这个app得到最终的域名,这样才保险,后续自己想怎么搞就怎么搞!

四、知识总结和回顾

到这里我们就完美的过滤了市面上所有视频app的广告逻辑了,在整个过程中我们可以看到有大部分的猜想,有了猜想然后才去进行实践逻辑的,所以说在逆向领域有时候需要丰富的经验,有时候也要敢大胆的猜想。下面来总结一下我们的操作流程:

第一步:了解现阶段视频广告播放的原理

现在移动端app的广告播放原理都是将广告短片和视频内容分开的,那么广告短片应该也是在线请求一个播放地址,如果要是能够得到这个播放地址就可以完成剔除工作。

第二步:有了广告域名如何进行广告过滤

这个需要了解系统在请求网络的时候的原理,其实是先去找本机的hosts文件,看看请求的域名有没有对应的ip地址,如果有就直接使用ip地址作为请求地址了,那么这里的思路就是可以修改hosts文件来做到广告域名请求的拦截工作,也就是在hosts文件中添加广告请求域名的映射关系,把域名指向本地ip地址:127.0.0.1即可

第三步:如何获取视频广告的请求域名

其实这里有多种方式:一种是进行网络抓包,一种是通过破解视频app,一种是借助其他家app。而本文中就是借助了第三方app叫做净网大师来获取到的域名,这时候就需要进行破解净网大师app了,而这个就是本文的一个重点。在破解的过程中我们一部分借助的是逆向经验一部分是借助的大胆猜想,比如猜想他域名肯定会在本地有一个字符串池保存,这个是本次破解的关键步骤。

第四步:有了域名如何进行过滤广告

这里因为前面了解了系统请求的原理,那么就可以有三种方式:一种是修改设备的hosts文件,前提是设备需要进行root;一种是通过挂代理,修改代理机器的hosts文件;一种是修改路由器的过滤规则;这三种方式各有优缺点。

严重声明:本文介绍的知识点完全是从一个技术分享角度出发,绝非用于任何商业活动和用途,如果涉及到任何法律问题将由操作者本人负责。本文作者将不负责任何法律责任!也请各位同学秉着技术角度出发的原则,切勿用于商业中!


视频App如何规避这种操作:作为视频App广告是其生存之本,所以对于这种操作的用户,因为自己也要做一些防护策略,可以本地启动一个后台服务,通过ping命令来检测当前广告域名对应的ip地址,如果发现不是自己域名对应的ip地址,那么就不让其看视频内容,但是这种方式是不是可行还有待验证!

六、总结

本文主要介绍的内容还是破解相关的知识点,而本文在破解的过程中用到了大量的猜想,然后通过实践去证明猜想,有时候多一些猜想也会让破解过程变得更加便捷,同时通过本文之后,小编以后看视频在也不用看广告了。

更多内容:点击这里

关注微信公众号,最新技术干货实时推送

时间: 2024-10-09 01:30:02

Android中静态方式破解某App实现所有视频app去除广告功能的相关文章

Android逆向之旅---静态方式破解微信获取聊天记录和通讯录信息

一.猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用,已经替代了传统的短信聊天方式了,只要涉及到聊天就肯定有隐私消息,那么本文就来讲解如何获取微信的聊天记录以及通讯录信息. 首先我们在没有网络的时候,打开微信同样可以查看聊天记录,说明微信会把聊天记录保存到本地,那么这么多信息肯定会保存在数据库中,所以我们可以去查看微信的databases目录看看内容: 可惜的是,我们在这个里面并没有发现一些有用的数据,所以这时候就了解到了微信因为把重要信息的数据库存在其他目录下面,我们可以直接把微信的整个

Android中BindService方式使用的理解

Android中BindService方式使用的理解 - 唯一小神 - 博客园 最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现. BindService和Started Service都是Service,有什么地方不一样呢: 1. Started Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行[onCreate()-? >onS

【转】Android中BindService方式使用的理解

原文网址:http://www.cnblogs.com/onlylittlegod/archive/2011/05/15/2046652.html 最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现. BindService和Started Service都是Service,有什么地方不一样呢: 1. Started Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系,

Android中静态变量的生命周期

静态变量的生命周期,起始于类的加载,终止于类的释放.什么时候类会加载呢?我们知道,在app打开时,会创建一个进程,然后初始化一个dvm的实例,负责类的加载释放 和 垃圾回收等.换句话说,在进程创建之后,就会加载类,静态变量诞生了.那何时释放?当然是在类卸载的时候.同上面.在进程结束之前,静态变量就寿终正寝.我们知道,Android中,你是不知道何时进程会被Kill.所以1.不能保证静态变量会一直存在.(进程可能被Kill掉)2.每次打开app时静态变量的值都是初始值(进程没有被kill掉所以静态

Android初级教程:Android中解析方式之pull解析

在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在javaweb一些知识中有写过dom和dom4j等等解析方式.有兴趣的读者可以去javaweb篇里面找相关的内容. 先自定义一个数据源,假设就是访问服务器返回的xml数据文件名称为weather.xml: <?xml version='1.0' encoding='utf-8' standalone=

android中Post方式发送HTTP请求

Post方式比Get方式要复杂一点,因为该方式需要将请求的参数放在http请求的正文中,所以需要构造请求体. 步骤: 1.构造URL URL url = new URL(PATH); 2.设置连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(3000); connection.setDoInput(true);//表示从服务器获取数据 c

Android 中使用MediaRecorder进行录像详解(视频录制)

在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.app.Activity; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; import android.media.MediaRecorder; import android.os.Bundle;

Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为了安全或者效率问题,会把一些重要的功能放到native层,那么这样一来,我们前篇说到的Eclipse调试smali源码就显得很无力了,因为核心的都在native层,Android中一般native层使用的是so库文件,所以我们这篇就来介绍如何调试so文件的内容,从而让我们破解成功率达到更高的一层.

Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)

一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用apktool来反编译apk,得到smail源码,然后分析smail代码,采用代码注入技术来跟踪代码,然后找到关键方法进行修改,进而破解,同时还可以使用一些开源的hook框架,比如:Xposed和Cydia Substrate,来进行关键方法的hook.所以这里我们可以看到我们破解的第一步是使用ap