七仔 发表于 2020-5-3 11:25:41

【APP逆向-入门级】记一款直播APP逆向过程


前些天看到有一篇公众号推送,也是这种类型的逆向,之前没大留意看,不知道是否是同款的




重点:先向审核客服声明一下:本文仅仅是用于技术交流,而非传播不当的东西,文章提到的截图已经全部打码、也没有提及是什么APP,希望审核人员可以通过本文章,谢谢。




首次发帖,由于本次逆向极为简单,仅仅靠手机就能进行的逆向,甚至可以都算不上APP逆向,请小声逼逼,哈哈(文末有福利)




这是一篇入门级的APP逆向教程,如有写着不对的地方,烦请大佬们指出,互相学习,谢谢啦


前言


本文起源于:前两天,我的一位朋友跟我说,他在QQ群里面,一位群友,发了一些黑色/灰色地带的产业链信息,他就仅仅是好奇,去下载了那款APP

原来发现,QQ群友的分享,是为那款APP做引流,一个有效的分享可以获得多少金币(砖石)这种(是指引导别人来注册,才算有效分享,才能获取金币)

打开之后,发现很惊人,这直播!!!

而这直播APP里面区分:免费和付费的房间,当你想要看付费的房间,那你只能看前面几十秒钟的时间,过了这个时间就会弹窗出来,让你付费,才能继续看

我朋友就让我帮忙看看,跟我说有什么能难倒程序员的??而且刚好最近我在学APP逆向,心里想着,这种APP又不能大力宣传,估计反逆向不会做很好吧?然后就开始尝试搞搞,看看能不能逆了它
0x00、预估一下本次的逆向步骤[*] 第一步、抓包分析[*] 第二步、反编译[*] 第三步、根据第一步的抓包关键词来搜索[*] 第三步、根据抓包信息、收费弹窗,来分析这个收费的逻辑[*] 第四步、得出这个逻辑之后,对smali代码进行篡改,保存[*] 第五步、回编译APP,重新打包签名
本次用到的工具:魅族手机(Flyme6)已经root的、HttpCanary抓包工具、MT管理器、xxApp(这个不公开说了)



0x01、首要就是抓包分析
由于本次使用的手机是root的,而且抓包工具的证书已经被我安装到系统证书的目录下,而非直接安装到用户个人证书(所以对于本次APP是否有检验抓包工具检测这一块,直接忽略掉)

打开HttpCanary抓包工具,然后找到【设置】




https://img-blog.csdnimg.cn/20200501221237276.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center




然后选择【目标应用】,这里为了过滤无用的包,减少干扰,利于快速分析




https://img-blog.csdnimg.cn/20200501221214445.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center







https://img-blog.csdnimg.cn/20200501223012714.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171




返回去之后,点击开始【抓包】,然后转向去打开目标APP,然后打开一些room,免费的、收费的都开一下,目的就是为了抓包,看看APP发起了哪些请求、收到哪些响应




https://img-blog.csdnimg.cn/20200501223421483.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center







再切换回来之后,发现已经存在一堆抓包信息了




https://img-blog.csdnimg.cn/20200501223044692.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171







一个一个查看包响应,看看有什么收获

没想到,竟然发现如此大的突破口







https://img-blog.csdnimg.cn/20200501223109391.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171







看下面的两张截图前,再次向广大博友们声明:本次教程仅仅是用于技术交流,而非传播不当信息,谢谢。

下面来看两张收费的room的就截图:一个用户点进去看了几十秒(应该是30s,具体是多少没有数),然后就弹窗出来说得需要付费才能继续,这不诱惑人进行付费吗?









upload/attach/202101/70_T66RRSBA5BGFZY5.png




upload/attach/202101/70_6AQH98KT37XHHUE.png



0x02、反编译APP[*]
鄙人一开始是,使用 jadx-gui 来反编译APP,发现没有壳、没有很强的混淆,可以直接反编译
[*]
反编译之后,进行相关的关键字来搜索,前面抓包中,有个很有用的关键词:
"type": "2","type_val": "38","type_msg": "本房间为收费房间,需支付38钻石"
再来简单分析一下:这三个字段中,如果你直接搜索 type 的话,根据经验,这肯定会出现很多搜索结果,排除它;而 type_val 、type_msg 这两个字段出现的概率不会很大,那么分析完了,就开始搜索呗!!!

首次我搜索的是 type_val ,但是出来的结果还是不够精准,有6/7条结果; 然后转去搜索 type_msg ,发现出来的结果只有两处,这不就是很精准了吗,噢耶!!




https://img-blog.csdnimg.cn/20200501230410779.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center

然后选择第二个进去看看。

你们可以思考一下为什么是选第二个呢?(我个人纯粹是靠大胆的猜测,因为第二个有关键词 LiveRoom,就是直播房间嘛)




https://img-blog.csdnimg.cn/20200501231116935.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center







发现抓包中的三个参数,都在这里取出来了,而且发现是对那个 type 字段进行判断是否收费的,多次抓包分析得出返回的数据中:免费房间的 type=0,收费的房间 type=2,至于代码中还有一个 type=1 的判断,看到代码中调用的方法名,可以猜测:
[*]type=0,调用 forwardNormalRoom 方法,根据字面意思是:转到正常(免费)房间处理逻辑[*]type=1,调用 forwardPwdRoom 方法,根据字面意思是:转到输入房间密码处理逻辑[*]type=2 || type=3,调用 forwardPayRoom 方法,根据字面意思是:转到房间收费的处理逻辑
所以,我们只需要将,type=1/2/3里面的调用方法,改为调用type=0的方法即可绕过这个限制,话不多说,下面就是修改的步骤,Just do IT
0x03、修改 smali 代码,重新打包、签名
理清当前逻辑之后,本文使用最轻量级的、入门级的、小白级的工具——MT管理器



简单来简述一下它的功能:
[*] 其他文件夹有的基础功能它也都有(复制、移动、重命名等等)[*] APP安装包编辑 ,主要有 DEX 编辑,ARSC 编辑,XML 编辑,APK 签名、APK 优化、APK 共存、去除签名校验、RES 资源混淆、RES 反资源混淆、翻译模式等[*] 可以修改文件夹权限(系统目录的话,需要 root 权限才能修改)[*] 自带强大的文本编辑器,可以流畅编辑大文本文件,支持设置是否显示行号、开关自动换行、双指缩放字体大小、自动识别编码、代码语法高亮、自动缩进、正则搜索替换
其他更加强大功能,待你们去发掘,相信用过了之后,你们会觉得这是用来修改APP包/破解APP限制的一个好工具。

本次主要是使用它的第二个功能——APP安装包编辑功能




1.使用MT管理器【查看】目标APP包
[*]https://img-blog.csdnimg.cn/20200502211014480.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center





[*]
[*]https://img-blog.csdnimg.cn/20200502202144885.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171[*]图中我圈了红色的三个文件是我们待会需要进行操作的
其中,第一个 META-INF目录中,包含了一些签名文件等,我们将里面的 三个文件删除掉:CERT.RSA、CERT.SF、MANIFEST.MF(其中CERT.RSA、CERT.SF这两个命名,不同APP可能会名字不一样,只要找到后缀格式一样的即可)。

Tips:鄙人在这里踩了一个坑,这个好像得需要删掉这三个文件打包才不会被检测到。不然重新打包签名之后,一联网打开APP就会出现闪退的情况,估计是被检测检验了。

文件 classes.dex、classes2.dex 就是APP编译之后,Class转成成.dex文件,dex是Android平台上(Dalvik虚拟机)的可执行文件, 相当于Windows平台中的exe文件, 每个Apk安装包中都有dex文件, 里面包含了该app的所有源码, 通过反编译工具可以获取到相应的java源码。

一些工程很大的话就会产生多个.dex文件,到现在有了前面的介绍,我们可以简单的知道:dex 文件就变相等于可执行的源码,那我们可以通过修改这个源码来达到逆向的目的(说法如有说错,烦请大佬们纠正,谢谢啦)。
[*]先打开第一个dex文件,MT管理器会提示我们,要用哪个打开,选择 【Dex编辑器++】即可 [*]
[*]
[*]https://img-blog.csdnimg.cn/20200502211149489.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center[*]选择【搜索】 ,然后输入刚刚那些关键词【type_msg】
https://img-blog.csdnimg.cn/20200502223039562.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center



[*]点击右上角,再次进行搜索:【type_msg】 [*]
[*]https://img-blog.csdnimg.cn/20200502212148693.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center [*]此处,你得需要一些smali语法,但是本文我只介绍本文使用的语法:[*] if-eqz : 意思就是 是否等于0(if equal zero)[*] if-eq:意思就是 是否相等 (if equal)[*] const/4 p2,0x1:意思就是将0x1,即0x01赋值到 p2 ,即 p2=1
所以,if-eqz p1,:cond_4b就是:如果 p1=0,那么调用方法 cond_4b; if-eq p1,p2,:cond_45如果 p1=p2(p1=1),那么调用方法 cond_45 ;

这也印证了我们前面反编译APP的源码逻辑。 那肯定会有小伙伴会问,那个 cond_4b 是什么方法?很好,我这里回答一下,因为通过我们前面反编译的分析,我们已经知道,如果type=0的时候就是调用 forwardNormalRoom 方法,所以,可以肯定的告诉你们,这个cond_4b就是指向这个 forwardNormalRoom 方法。

6.将type=1/2/3的情况,调用的方法改为调用 cond_4b 即可,然后点击右上角的保存







https://img-blog.csdnimg.cn/2020050221461558.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center




7.保存之后,返回上一层第一层搜索的时候,点击右上角,选择【编译】







https://img-blog.csdnimg.cn/20200502220250206.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center




8.编译之后进行返回,返回的时候会提示你,点击【退出】即可。此时会再次提示你,dex文件已经修改,问你是否更新到压缩包中 ,我们选择【确定】







https://img-blog.csdnimg.cn/2020050222080531.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center




然后你会看到压缩在更新




https://img-blog.csdnimg.cn/20200502220949175.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center




9.然后返回之后,你会看到一个刚刚被修改过的apk文件,显示绿色名字的,然后点击它,第一步选择【功能】、第二步选择【APK签名】







https://img-blog.csdnimg.cn/20200502221547811.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center










选择【确定】即可







https://img-blog.csdnimg.cn/2020050222182185.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTE3MzM3NA==,size_16,color_FFFFFF,t_70&ynotemdtimestamp=1588474252171#pic_center







然后就任君选择啦
0x04、最后重新签名之后,你可以卸载原来的APP,然后你就....,哈哈哈...
本文入门级的APP逆向教程已经编写完毕
最后: 真感谢每一位小伙伴,竟然看完了我的文章,谢谢你们啦,有帮助的话,点个赞呀
希望小伙伴们都别用于非法的手段,本文只是技术交流

还有一个注意的地方,修改 smali 源码的时候,如果有注释的话,注释是不能带有中文字符的,或者你转换为 Unicode 形式

谢谢大家

相关文献参考:

META-INF目录是干啥用的?

● CSDN: https://blog.csdn.net/weixin_41173374

● Gitee博客: https://qqizai.gitee.io/

● Github: https://github.com/qqizai




七仔 发表于 2020-5-3 11:39:37

小标题的编号有点问题,啊哈哈哈,但文章内容顺序是对的

FFFFF 发表于 2020-5-3 11:53:03

让我康康

Nanda 发表于 2020-5-3 13:05:26

关键时候竟然让评论

Nanda 发表于 2020-5-3 13:11:02

已看完,感谢分享。长见识了,逆向还有这种用途。。

daisixuan 发表于 2020-5-3 13:51:36

666

小飞刀 发表于 2020-5-3 14:50:36

666

jianan 发表于 2020-5-3 21:10:58

看看    学习学习

masicro 发表于 2020-5-3 21:27:31

66666

jiulaikk 发表于 2020-5-4 01:05:01

给个样本看看
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【APP逆向-入门级】记一款直播APP逆向过程