吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4765|回复: 71
上一主题 下一主题
收起左侧

[Web逆向] 【JavaScript 逆向】某音滑块纯算,底图还原,captchaBody,轨迹算法,abogus

  [复制链接]
跳转到指定楼层
楼主
Behind1 发表于 2024-4-1 21:39 回帖奖励
本帖最后由 Behind1 于 2024-4-1 22:04 编辑

前言

本案例中所有内容仅供个人学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

一、抓包分析

send_code 触发验证码  将返回detail用于下个请求获取图片

captcha/get  通过detail获取图片, id  , tip_y(这个后面轨迹需要用到,最开始一直没找到这个值)

captcha/verify 通过轨迹生成的captchaBody 进行校验

流程比较简单,最头疼的是jsvmp,还有轨迹

二、mobile加密

直接进js抠出来就完事了,这里直接用Python改写

def mobile_encode(t):
    """
    异或运算(XOR)
    """
    t = '+86 ' + t

    def encode_char(c):
        code = ord(c)
        if 0 <= code <= 127:
            return [code]
        elif 128 <= code <= 2047:
            return [192 | 31 & code >> 6, 128 | 63 & code]
        else:
            return [224 | 15 & code >> 12, 128 | 63 & code >> 6, 128 | 63 & code]

    encoded = [encode_char(char) for char in str(t)]

    result = []
    for byte_list in encoded:
        for byte in byte_list:
            result.append(hex(5 ^ byte)[2:])

    return "".join(result)

三、底图还原

打开开发者工具可以算出 返回乱序图片和还原后的图片的缩放比

图片还原可以通过canvas断点找到js还原图片的方法

这里仅竖着切割,我们可以不用去扣js   顺序固定的[4, 0, 3, 5, 2, 1]

直接改写Python实现还原

def parse_bg_captcha(img, save_path=None):
    """
    滑块乱序背景图还原
    还原前 h: 344, w: 552
    还原后 h: 212, w: 340
    :param img: 图片路径str/图片路径Path对象/图片二进制
        eg: 'assets/bg.webp'
            Path('assets/bg.webp')
    :param save_path: 保存路径, <type 'str'>/<type 'Path'>; default: None
    :return: 还原后背景图 RGB图片格式
    """
    if isinstance(img, (str, Path)):
        _img = Image.open(img)
    elif isinstance(img, bytes):
        _img = Image.open(io.BytesIO(img))
    else:
        raise ValueError(f'输入图片类型错误, 必须是<type str>/<type Path>/<type bytes>: {type(img)}')

    # 定义切割的参数
    cut_width = 92
    cut_height = 344
    k = [4, 0, 3, 5, 2, 1]

    # 创建新图像
    new_img = Image.new('RGB', (_img.width, _img.height))

    # 按照指定顺序进行切割和拼接
    for idx in range(len(k)):
        x = cut_width * k[idx]
        y = 0
        img_cut = _img.crop((x, y, x + cut_width, y + cut_height))  # 垂直切割
        new_x = idx * cut_width
        new_y = 0
        new_img.paste(img_cut, (new_x, new_y))

    # 调整图像大小
    # new_img = new_img.resize((340, 212))
    if save_path is not None:
        save_path = Path(save_path).resolve().__str__()
        new_img.save(save_path)

    img_byte_array = io.BytesIO()
    new_img.save(img_byte_array, format='PNG')
    img_byte_array = img_byte_array.getvalue()

    return img_byte_array

四、captchaBody

jsvmp 代码结构

jsvmp一般采取补环境(是个webpack )和插桩本文主要讲解插桩日志分析他的算法

插桩分析

有很多个vmp 需要每个for循环处进行插桩,还有关键的运算位置需要单独打印出来  

还有fromCharCode  charAt   charCodeAt都需要打印,有完整的日志才能更快更准的分析出。

console.log('待加密———>',m,'\n加密————>',b)

日志中你会看到aes 和 sha512算法

下面这段js你可能会需要用到

function hexStringToArrayBuffer(hexString) {
    // remove the leading 0x
    hexString = hexString.replace(/^0x/, '');

    // ensure even number of characters
    if (hexString.length % 2 != 0) {
        console.log('WARNING: expecting an even number of characters in the hexString');
    }

    // check for some non-hex characters
    var bad = hexString.match(/[G-Z\s]/i);
    if (bad) {
        console.log('WARNING: found non-hex characters', bad);   
    }

    // split the string into pairs of octets
    var pairs = hexString.match(/[\dA-F]{2}/gi);

    // convert the octets to integers
    var integers = pairs.map(function(s) {
        return parseInt(s, 16);
    });

    var array = new Uint8Array(integers);
    console.log(array);

    return array.buffer;
}

轨迹

轨迹这里可以自己打上log去看,鼠标,滚动条

这里说一下这个参数

"drag":  

"x": 144,  //  边框20+滑动条64.5 也就是 x∈[20-84,20+滑块滑动距离-84+滑动距离]
"y": 287,  // 整个滑块窗口到滑动条距离 y∈[285,325]

{
    "reply": "30h5Yr0hM",   
    "models": "pD6zZEe4",
    "in_modal": "xCiAyhLse",
    "in_slide": "vi5C7jc",
    "move": "8uRj",
    "touch": "ljA42",
    "drag": "YuLFijT",
    "crypt_salt": "1b4d7416e175dc54380b876c721e4af5b406e7a1700ff3118beb029635ba2fe26c794112bb938d17517af1fc36db87b7f43db04ebdc305d5e30f2ba47a184366"
}

动态加密,目前还没有想到如何快速拿到映射。

code:500,msg:"VerifyErr" //滑块缺口距离错误
code:500,msg:"VerifyModelErr" //滑块位置正确轨迹有问题

五、结果展示

这里就不讲太多了,有问题可以私信我。

免费评分

参与人数 23威望 +2 吾爱币 +119 热心值 +21 收起 理由
YQYuan + 1 + 1 谢谢@Thanks!
timeni + 1 + 1 用心讨论,共获提升!
chenmoxi147 + 1 谢谢@Thanks!
zilibili + 1 + 1 我很赞同!
datalai + 1 我很赞同!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
heartfilia + 1 + 1 用心讨论,共获提升!
PUTUOEERMI + 1 + 1 谢谢@Thanks!
yyxqf + 1 + 1 谢谢@Thanks!
zhusg + 1 我也搞定了,就差动态更新
涛之雨 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
5Axi + 1 热心回复!
PanelJ + 1 + 1 我很赞同!
hefan8 + 1 谢谢@Thanks!
lihuhu + 1 热心回复!
lenxueyan + 1 + 1 我很赞同!
zzyzy + 1 + 1 谢谢@Thanks!
小傲宇 + 1 + 1 我很赞同!
notproblem + 1 + 1 谢谢@Thanks!
smartfind + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
为之奈何? + 1 + 1 我很赞同!
peiki + 1 + 1 我很赞同!
开心熊猫741 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
a64739374 发表于 2024-4-10 21:44
太厉害了,佩服                                                                        
推荐
 楼主| Behind1 发表于 2024-4-2 09:40 |楼主
smartfind 发表于 2024-4-2 09:30
如何得出轨迹坐标的,还请解惑。

在浏览器打上日志点  多滑几下 对比坐标变化(一般都是有规律的),当然也可以用去细扣js
沙发
policewang 发表于 2024-4-2 04:23
3#
Lty20000423 发表于 2024-4-2 07:45

研究算法的可以看看
4#
xjcyxyx 发表于 2024-4-2 08:12
优秀,收藏学习
5#
jinzhu160 发表于 2024-4-2 08:33
好高深,这种底层原理讲的多一点挺好。
6#
BigMon 发表于 2024-4-2 08:45

优秀,收藏学习
7#
kexing 发表于 2024-4-2 09:08
厉害  看了一头雾水  还得努力学习
8#
doubleKill 发表于 2024-4-2 09:19
看了一头雾水
9#
doubleKill 发表于 2024-4-2 09:27
图像还原明白,但请问是如何算出轨迹坐标的?
10#
smartfind 发表于 2024-4-2 09:30
如何得出轨迹坐标的,还请解惑。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 01:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表