vmos pro是在安卓上运行的安卓模拟器,自带root,免root运行Xposed,免root运行Magisk等,支持修改分辨率,支持谷歌GMS服务,后台可持续运行.
背景
意外发现这么一款好玩的虚拟机但使用起来有诸多限制,需要购买会员才能畅玩,网上也有很多破解版但版本都比较旧,从学习的角度出发,能不能自己搞一个呢
步骤
Jadx打开看一眼
一看就是360加固,需要脱壳,使用dex-dump或者fart都可以,
例如我使用fart脱下来这堆dex文件
再用jadx全选打开就可以看到原本程序的逻辑了。
接下来就是寻找判断是否为vip的逻辑在哪里了,直接在jadx搜索某些关键词去分析是比较low的,我们可以通过一些通用的hook脚本看能不能快速切入。
【这个应用有一些按钮,一点击就提示你要开通会员】,那我们可以通过frida hook OnClickListener看看,这里使用肉丝姐的hookEvent.js试试
var jclazz = null;
var jobj = null;function getObjClassName(obj) {if (!jclazz) {var jclazz = Java.use("java.lang.Class");}if (!jobj) {var jobj = Java.use("java.lang.Object");}return jclazz.getName.call(jobj.getClass.call(obj));
}function watch(obj, mtdName) {var listener_name = getObjClassName(obj);var target = Java.use(listener_name);if (!target || !mtdName in target) {return;}// send("[WatchEvent] hooking " + mtdName + ": " + listener_name);target[mtdName].overloads.forEach(function (overload) {overload.implementation = function () {//send("[WatchEvent] " + mtdName + ": " + getObjClassName(this));console.log("[WatchEvent] " + mtdName + ": " + getObjClassName(this))return this[mtdName].apply(this, arguments);};})
}function OnClickListener() {Java.perform(function () {//以spawn启动进程的模式来attach的话Java.use("android.view.View").setOnClickListener.implementation = function (listener) {if (listener != null) {watch(listener, 'onClick');}return this.setOnClickListener(listener);};//如果frida以attach的模式进行attch的话Java.choose("android.view.View$ListenerInfo", {onMatch: function (instance) {instance = instance.mOnClickListener.value;if (instance) {console.log("mOnClickListener name is :" + getObjClassName(instance));watch(instance, 'onClick');}},onComplete: function () {}})})
}
setImmediate(OnClickListener);
点击下按钮,成功找到对应的代码!
那就省事多了,直接jadx查看代码逻辑,发现代码只是轻度混淆,很轻松能找到notLogin、getIsAnnualCard等函数,hook修改逻辑即可,顺利解锁vip功能。
要实现破解可以通过xposed或者重打包来实现。
由于360加固的原因,重打包我试了并不顺利,以后有时间再研究吧。
xposed实现倒是挺顺利的,代码不能分享,留一点作思路(记得从壳入手切换classloader)。