吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3564|回复: 29
收起左侧

[Web逆向] 【JS逆向】某条signature逆向补环境

[复制链接]
ShriyGo 发表于 2025-7-21 20:58
本帖最后由 ShriyGo 于 2025-7-22 11:34 编辑

本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责

站点:aHR0cHM6Ly9zby50b3V0aWFvLmNvbS9zZWFyY2g/ZHZwZj1wYyZzb3VyY2U9dHJlbmRpbmdfY2FyZCZrZXl3b3JkPSVFNyVCRSU4RSVFNSU5QiVCRCVFNiVCNCU5QiVFNiU5RCU4OSVFNyU5RiVCNiVFNCVCOCU4MCVFOCVCRCVBNiVFOCVCRSU4NiVFNSU4NiVCMiVFNiU5MiU5RSVFNCVCQSVCQSVFNyVCRSVBNA==

视频:视频教程

1. 逆向目标

先访问站点,发现有2次请求,且第一次请求的响应内容空白。第1次请求后紧接的第2次请求就是渲染的页面。可见第1次请求必然做了什么事情,这也是典型的动态cookie场景。
1.png

观察第1次请求的响应头:有一些setcookie等字段
2.png

再看看第2次请求成功:
url、参数并没有区别,只不过带了个cookie,其中__ac_nonce来自于第1次请求返回,而多的这个__ac_signature就要处理了。
3.png

此时利用postman发一次包看第1次请求响应内容究竟是什么:
4.png
是一大段JS,拿出来看:显然是个jsvmp,且能找到生成的函数是:

__ac_signature=window.byted_acrawler.sign("",__ac_nonce);

5.png
__ac_nonce已经可以从第1次请求拿到,接下来就看怎么让这个调用能够完成。

2. 补环境

由于是个大jsvmp,简单做法直接补环境处理。
先尝试运行代码看看:报错防盗链。。。
6.png

那常规操作,先补几个基础dom对象,再祭出Proxy直接挂!

提一嘴,watch方法来自于B站up主:无名的Coder,主页:up主页


function watch(obj, name) {
    return new Proxy(obj,{
        get: function(target, property, receiver) {
            try {
                if (typeof target[property] === "function") {
                    console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + 'function' + `,类型为:` + (typeof target[property])]);
                } else {
                    console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + target[property] + `,类型为:` + (typeof target[property])]);
                }
            } catch (e) {}
            return target[property];
        },
        set: function(target, property, newValue, receiver) {
            try {
                console.table([`对象 => ${name} ,设置属性:`, property + `,值为:` + newValue + `,类型为:` + (typeof newValue)]);
            } catch (e) {}
            return Reflect.set(target, property, newValue, receiver);
        }
    });
}

window = global;

document= {
};
location= {
};
navigator= {
};

window = watch(window, "window");
location = watch(location, "location");
document = watch(document, "document");
navigator = watch(navigator, "navigator");

require("./bdm.js")

var sign = window.byted_acrawler.sign("","123");
console.log(sign);

运行打印看看:

  • sessionStorage和localStorage
    7.png
  • cookie
    8.png
  • referer
    9.png
  • location
    10.png

行,那就全补上

document= {
    referrer:'https://xx.xx.xx/search?dvpf=pc&source=trending_card&keyword=%E5%B7%A6%E6%B0%A7%E6%B0%9F%E6%B2%99%E6%98%9F%E2%80%9C%E6%94%BB%E5%87%BB%E2%80%9D%E8%82%8C%E8%85%B1%E7%9A%84%E6%A6%82%E7%8E%87',
};
location= {
    "ancestorOrigins": {},
    "href": "https://xx.xxx.xx/search?dvpf=pc&source=trending_card&keyword=%E5%B7%A6%E6%B0%A7%E6%B0%9F%E6%B2%99%E6%98%9F%E2%80%9C%E6%94%BB%E5%87%BB%E2%80%9D%E8%82%8C%E8%85%B1%E7%9A%84%E6%A6%82%E7%8E%87",
    "origin": "https://xx.com",
    "protocol": "https:",
    "host": "xx.com",
    "hostname": "xx.com",
    "port": "",
    "pathname": "/search",
    "search": "?dvpf=pc&source=trending_card&keyword=%E5%B7%A6%E6%B0%A7%E6%B0%9F%E6%B2%99%E6%98%9F%E2%80%9C%E6%94%BB%E5%87%BB%E2%80%9D%E8%82%8C%E8%85%B1%E7%9A%84%E6%A6%82%E7%8E%87",
    "hash": ""
};
navigator= {
    userAgent: "自己找"
};

Storage = function(){}
localStorage = {}
sessionStorage = {}

Object.setPrototypeOf(localStorage, Storage.prototype)
Object.setPrototypeOf(sessionStorage, Storage.prototype)

再来试试:只剩这个关键函数,提示undefined
11.png
回头看看那个vmp,其中有一些检测点:
12.png

"undefined"!=typeof exports?exports:void 0

在node环境下,这个表达式包返回Object,但是浏览器环境并没有exports,结果是undefined。所以必须让这个表达式的结果也是undefined,这样修改下再运行:

"undefined"==typeof exports?exports:void 0

13.png
直接出值,成功!
并且长度也没问题,代入请求中去测试能通过。

3. 思考

目前这个值请求通搜索接口没问题,不过有些场景的话,这个长度还不够,例如评论接口:
14.png
实际长度有147,但搜索接口补完出的值仅有47。所以补的环境不够,还差一部分。

这个就留给大伙自己补来看看哈哈

入门补环境,大佬请忽略

免费评分

参与人数 8威望 +1 吾爱币 +27 热心值 +4 收起 理由
yxpp + 1 谢谢@Thanks!
R44 + 1 我很赞同!
aquar + 1 + 1 谢谢@Thanks!
likebbs + 1 谢谢@Thanks!
jaffa + 1 谢谢@Thanks!
xhr2025 + 1 + 1 用心讨论,共获提升!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ZenoMiao + 1 + 1 用心讨论,共获提升!

查看全部评分

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

tomatoPower 发表于 2025-7-24 09:44
回头看看那个vmp,其中有一些检测点         请问byted_acrawler  为undefined的时候, 一般是怎么找检测点的,这时候proxy已经没吐其他东西了
姑娘你命里缺我 发表于 2025-7-22 23:21
有个疑问啊,这种值是根据客户端的特征生成的,而且每次生成都是不一样的值,应该是不可被解析的吧。那么服务器又是如何去判定这个signature字符串是否非法?这是什么思路
a361690548 发表于 2025-7-21 21:38
nangua654321 发表于 2025-7-21 22:23
学习了大佬
jianyui 发表于 2025-7-21 22:52
感谢大佬分享
GCloud2552 发表于 2025-7-21 22:53
感谢大佬分享

免费评分

参与人数 1吾爱币 +1 收起 理由
gkmax + 1 IP CAM 链接: https://pan.baidu.com/s/1F2sMHNTEc1RSW_FrwJVccA?pwd=6c7w .

查看全部评分

millylee 发表于 2025-7-22 01:19
感谢大佬,学习了
zdb121 发表于 2025-7-22 06:47
学习了学习了
sanfengzhang 发表于 2025-7-22 07:52
来学一学。现在什么也学不会。
latecomer 发表于 2025-7-22 09:57
a361690548 发表于 2025-7-21 21:38
正好在学习py,学习了

上面不是JS吗,是说py craw配合JS?
xhr2025 发表于 2025-7-22 10:14
正是需要,感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-7-20 17:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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