前段时间偶然发现一个直播软件,里面的内容嘛,很刺激,就是那种大家懂得。可是好看的所有都提示我须要钻石观看,做为一个优秀的好青年,怎么舍得用本身辛辛苦苦赚的钱去看这种东西,恰好对逆向仍是懂些皮毛,因而,便开始了下面的内容,因为该软件比较
,想要测试的伙伴,能够私信我哦html
熟悉逆向的小伙伴应该都知道,要破解它首先须要反编译了,看看源码,才有下手的方向。这时候就不得不介绍一下,反编译的三个好伙伴了。java
1.dex2jar 这个是用来把java编译后的dex文件从新转化为jar文件,这儿普及一下,dex文件就是可以被DVM或者Art虚拟机执行的文件,记录了全部类文件的信息。说白了就是用这个来提取你能看得懂的java代码android
下载地址:sourceforge.net/projects/de…git
2.jd-gui 这个就是用来打开上面的jar文件的工具github
下载地址:www.softpedia.com/get/Program…服务器
3.apktool 抄一下百度,GOOGLE提供的APK编译工具,可以反编译及回编译apk,(很重要)app
下载地址: ibotpeaches.github.io/Apktool/框架
下载好这三个就能够开始逆向之旅了ide
1.把须要破解的apk文件重命名,后缀修改成zip,并解压出来工具
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这个东西了。使用方法我介绍一下,先把你要反编译的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
-keystore mykey.keystore指明须要使用的签名文件
-signedjar signed_myapp.apk指明生成的签名过的apk的名称(路径)
myapp.apk表示未签名的apk文件
myAlias表示签名文件mykey.keystore的别名(在生成这个签名文件的时候配置的属性)
签名完成以后就能够直接安装看效果了,后面的效果我测试了,倒计时被干掉了,也就是视频能够一直观看,可是上面一直会有收费窗口,大家能够自行思考一下,怎么把收费窗口也屏蔽掉。成品apk能够私信我,我发给大家,有须要的话,也会出后续。
此次逆向仍是很简单的,没有涉及到混淆,代码逻辑也不算太复杂,很适合小白入手,代码分析过程很重要,看懂了代码才有解决思路。屏蔽方法也多种多样,再推荐你们能够尝试用Hook的方法来屏蔽弹窗,当下比较流行的xspoed框架。不少apk都会有签名验证,二次打包后不必定能用。好了就到这儿了,以为还能够的点个赞哦。