百某应JS逆向

news2024/11/17 5:35:24

https://ying.baichuan-ai.com/

 

目录

一、发起提问

二、观察发现有两个加密参数:X-Bc-Sig和X-Bc-Ts

​三、观察JS调用栈

四、从JS中搜索 X-Bc-Sig和X-Bc-Ts

五、断点并分析参数的生成方式

六、分析入参

七、发现关键的o方法调用了一个i()方法

八、验证结果

九、python执行Node.JS获取参数(本地安装了Node环境)

十、python本地执行JS(本地未安装Node.js环境)

十一、实际应用


一、发起提问

二、观察发现有两个加密参数:X-Bc-Sig和X-Bc-Ts

 三、观察JS调用栈

四、从JS中搜索 X-Bc-Sig和X-Bc-Ts

发现只有_app-xxxxx.js文件中存在X-Bc-Sig

五、断点并分析参数的生成方式

六、分析入参

一个参数是固定字符串:"uwlACMuXQApWgO0Q"

一个参数是时间戳组成的动态字符串:"1721891456251retry=3&thread_info=[object Object]"

七、发现关键的o方法调用了一个i()方法

找了一圈没找到i()方法,无奈我只好在控制台打印一下,看看这个i()是什么样的

断点挺住,在去控制台打印一下

七、模拟生成

1、先将关键的o方法复制出来

2、模拟i()方法

3、 调用o方法和截取逻辑复制过来

4、构建参数

我们可以看到n是当前时间戳 n = Date.now()

r是混淆参数 undefined

a是由时间戳组成的固定字符串

 

八、验证结果

 九、python执行Node.JS获取参数(本地安装了Node环境)

import execjs

# JavaScript代码
js_code = """
const CryptoJS = require("crypto-js");

function i() {
    return CryptoJS
}

function o(t, e) {
    let r = i().enc.Utf8.parse("0000000000000000");
    return i().AES.encrypt(t, i().enc.Utf8.parse(e), {
        iv: r,
        mode: i().mode.CBC,
        padding: i().pad.Pkcs7
    }).toString()
}

//构建入参
const n = '1721892945291'
const r = undefined
const a = `${n.toString()}retry=3&thread_info=[object Object]`

// 执行关键o函数
let s = o(a, r ? r.substring(0, 16) : "uwlACMuXQApWgO0Q");
// 截取逻辑
s.length > 64 && (s = s.substring(0, 64))
result = {
    "x-bc-sig": s,
    "x-bc-ts": n.toString()
}
return result
"""

# 编译JavaScript代码
ctx = execjs.compile(js_code)

# 执行JavaScript代码并获取结果
result = ctx.call("JSON.stringify")

# 输出结果
print(result)

十、python本地执行JS(本地未安装Node.js环境)

将crypto-js下载到本地:

crypto-js.min.js

CRYPTO-JS.MIN.JS: DOWNLOAD - CDNPKG

 
encryption.js
//encryption.js

//引入本地加密库
const CryptoJS = require('./crypto-js.min.js');

function i() {
    return CryptoJS
}

function o(t, e) {
    let r = i().enc.Utf8.parse("0000000000000000");
    return i().AES.encrypt(t, i().enc.Utf8.parse(e), {
        iv: r,
        mode: i().mode.CBC,
        padding: i().pad.Pkcs7
    }).toString()
}

//构建入参
const n = '1721892945291'
const r = undefined
const a = `${n.toString()}retry=3&thread_info=[object Object]`

// 执行关键o函数
let s = o(a, r ? r.substring(0, 16) : "uwlACMuXQApWgO0Q");
// 截取逻辑
return s.length > 64 && (s = s.substring(0, 64)),
            {
                "x-bc-sig": s,
                "x-bc-ts": n.toString()
            }
import execjs

# 读取crypto-js库文件和你的JavaScript代码
with open('crypto-js.min.js', 'r', encoding='utf-8') as file:
    crypto_js_code = file.read()

with open('encryption.js', 'r', encoding='utf-8') as file:
    script_code = file.read()

# 整合JavaScript代码
js_code = crypto_js_code + "\n" + script_code

# 编译JavaScript代码
ctx = execjs.compile(js_code)

# 执行JavaScript代码并获取结果
result = ctx.call("JSON.stringify")

# 输出结果
print(result)

十一、实际应用

发现runs接口的签名和delete接口的签名有所不同

runs直接对时间戳签名就可以

delete接口需要对时间戳和id进行双重签名

我只能写成两个function来供python调用

//引入本地加密库
const CryptoJS = require('./crypto-js.min.js');

function i() {
    return CryptoJS
}

function o(t, e) {
    let r = i().enc.Utf8.parse("0000000000000000");
    return i().AES.encrypt(t, i().enc.Utf8.parse(e), {
        iv: r,
        mode: i().mode.CBC,
        padding: i().pad.Pkcs7
    }).toString()
}

function runs_sign() {
    //构建入参
    const n = Date.now()
    const r = undefined
    const a = `${n.toString()}retry=3&thread_info=[object Object]`
    // const a = `${n.toString()}id=6042075`

    // 执行关键o函数
    let s = o(a, r ? r.substring(0, 16) : "uwlACMuXQApWgO0Q");
    // 截取逻辑
    return s.length > 64 && (s = s.substring(0, 64)),
        {
            "x-bc-sig": s,
            "x-bc-ts": n.toString()
        }
}

function delete_sign(id) {
    //构建入参
    const n = Date.now()
    const r = undefined
    const a = `${n.toString()}id=${id}`

    // 执行关键o函数
    let s = o(a, r ? r.substring(0, 16) : "uwlACMuXQApWgO0Q");
    // 截取逻辑
    return s.length > 64 && (s = s.substring(0, 64)),
        {
            "x-bc-sig": s,
            "x-bc-ts": n.toString()
        }
}

    def get_runs_sign_and_timestamp(self):
        """
        获取访问签名和时间戳
        """
        # 读取crypto-js库文件和你的JavaScript代码
        with open('crypto-js.min.js', 'r', encoding='utf-8') as file:
            crypto_js_code = file.read()

        with open('encryption.js', 'r', encoding='utf-8') as file:
            script_code = file.read()

        # 整合JavaScript代码
        js_code = crypto_js_code + "\n" + script_code

        # 编译JavaScript代码
        ctx = execjs.compile(js_code)

        # 执行JavaScript代码并获取结果
        result = ctx.call("runs_sign")
        return result['x-bc-sig'], result['x-bc-ts']

    def get_delete_sign_and_timestamp(self, id):
        """
        获取删除签名和时间戳
        """
        # 读取crypto-js库文件和你的JavaScript代码
        with open('crypto-js.min.js', 'r', encoding='utf-8') as file:
            crypto_js_code = file.read()

        with open('encryption.js', 'r', encoding='utf-8') as file:
            script_code = file.read()

        # 整合JavaScript代码
        js_code = crypto_js_code + "\n" + script_code

        # 编译JavaScript代码
        ctx = execjs.compile(js_code)

        # 执行JavaScript代码并获取结果
        result = ctx.call("delete_sign", id)
        return result['x-bc-sig'], result['x-bc-ts']

十二、技巧①

当我们找不到某个函数在哪里的时候,只要在控制台打印这个函数,然后在控制台点击打印的结果,即可跳转到该函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sqlilabs解题方法

Lass1 查询id为1的用户名和密码 查询id为2的用户名和密码 没有回显,不含id-1的行 判断字段数,字段数为3 查询数据库用户名,和数据库名 查询时id必须超出数据库以外,一般用-1 用户名:user() 数据库名:databa…

VulnHub:colddbox easy

靶机下载地址 信息收集 主机发现 攻击机网段192.168.31.0/24,扫描同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 发现靶机,IP为192.168.31.176。 端口扫描 扫描靶机开放端口。 nmap 192.168.31.176 -A -p- -T4 开放了80,4512端口,注…

[H并查集] lc100347. 判断矩形的两个角落是否可达(并查集+高质量+周赛408_4)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:100347. 判断矩形的两个角落是否可达 参考: 灵神视频题解:筛质数 巧妙枚举 并查集【力扣周赛 408】 这一期周赛很不错。 2. 题目解析 十分不错的题目哈,关键是题意的转换…

哈希 Hash(闭散列、开散列介绍及其实现)

目录 unordered 系列关联式容器unordered_mapunordered_map 的介绍unordered_map 的接口说明构造函数容量函数迭代器元素访问查询操作修改操作桶操作 unordered_setunordered_set 的介绍unordered_set 的接口说明构造函数容量函数迭代器查询操作修改操作桶操作 底层结构哈希概念…

Catalyst优化器:让你的Spark SQL查询提速10倍

目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十七章 Linux中断实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

python 裁剪图片

情况: 有时候看视频,看到一个漂亮的妹子,按下 Alt PrintScreen 进行截图之后,会把整个屏幕都截图。 需要适当剪裁一下。 每次打开 PS , 也太慢了。 所以写个代码, 快速处理。 效果对比: 原始…

个人定制化形象生成,FaceChain最新模型部署

FaceChain是阿里巴巴达摩院推出的一个开源的人物写真和个人数字形象的AI生成框架。 FaceChain利用了Stable Diffusion模型的文生图功能,并结合人像风格化LoRA模型训练及人脸相关感知理解模型,将输入的图片进行训练后推理输出生成个人写真图像。 FaceCh…

【redis】对hash类型和list类型的常用命令,应用场景,内部编码的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

初识c++:vector全方面讲解及其代码模拟实现

本节大纲: vector全方面讲解及其代码模拟实现 1.学习vector方法 2.vector的使用 2.1 vector的定义 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 2.5 vector 迭代器失效问题(重点) 3.vector 深度刨析 4…

【Vulnhub系列】Vulnhub_Raven2靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Raven2 渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 从网盘下载该靶机,在vm中选择【打开】 然后设置好存储路径,开机后检查靶机的网络连…

主宰生物进化的 “魔咒” —— 制约生物在特殊环境下进化方式的线索

一些神秘的法则制约着生物在特殊环境下的进化方式。它们还为动物将如何适应气候变暖提供了线索。 一些奇特的进化现象 一艘装满大象和老鼠的 “诺亚方舟” 搁浅在一座偏远的小岛上。动物们都幸存下来并繁衍后代。但是,随着世代相传,奇怪的事情发生了&a…

【Matlab】快速傅里叶变换fft代码(单边谱)

单边谱,横纵坐标还原代码 参考链接 主代码 function main() clc clear close all %% %仿真时间 dt0.01; t_end10; timedt:dt:t_end;%注意,length(time)会对fft结果的精度有影响 %对应振幅,频率:10、5、2Hz Z20*sin(2*pi*20*time…

使用abpcli创建项目时提示数据库迁移失败

问题描述 使用abpcli创建项目时提示数据库迁移失败! 解决方案: 1、检查数据库连接字符串 {"ConnectionStrings": {"Default": "serverlocalhost;port3306;databaseAcmeBookStore;userroot;passwordyour_password;"} }2、…

盗梦空间续集(InceptionNeXt):使用Inception优化加速ConvNeXt实现ImageNet-1K的最佳精度

Abstract 灵感来自ViT的长距离建模能力,大核卷积最近被广泛研究和采用,以扩大感受野并提高模型性能,例如显著的工作ConvNeXt采用77深度卷积。虽然这种深度算子只消耗少量的FLOPs,但由于高内存访问成本,它在强大计算设…

环境配置—批量删除时提示/usr/bin/rm: Argument list too long问题

文章目录 1. 背景介绍2. 问题原因3. 解决方案3.1 分批删除文件3.2 使用 find 命令直接删除3.3 增加系统参数限制3.4 使用循环删除 4. 结论 1. 背景介绍 在Linux系统中,rm 命令是删除文件和目录的常用工具。然而,当需要删除大量文件时,可能会…

【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)

为探讨数据科学和计算智能领域的关键问题,促进相关交流,2024年智能计算与数据分析国际学术会议(ICDA 2024)将于2024年9月6日-8日在中国青岛召开。 本届会议拟邀请数据分析和计算智能领域的顶级专家、学者和产业界优秀人才,围绕当前…

党员管理系统2024(代码+论文+ppt)

下载在最后 技术栈: ssmmysql 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注:

Hive环境搭建(Mysql数据库)

【实验目的】 1) 了解hive的作用 2) 熟练hive的配置过程(Mysql数据库) 【实验原理】 Hive工具中默认使用的是derby数据库,该数据库使用简单,操作灵活,但是存在一定的局限性,hive支持使用第三方数据库&…

探索C++中的多态性:理解虚函数和运行时多态

前言: 在现代软件开发中,面向对象编程(OOP)已经成为了主流。其中一个强大的概念就是多态性(Polymorphism),它不仅仅是一种技术,更是一种设计思想和实现方式,为软件开发带…