Snipaste_2025-01-23_10-08-42.png (312.16 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
2.发现没加固,那省事了,直接拖进jadx里看看,确实没加固。
Snipaste_2025-01-23_10-09-27.png (184.77 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
3.还是和之前一样,上算法助手,看看情况。
Snipaste_2025-01-23_10-10-24.png (120.25 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
Snipaste_2025-01-23_10-11-20.png (386.02 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
4.找到了一个地方,jadx看看,没发现啥。
Snipaste_2025-01-23_10-12-32.png (584.97 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
5.使用查找用例,看看啥地方还用了它,跳转过去一看,没反编译出来。
Snipaste_2025-01-23_10-13-34.png (186.92 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
Snipaste_2025-01-23_10-14-28.png (451.38 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
6.上JEB看看,这边是啥逻辑。
Snipaste_2025-01-23_10-15-29.png (194.05 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
7.看到个isVip,跳转过去看看,发现几个vip相关的东西。
Snipaste_2025-01-23_10-16-15.png (217.41 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
8.到jadx上搜一下这个isVip,我们去hook它一下
[JavaScript] 纯文本查看 复制代码function main() {
Java.perform(function () {
console.log("启动");
let Membership = Java.use("com.xxxx.xxxx.xxxx.data.Membership");
Membership["isVip"].implementation = function () {
console.log(`Membership.isVip is called`);
let result = this["isVip"]();
console.log(`Membership.isVip result=${result}`);
return result;
};
Membership["getVipExpireDate"].implementation = function () {
console.log(`Membership.getVipExpireDate is called`);
let result = this["getVipExpireDate"]();
console.log(`Membership.getVipExpireDate result=${result}`);
return result;
};
Membership["getVipLevel"].implementation = function () {
console.log(`Membership.getVipLevel is called`);
let result = this["getVipLevel"]();
console.log(`Membership.getVipLevel result=${result}`);
return result;
};
Membership["getMaxLoginNum"].implementation = function () {
console.log(`Membership.getMaxLoginNum is called`);
let result = this["getMaxLoginNum"]();
console.log(`Membership.getMaxLoginNum result=${result}`);
return result;
};
Membership["getChannel"].implementation = function () {
console.log(`Membership.getChannel is called`);
let result = this["getChannel"]();
console.log(`Membership.getChannel result=${result}`);
return result;
};
Membership["isBeta"].implementation = function () {
console.log(`Membership.isBeta is called`);
let result = this["isBeta"]();
console.log(`Membership.isBeta result=${result}`);
return result;
};
});
}
setTimeout(main, 500);
Snipaste_2025-01-23_10-17-17.png (570.07 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
9.根据返回的值,对脚本进行修改,返回false的改成true,返回数值的修改成大值等,还有个返回一串数字,经过观察怀疑是时间戳,拿去转换一下看看值,发现正好和VIP到期日期对上了。
Snipaste_2025-01-23_10-17-44.png (187.55 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
Snipaste_2025-01-23_10-18-01.png (98.78 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
10.所以,我们对脚本进行修改,修改后的脚本如下:
[JavaScript] 纯文本查看 复制代码function main() {
Java.perform(function () {
console.log("启动");
let Membership = Java.use("com.xxxx.xxxx.xxxx.data.Membership");
Membership["isVip"].implementation = function () {
console.log(`Membership.isVip is called`);
let result = this["isVip"]();
console.log(`Membership.isVip result=${result}`);
return true;
};
Membership["getVipExpireDate"].implementation = function () {
console.log(`Membership.getVipExpireDate is called`);
let result = this["getVipExpireDate"]();
console.log(`Membership.getVipExpireDate result=${result}`);
return 17694248497;
};
Membership["getVipLevel"].implementation = function () {
console.log(`Membership.getVipLevel is called`);
let result = this["getVipLevel"]();
console.log(`Membership.getVipLevel result=${result}`);
return 5;
};
Membership["getMaxLoginNum"].implementation = function () {
console.log(`Membership.getMaxLoginNum is called`);
let result = this["getMaxLoginNum"]();
console.log(`Membership.getMaxLoginNum result=${result}`);
return 10;
};
Membership["getChannel"].implementation = function () {
console.log(`Membership.getChannel is called`);
let result = this["getChannel"]();
console.log(`Membership.getChannel result=${result}`);
return result;
};
Membership["isBeta"].implementation = function () {
console.log(`Membership.isBeta is called`);
let result = this["isBeta"]();
console.log(`Membership.isBeta result=${result}`);
return result;
};
});
}
setTimeout(main, 1000);
11.hook修改完成后,发现我们获得了永久VIP。
Snipaste_2025-01-23_10-18-33.png (160.27 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
12.接下来我们还是去做持久化,还是使用xposed写插件,关键代码如下:
[Java] 纯文本查看 复制代码 if (loadPackageParam.packageName.equals("com.xxxx.xxxx"))
Log.d(tag, "xxxx已選中");
XposedHelpers.findAndHookMethod("com.xxxx.xxxx.xxxx.data.Membership", loadPackageParam.classLoader, "isVip", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(true);
}
});
XposedHelpers.findAndHookMethod("com.xxxx.xxxx.xxxx.data.Membership", loadPackageParam.classLoader, "getVipLevel", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(5);
}
});
XposedHelpers.findAndHookMethod("com.xxxx.xxxx.xxxx.data.Membership", loadPackageParam.classLoader, "getMaxLoginNum", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(10);
}
});
XposedHelpers.findAndHookMethod("com.xxxx.xxxx.xxxx.data.Membership", loadPackageParam.classLoader, "getVipExpireDate", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(Long.valueOf(17694248497L));
}
});
13.突然想起来,它没加固,那我们直接给它去签名校验,修改包里的内容,重新打包不就好了,说干就干,先用apktool解包
Snipaste_2025-01-23_11-16-10.png (274.38 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
14.然后在文件夹中搜索这些参数,第一个我们搜索修改isVip这个值。
Snipaste_2025-01-23_10-20-56.png (1.58 MB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
修改前
Snipaste_2025-01-23_10-21-27.png (392.44 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
修改后
Snipaste_2025-01-23_10-22-03.png (304.59 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
15.修改第二个值
Snipaste_2025-01-23_10-22-44.png (182.25 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
修改前
Snipaste_2025-01-23_10-23-11.png (242.97 KB, 下载次数: 0)
下载附件
2025-1-23 11:51 上传
修改后
Snipaste_2025-01-23_10-23-32.png (183.5 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
16.修改第三个值
Snipaste_2025-01-23_10-24-09.png (166.13 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
修改前
Snipaste_2025-01-23_10-24-32.png (196.86 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
修改后
Snipaste_2025-01-23_10-24-50.png (167.87 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
17.修改第四个值
Snipaste_2025-01-23_10-25-35.png (355.82 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
修改前
Snipaste_2025-01-23_10-25-56.png (164.27 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
修改后
Snipaste_2025-01-23_10-26-09.png (149.19 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
18.这里的值0x8500aa31,是怎么来的呢?先用实际时间转换出一个时间戳,再把这个时间戳转换为16进制
Snipaste_2025-01-23_10-26-26.png (196.32 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
Snipaste_2025-01-23_10-26-38.png (151.61 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
19.改完之后,进行重打包即可,若遇到下面报错,说明你太贪心了时间戳改太大了
Snipaste_2025-01-23_10-27-19.png (336.15 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
20.重打包,重签名之后,进行安装即可使用。
Snipaste_2025-01-23_10-28-29.png (456.9 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传
21.打出包之后自己随意注册个账号,就能用,若出现负值,则是改的太大了,我这里用的2030年的不会出现这个问题
Snipaste_2025-01-23_10-28-56.png (128.15 KB, 下载次数: 0)
下载附件
2025-1-23 11:52 上传