【原创】某通加速器请求加密算法分析,实现无限白嫖

查看 152|回复 11
作者:吾苏同在   

  • [color=]声明

             本帖涉及的样本不提供,样本版本是v2.2.17。结尾提供python完整代码白嫖下载,手机上也可以运行。运行成品Python,会自动生成一个账号给你,你自己去登录就可以。

  • 前言:
          白嫖的加速器我感觉就这个稳定,延迟相对于比较低,注册送一天,一个设备好像只能注册两个账号,如果有root权限通过修改设备id,也可以无限白嫖,不过还是比较麻烦

  • 抓包分析:
         
          这里要注意的就是我们只抓注册请求的包,所以我们先到注册页面填写注册信息之后,再开启抓包,这样可以避免太多我们用不到的包。     


    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”不会变化。

  • hook定位:
    根据上面抓的东西,分析一下,点击注册之后,然后本地加密用户数据,再post这段“4kAqSDi-SeFoF”加密数据到他的服务器验证。现在hook这个“4ka”结果,看看在软件里面的哪个地方进行加密的
  • 定位关键代码有三种方法
  • 第一种:直接启动frIDA的自吐加密算法通杀脚本(论坛上面有这个自吐脚本,我就不上链接了)

    这里需要重新打开软件,然后填写信息进行注册,
    输出了很多结果,但是通过搜索没有发现包含

    4kAqSDi-SeFoF
    ”加密数据,无奈只能放弃。
  • 第二种:用算法助手Pro版(确保你手机安装了lsp框架和已经获取root权限,不然hook不到)

    下载链接:算法助手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 StringBuilder类

    (千万别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,通过从服务器接受的加密数据会发到

    z2.w类的a方法(解密函数)的入参,hook这个入参并修改这个加密数据,可以为永久vip。

    黑体, 下载次数

  • 吾苏同在
    OP
      


    Sand0630 发表于 2024-8-13 16:16
    这个要天天捉包?那算了,水果手机路过,小米虽然ROOT了,但这个利用价值大于学习价值,纯支持了

    不用天天抓包,运行成品Python代码自动生成一个账号给你,
    Huibq120   

    思路打开,它的节点有效时长是一天左右,那么使用脚本每天自动注册一个账号并拉取节点生成订阅
    可以参考这个:raw.githubusercontent.com/Huibq/TrojanLinks/master/utils/get_ss_with_plugin.py
    whx0910   

    感谢楼主分享,这个算法解密过程确实到位,我跟着学一学吧
    csgowdnmd   

    具体是什么协议?能提取出来吗?
    芽衣   

    这种有试用的基本上root了改id很方便,或者改直装
    16200   

    PC端没有吗。。
    kuiur0810   


    16200 发表于 2024-8-13 12:40
    PC端没有吗。。

    这个没有PC端,倒是可以用手机开热点共享
    666888tzq   

    不错,学学了。
    Lbbyrs   

    码住,空了仔细瞅瞅学习一下
    您需要登录后才可以回帖 登录 | 立即注册