Android 逆向 某视频直播软件,破解收费观看

49,924 阅读8分钟

简介

      前段时间偶然发现一个直播软件,里面的内容嘛,很刺激,就是那种你们懂得。但是好看的全部都提示我需要钻石观看,作为一个优秀的好青年,怎么舍得用自己辛辛苦苦赚的钱去看这种东西,刚好对逆向还是懂些皮毛,于是,便开始了下面的内容,由于该软件比较,想要测试的伙伴,可以私信我哦

准备工作

       熟悉逆向的小伙伴应该都知道,要破解它首先需要反编译了,看看源码,才有下手的方向。这时候就不得不介绍一下,反编译的三个好伙伴了。

1.dex2jar  这个是用来把java编译后的dex文件重新转化为jar文件,这儿普及一下,dex文件就是能够被DVM或者Art虚拟机执行的文件,记录了所有类文件的信息。说白了就是用这个来提取你能看得懂的java代码

下载地址:sourceforge.net/projects/de…

2.jd-gui 这个就是用来打开上面的jar文件的工具

下载地址:www.softpedia.com/get/Program…

3.apktool 抄一下百度,GOOGLE提供的APK编译工具,能够反编译及回编译apk,(很重要)

下载地址: ibotpeaches.github.io/Apktool/

下载好这三个就可以开始逆向之旅了

提取jar文件

1.把需要破解的apk文件重命名,后缀修改为zip,并解压出来



 各个文件的左右就不说了,相信做android的基本上一看就明白了。今天只用的上三个.dex文件。把三个文件拷贝备用。

把dex文件转为jar文件

1.将三个文件拷贝到dex2jar目录下


2.用d2j-dex2jar.bat 文件,将dex转为jar(在当前目录打开cmd窗口  shift + 鼠标右键)然后执行命令:d2j-dex2jar.bat classes.dex 如下所示


执行完成之后会生成如下jar文件,至于error.zip,这是错误日志说明反编译的时候某些地方报错了,只要不影响到里面代码的主体结构,可以暂时不要管


同时别忘了将另外两个dex文件也转换出来

分析源码

得到三个jar文件之后使用jd-jui.exe打开三个jar文件,我这儿就只打开前两个文件了,因为我在分析的时候发现第三个文件对我们分析用处不大,就不管它了。


上面可以看出,有很多个包,其实很多都是引用的系统代码,或者就是第三方架包,我们需要定位到该app的工程目录,缩小范围,别还没开始看到这么多包就退缩了。这儿讲几个技巧

1.使用apktool反编译apk查看AndroidManifest.xml文件

       这个文件相信做adnroid开发的都不陌生吧,应用的包名,以及启动activity等,所有activity都会被注册在这里面,通过可以很轻松的找到该app的工程目录

2.直接猜

        先别喷,这儿的猜是有经验的猜,并不是要你一个一个的打开看,我们玩开发的都知道,应用的包名基本上都是com.组织名.项目名,结合该应用的名字,也可以很快定位

3.全局搜

         通过观察app运行时的一些固定参数,再使用jd-gui的全局搜索功能,可以很快定位到文件。后面也会一直使用他


具体分析过程

到这儿基本上了解的也查不多了,剩下的就是找到目标代码块了,先分析一下他的效果:

       打开app查看,普通的直播可以直接进去观看,再看看收费直播,可以预览10秒左右,但是上面会有收费弹窗遮挡。十秒之后视频会黑屏弹出收费窗口。

可以正向思考一波,自己遇到这种需求应该怎么做。再结合它的效果,可以推断一下,他是首先请求服务器直播列表数据,里面包含每个直播间的信息,包括是否收费,推流地址,然后再点击播放,跳转到一个activity中,当收费直播的话,就弹出收费窗口,并且在预览十秒之后,停止播放。

分析完之后,再找到代码验证一下我们分析的是不是正确的,先从弹窗入手,可以看到他的弹窗会有固定信息“收费”两字,所以全局搜索一下“收费”



看结果,找到了两个类,点进去观察一下,很明显,第一个类对我们来说是有用的,

PayLiveBlackBgView.class 顾明思意,他是该软件的播放背景view,再看看行明显的汉字,明白了,这个就是来控制倒计时的,再往下走走可以看到 

 private int proview_play_time = 15000; 定义了一个变量,预览时间15s,这时候是不是有种思绪大开的节奏,我们可以延长预览时间,就可以实现一直看的功能了,这儿我试了一下,把15000多加了两个0,重新编译会报错,因为15000在smail里面被定义成了一个short多加两个零会超过长度,就报错了,当然熟悉smail语法的也可以这样改试试。

既然上面改时间不行,再往下看看,有个startCountDown(打开倒计时)


看下他的大概逻辑,先停止倒计时,再判断parmLong 是否大于 0L ,然后创建计时器,计时结束之后,destoryVideo。

这时候又可以有两种实现方式了

1.计时结束之后不调用destoryVideo  2.干脆不让他计时

我选择第二种方法,实现呢就是在判断parmLong 是否大于 0L时让他返回false,自然就不会进入下面的计时方法了。

使用apktool

知道怎么改之后就需要用到apktool这个东西了。使用方法我介绍一下,先把你要反编译的apk文件,和他放在一起,就像下面一样


然后在当前文件夹下打开命令窗口,执行

apktool d huanghou.apk

执行完之后,会在当前目录下输入



打开文件夹,通过之前的jar文件路径,找到对应的smail文件位置,如下所示


用记事本或者别的工具打开文件,我用的Notepad++,打开之后你会发现,这尼玛是什么玩意,完全看不懂啊,哈哈。其实我也看不懂,不过没关系,现学现卖就好了,刚才我们找到了个startCountDown方法是吧 ctrl+f 搜索一下,找到该方法


看到 if-lez v2 , : cond_0 , 这个if应该就是判断parmLong 是否大于 0L的了,他的意思大概为

如果vA小于等于0则跳转到:cond_0 ,只需要把条件改为不成立即可,这儿copy一段:

条件跳转分支:

"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
"if-le vA, vB, :cond_**" 如果vA小于等于vB则跳转到:cond_**
"if-eqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
"if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
"if-ltz vA, :cond_**" 如果vA小于0则跳转到:cond_**
"if-gez vA, :cond_**" 如果vA大于等于0则跳转到:cond_**
"if-gtz vA, :cond_**" 如果vA大于0则跳转到:cond_**
"if-lez vA, :cond_**" 如果vA小于等于0则跳转到:cond_**

挑一个相反的吧,把lez换为gtz。保存就OK了

回编译

修改完之后,就该测验一下,在文件夹下执行

apktool b huanghou

会在huanghou文件夹下生成两个文件夹


在dist文件夹下会生成修改后的apk文件了,这时候先别着急安装,还需要给apk签名,没有签名文件的话先用studio生成一个,或者百度一下生成个签名文件

执行命令

jarsigner -verbose -keystore mykey.keystore -signedjar signed_myapp.apk myapp.apk myAlias

-verbose 表示签名时输出详细信息

-keystore mykey.keystore指明需要使用的签名文件

-signedjar signed_myapp.apk指明生成的签名过的apk的名称(路径)

myapp.apk表示未签名的apk文件

myAlias表示签名文件mykey.keystore的别名(在生成这个签名文件的时候配置的属性)

签名完成之后就可以直接安装看效果了,后面的效果我测试了,倒计时被干掉了,也就是视频可以一直观看,但是上面一直会有收费窗口,你们可以自行思考一下,怎么把收费窗口也屏蔽掉。成品apk可以私信我,我发给你们,有需要的话,也会出后续。

总结一下

这次逆向还是很简单的,没有涉及到混淆,代码逻辑也不算太复杂,很适合小白入手,代码分析过程很重要,看懂了代码才有解决思路。屏蔽方法也多种多样,再推荐大家可以尝试用Hook的方法来屏蔽弹窗,当下比较流行的xspoed框架。很多apk都会有签名验证,二次打包后不一定能用。好了就到这儿了,觉得还可以的点个赞哦。