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)。
本文含有隐藏内容,请 开通VIP 后查看