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进行了判断。
(完整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相关钻石数量代码的返回值(容易,但成功率如何?)