[color=]声明
:
这里要注意的就是我们只抓注册请求的包,所以我们先到注册页面填写注册信息之后,再开启抓包,这样可以避免太多我们用不到的包。
worlk.jpg (68.32 KB, 下载次数: 0)
下载附件
2024-8-12 13:19 上传
点击注册之后出现了三个包,有一个“register”,点进去
EDC661D1E6C09B8D2C8ACBAC5A2DBA15.jpg (50.93 KB, 下载次数: 0)
下载附件
2024-8-12 13:34 上传
这个是请求的body,看着像base64加密
2.jpg (94.6 KB, 下载次数: 0)
下载附件
2024-8-12 13:39 上传
响应代码
3.jpg (55.75 KB, 下载次数: 0)
下载附件
2024-8-12 13:45 上传
经几次不同账号请求发现,请求的加密数据前面这个“4kAqSDi-SeFoF”不会变化。
这里需要重新打开软件,然后填写信息进行注册,
输出了很多结果,但是通过搜索没有发现包含
“
4kAqSDi-SeFoF
”加密数据,无奈只能放弃。
下载链接:算法助手Pro版
密码:u7Zn
打开算法助手,选择这个应用
qq_pic_merged_1723453059956.jpg (29.5 KB, 下载次数: 0)
下载附件
2024-8-12 17:22 上传
再勾选图片这些
qq_pic_merged_1723452541839.jpg (138.92 KB, 下载次数: 0)
下载附件
2024-8-12 16:51 上传
qq_pic_merged_1723452594591.jpg (129.55 KB, 下载次数: 0)
下载附件
2024-8-12 16:51 上传
全部勾选完后,点击如上图箭头位置,然后去注册页面填写注册信息,点击注册。
然后我们返回到算法助手页面,点击日志,然后点击这个
qq_pic_merged_1723455775374.jpg (30.86 KB, 下载次数: 0)
下载附件
2024-8-12 17:43 上传
可以看到获取了188条记录
qq_pic_merged_1723455018487.jpg (221.78 KB, 下载次数: 0)
下载附件
2024-8-12 17:43 上传
结果比较多,我们点击右上角的三个点,保存所有日志。
8ef662f8cd74003da05579c10181fb3c.jpg (195.09 KB, 下载次数: 0)
下载附件
2024-8-12 17:48 上传
qq_pic_merged_1723456343190.jpg (54.09 KB, 下载次数: 0)
下载附件
2024-8-12 17:52 上传
用MT管理器打开这个日志文件,搜索4kAqSDi-SeFoF
Screenshot_2024-08-12-19-18-16-609_bin.mt.plus.jpg (259.85 KB, 下载次数: 0)
下载附件
2024-8-12 19:44 上传
发现搜索不到,这个也只能放弃了
无奈的我只能重新写hook了
(千万别hook遍历所有的类和方法,后果你懂的)
hook代码如下
[Asm] 纯文本查看 复制代码var strCls = Java.use("java.lang.StringBuilder");
strCls.toString.implementation = function() {
try {
var result = this.toString();
if (result.indexOf("4kA") >= 0) {
console.log("Found '4kA': " + result);
var currentThread = Java.use("java.lang.Thread").currentThread();
var stackTrace = currentThread.getStackTrace();
console.log("Call stack:");
for (var i = 0; i
手机上运行需要下载jshook(确保手机上的安装了需要的注入框架和magisk模块)
开源地址:jshook(开源地址下载链接)
下载链接:jshook(他网站里下载的是旧版,需要自己先去设置里面点更新版本,重新安装才可以进行下一步操作)
从返回的结果,发现在z2.w.b里面实现加密的。
找到z2.w.b,b函数代码如下:
[Asm] 纯文本查看 复制代码public String b(String str) {
n40.c(str, "str");
StringBuilder sb = new StringBuilder();
byte[] bytes = str.getBytes(Charset.forName((String) this.a));
n40.c(bytes, "bytes");
String bigInteger = new BigInteger(1, bytes).toString(2);
while (bigInteger.length() % 8 != 0) {
bigInteger = n40.h((String) this.b, bigInteger);
}
int i = 0;
int i2 = 0;
while (bigInteger.length() % 24 != 0) {
bigInteger = n40.h(bigInteger, (String) this.b);
i2++;
}
int d = j.d(0, bigInteger.length() - 6, 6);
if (d >= 0) {
while (true) {
int i3 = i + 6;
int parseInt = Integer.parseInt(bigInteger.substring(i, i3), 2);
if (parseInt != 0 || i
下面是构造函数
[Asm] 纯文本查看 复制代码 public w(int i, String str) {
n40.c(str, "charsetName");
this.e = i;
this.a = str;
l lVar = l.a;
this.b = lVar.a(new byte[]{51, 59, -8, 118, 62, -103, 81, -100, 111, 71, 117});
this.c = lVar.a(new byte[]{90, 94, 28, -96, 100, -61, 120, -61, -105, 105, -87});
char[] charArray = lVar.a(new byte[]{29, -107, 33, 92, 82, -54, -124, -38, -52, 112, -122, -93, 105, 109, 118, 84, -123, 36, 80, 83, -48, 113, -13, -88, -43, -57, -99, -107, -92, Byte.MAX_VALUE, -104, -127, 99, 38, 111, -120, 34, 94, 104, -68, -86, -22, -47, 47, -119, -114, 77, 85, 112, -117, 111, 91, -104, 30, -56, 37, -14, -98, -35, -102, 50, -106, -116, 114, 114, -119, -118, -125, 121, 85, 12, -67}).toCharArray();
int i2 = 0;
int length = charArray.length - 1;
if (length >= 0) {
while (true) {
int i3 = i2 + 1;
int length2 = ((this.e + i2) % (charArray.length - i2)) + i2;
if (length2 != i2) {
char c = charArray[i2];
charArray[i2] = charArray[length2];
charArray[length2] = c;
}
if (i3 > length) {
break;
} else {
i2 = i3;
}
}
}
this.d = f.i(charArray, "", (CharSequence) null, (CharSequence) null, 0, (CharSequence) null, (g9.l) null, 62);
}
发现都是通过 lVar.a方法创建一个新的字节型数组,这些里面或许有密钥什么的
通过查看Smali代码
这个 lVar.a是n6.l类的a方法
这个 d里的f.i是v8.f类的i方法
那这就好办了
通过hook n6.l的a方法和v8.f类的i方法,看看是什么值
这里我推荐用算法助手比较好分析
下面我们打开算法助手选择自定义hook
AD4ADCCAF0EC562C6CE80D0242065691.jpg (102.01 KB, 下载次数: 0)
下载附件
2024-8-12 21:30 上传
12.jpg (30.34 KB, 下载次数: 0)
下载附件
2024-8-12 21:35 上传
按图片进行勾选
6EA8D6A12B900CC2F4BA6CEBD6A918D4.jpg (118.74 KB, 下载次数: 0)
下载附件
2024-8-12 21:35 上传
1E450740153213C87901AE72CB24201F.jpg (97.24 KB, 下载次数: 0)
下载附件
2024-8-12 21:38 上传
返回查看,是否勾选
F81066E0A59C3A0CFEEA52742C5177C0.jpg (37.24 KB, 下载次数: 0)
下载附件
2024-8-12 21:38 上传
然后从来算法助手里面启动软件,就单纯启动软件成功就可以了,不做其它事情,再返回算法助手查看日志,这里日志有很多,点右上角三个点进行保存全部日志
74B3D4F8E5C7AF95D4C4D129F4CB2407.jpg (155.69 KB, 下载次数: 0)
下载附件
2024-8-12 21:43 上传
用mt管理器打开这个日志文件,搜索z2.w.
FCEA53B94AC3AD6F299883DDC588A938.jpg (154.52 KB, 下载次数: 0)
下载附件
2024-8-12 21:54 上传
FC78E64F145616EE6E962821706368F4.jpg (161.15 KB, 下载次数: 0)
下载附件
2024-8-12 21:54 上传
上面分析得到 b= 0,c="=",d=vQe3YihNFAE5VLJKmfwzc9D8WnsS2u4bCdp_1qHrI-OZPtGB7lkxXU0gTMoyjRa6,a的通过hook z2.w.得到值是个“UTF-8”
通过查看n40.c,n40.h,j.d的代码和已知值下面开始分析这个b方法
[Asm] 纯文本查看 复制代码public String b(String str) {
// 首先,检查传入的字符串str是否为null,如果是,则抛出NullPointerException异常
n40.c(str, "str");
// 创建StringBuilder对象用于构建最终的字符串结果
StringBuilder sb = new StringBuilder();
// 将输入字符串str使用UTF-8编码转换为字节数组
byte[] bytes = str.getBytes(Charset.forName((String) this.a));
// 再次检查字节数组是否为null,如果是,则抛出NullPointerException异常
n40.c(bytes, "bytes");
// 将字节数组转换为大整数BigInteger,然后将其转换成二进制字符串表示形式
String bigInteger = new BigInteger(1, bytes).toString(2);
// 循环直到二进制字符串的长度是8的倍数,如果不是,则在其前面填充字符'0'
while (bigInteger.length() % 8 != 0) {
bigInteger = n40.h((String) this.b, bigInteger);
}
// 假设i2是之前定义的某个变量,这里初始化为0
int i2 = 0;
// 循环直到二进制字符串的长度是24的倍数,继续在其前面填充字符'0'
while (bigInteger.length() % 24 != 0) {
bigInteger = n40.h(bigInteger, (String) this.b);
i2++; // 记录填充的次数
}
// 调用j.d方法计算最后一个有效分组的起始索引,该方法需要传入起始位置、结束位置和步长
int d = j.d(0, bigInteger.length() - 6, 6);
// 初始化索引i为0,用于遍历二进制字符串
int i = 0;
// 如果计算得到的索引d大于等于0,说明存在有效的分组
if (d >= 0) {
// 循环处理二进制字符串,每次处理6位
while (true) {
// 计算当前分组的结束索引
int i3 = i + 6;
// 将当前6位二进制字符串转换为整数
int parseInt = Integer.parseInt(bigInteger.substring(i, i3), 2);
// 如果转换得到的整数不为0,或者当前索引i小于二进制字符串长度减去填充次数i2
if (parseInt != 0 || i
base64变种加密
分析完后,写个python代码看看是不是
[Asm] 纯文本查看 复制代码import hashlib
class CustomEncoder:
def __init__(self, charset_name, padding_char, equal_char, mapping_table):
self.charset_name = charset_name
self.padding_char = padding_char
self.equal_char = equal_char
self.mapping_table = mapping_table
def b(self, str_input):
byte_array = str_input.encode(self.charset_name)
big_integer = int.from_bytes(byte_array, 'big')
binary_str = format(big_integer, '0b')
while len(binary_str) % 8 != 0:
binary_str = self.padding_char + binary_str
while len(binary_str) % 24 != 0:
binary_str = self.padding_char + binary_str
result = []
for i in range(0, len(binary_str), 6):
chunk = binary_str[i:i+6]
value = int(chunk, 2)
if value
结果和它的加密一样的
91b3d715-411e-4f7b-96f2-2d9407fcdc8f.jpg (39.41 KB, 下载次数: 0)
下载附件
2024-8-12 22:34 上传
白嫖地址:
kutong.zip
(1.24 KB, 下载次数: 152)
2024-8-12 22:56 上传
点击文件名下载附件
kutong
下载积分: 吾爱币 -1 CB
手机端python及代码下载地址:https://nxi.lanzoue.com/iWvdP279t2di
手机端python运行工具和白嫖代码都在zip里面,手机端要看一下使用教程
[color=]总结:
大家可以通过我的这个思路进行举一反三,比如某石榴加速器。由于这个样本本身不提交邀请码,所以刷邀请没有用。
其实还可以继续破解VIP,通过从服务器接受的加密数据会发到