missevan 功能逆向分析

样本

包名:cn.missevan
版本:5.5.0

“已购”(失败)

分析付费广播剧“已购”功能

反编译APP

Apktool反编译apk时,遇到“dex部分加密”问题,解决办法:./apktool d xx.apk –only-main-classes。

分析工具

一开始Jeb一个一个dex分析,但是dex之间函数调用、交叉引用非常难找(共6个dex),后面jadx好用了很多。Jeb无法对apk整体分析报错为内存不够,扩大java内存也没有解决,后放弃。

定位与hook

付费,与pay有关,搜索关键字,发现有很多getNeedPay、getPayType、needPay、getCurrentNeedPay关键字函数以及字符串,通过objection 逐一hook查看是否真的被调用,全部hook并修改返回值,其中getCurrentNeedPay返回-1,剩余返回2。
(linux 在文件夹下所有文件中查找字符串:grep -r “strs”dir;jadx直接搜索关键字,勾选insentive case,忽略大小写)
 这里一开始没有对getCurrentNeedPay进行hook,导致进入付费音频播放界面后显示“立即收听”,通过搜索关键字,分析上下文代码才发现对getCurrentNeedPay进行了判断。
674e49409ce418a6526ab17ff26529a2.png
(完整hook脚本见js)

重点突破,逆向分析、hook

hook完后页面由“付费”->“已购”,但是进入付费音频播放界面仍不播放音频。

在objection中对函数调用栈逐层往上追溯,发现handlemsg(cn.missevan.play.utils.PlayCallbackHandler.handleMessage)中免费和付费的“soundurl”值不同,即付费的值为空。

(由于较敏感,hook 图片已隐藏)

分析上下文,因为是回调,通过调用栈就能看出无法追溯发送消息的源头。

思路1:

搜索所有“soundurl”关键字,看是哪个函数处理或者发送url的,但是objection hook所有,实际都没有调用相关函数……是个幌子。

思路2:

通过卡住的界面,寻找可疑函数,这里的寻找方式是通过付费音频播放界面后显示“立即收听”分析上下文,找到付费音频播放界面类是“cn.missevan.view.fragment.PlayFragment”,以及之前卡住的“getCurrentNeedPay”进行静态代码分析,实际上并没有找到播放音频的相关函数。之后全局寻找播放音频的类(mediaplayer之类的,objection一hook app就崩了,有可能是hook的类或者函数不对,导致多进程运行时程序卡住崩溃,因为涉及到音频系统类的源码分析,由于水平不够没再往下分析)……猜测要么是so处理,要么服务器后台做了身份认证等处理,导致服务器就没返回可播放的url,音频类自然无法正常播放。

(由于较敏感,hook 图片已隐藏)

这里有个小插曲,“cn.missevan.play.utils.PlayUtils.isPlaying”如果hook返回为true,付费的音频也可以自动加载弹幕,但仍无法播放音频。分析上下文未找到音频相关函数或代码逻辑。

思路3:

尝试抓包,没看出区别。因为都是okhttp3传输,分析了上下文,没找到。

思路4:

So处理的话,全局搜索java jni注册声明(static native xx xx),没有发现与播放相关的类函数使用了jni;身份认证,则需要伪装成已购买用户,猜测服务器对userid的购买记录做了报错,单从客户端无法解决。

结论

未成功
1) 函数反射、handle、okhttp的跟踪分析:对Android开发、回调机制了解不够
2) Interface接口的重写:全局搜索接口类,寻找所有可能重写的类逐一分析/hook调用情况。
3)换种思路:修改钻石数量,直接买剧,即无限钻石版。(待尝试) 4、 网上的破解版:
对比分析,破解版仅修改了getNeedPay的返回值(2),其余没动,但是效果跟我的hook结果一样。
同时破解版内嵌了签名修改hook代码:https://www.52pojie.cn/thread-995777-1-1.html

“无限钻石”(待尝试)

思路:修改购买成功的回传包(困难)、hook相关钻石数量代码的返回值(容易,但成功率如何?)
7e989e27f9b9dbf906a93f24ab3cc6c6.png