知乎x-zse-96 参数补环境

本文精工学习参考

  • 目标链接
'aHR0cHM6Ly93d3cuemhpaHUuY29tL3NlYXJjaD90eXBlPWNvbnRlbnQmcT1weXRob24='
  • 接口分析
    参数x-zse-93:相当于版本号
    参数x-zse-96:看起来需要破解
    参数x-zst-81:请求发现可以置空
    在这里插入图片描述
    综上所述x-zse-96才需要逆向。

  • 参数分析

  1. 全局搜x-zse-96可以看到就只有一个文件包含。
    在这里插入图片描述

  2. 往下滑可以看到E就是需要破解的参数,而E又是通过S.signature。往上看可以看到signature

 signature: (0,M(r).encrypt)(f()(s))

在这里插入图片描述

  1. s参数就是在上述进行拼接而成的。
    在这里插入图片描述
 var o = n.z
i = n.dc0
a = n.xZst81
u = z(t)
c = G(e)
s = [o, u, i, V(c) && c, a].filter(Boolean).join("+");

参数o:固定的版本好
参数i:cookie中的dc0参数
参数a:就是参数x-zst-81可以为空
参数u:将请求体通过&拼接 t就是请求体,z函数就是拼接函数
参数c:为"",参数e为未定义

  1. 拆分加密函数,就是将s执行了f()函数,在执行了加密函数。
    根据测试f(s)就是将s值进行了md5操作。

  2. 再看看先进去encrypt函数,接着在单步调试的时候,发现会在各个函数之间反复横跳。看到这个前面有一个很长的字符串【AxjgB5MAnACoAJwBpAAAABAAIAKcAqgAM*****】,这种很有可能就是jsvmp
    在这里插入图片描述

  3. 多次执行发现结果是不同的。而做过2版本的就是到这里应该是一样的才对。

在这里插入图片描述猜想可能存在随机值?

  1. 根据上述采集对随机值函数进行改写,此时就发现结果都是一样的了
    在这里插入图片描述
    那么此时就得到了一组样本,当随机数恒定返回0.5时。入参【‘d032891cadcfd50a64d3c7c47c500707’】的正确结果为【t=‘Wr+xI90ki+TeLvAsz436Sc1mxLtLwSAY/3wYZnW5364SgGST6Ul3jSH400Xt4aPI’】,那么接下在就真正可以开始补环境了

  2. 看结构可以发现它是webpack的,将加密的整个扣下来
    在这里插入图片描述
    导出时候会发现报错
    在这里插入图片描述

  3. 通过使用jsdom去补环境,也可以使用vm2

const{JSDOM}=require("jsdom");
const dom=new JSDOM("<!DOCTYPE html><p>Hello world</p>");
window=dom.window;
document=window.document;
navigator=window.navigator;
location=window.location;
history=window.history;
screen=window.screen;
Math.random = function () {
    return 0.50
};

会保存atob未定义 ReferenceError: atob is not defined
这个 atob 是将 base64 加密的字符串给解密,在 node 环境下是没有这个方法的,我们需要使用 Buffer.toString()替代即可。

// D = atob(A),
D = Buffer.from(A, 'base64').toString("binary"),
  1. 补完之后就可以生成值了,但是明显可以发现值既然不对
    在这里插入图片描述
    那就需要通过设置代理进行补环境了。
window = new Proxy(window, {
    set(target, property, value, receiver) {
        console.log("设置属性set window", property, typeof value);
        return Reflect.set(...arguments);
    },
    get(target, property, receiver) {
        console.log("获取属性get window", property, typeof target[property]);
        return target[property]
    }
});

这只是其中一个对象(window)的的代理,正确的可以将它封装成函数,一个个个对象去调用。但是我这里直接使用了(记得将所有对象都代理上)。

  1. 可以看到读取了不少属性,最后运行到【获取属性get document Symbol(Symbol.toStringTag) string】这一步就退出了,那么看看这一步的结果是不是和网页不一样。
    在这里插入图片描述
    可以发现toString()浏览器结果和node结果不同的,因此需要hook将toString()方法去掉(也就是保护机制)。
    在这里插入图片描述
var Object_toString = Object.prototype.toString;
Object.prototype.toString = function () {
    let _temp = Object_toString.call(this, arguments);
    console.log(this);
    console.log("Object.prototype.toString: " + _temp);
    if(this.constructor.name === 'Document'){
        return '[object HTMLDocument]';
    }
    return _temp;
};
  1. 再次运行可以发现日志比之前更加长了,说明补的内容是有效的,但是跟结果还是存在不同的
    在这里插入图片描述
    location对象出现问题,那么在jsdom上面,就需要补上url链接,那么就会自动补全location对象,开头部分的代码就修改成。
const{JSDOM}=require("jsdom");
const dom=new JSDOM("<!DOCTYPE html><p>Hello world</p>",{url:'https://www.zhihu.com/search'});
window=dom.window;
document=window.document;
navigator=window.navigator;
location=window.location;
history=window.history;
screen=window.screen;
  1. anvas和网页返回不一样,需要继续补上。
    在这里插入图片描述
    在这里插入图片描述
// var Object_toString = Object.prototype.toString;
Object.prototype.toString = function () {
    let _temp = Object_toString.call(this, arguments);
    // console.log(this);
    // console.log("Object.prototype.toString: " + _temp);
    if(this.constructor.name === 'Document'){
        return '[object HTMLDocument]';
    }else if(this.constructor.name === 'CanvasRenderingContext2D'){
        return '[object CanvasRenderingContext2D]'
    }
    return _temp;
};
  1. 继续跑,这次检测了window下的_resourceLoader,浏览器上是undefined,但是node返回时对象。需要赋undefined,运行之后还会确实_sessionHistory同样时赋undefined。
window._resourceLoader = undefined
window._sessionHistory = undefined
  1. 运行报错 alert未定义
    在这里插入图片描述
alert = window.alert;
  1. 结果还是不同,并且获取了window的原型后就没有了,那么这种情况很可能检测了原型链和函数或者toString(),那么需要hook一下。
    在这里插入图片描述
    在这里插入图片描述
var Function_toString = Function.prototype.toString;
Function.prototype.toString = function () {
    let _temp = Function_toString.call(this, arguments);
    
    if(this.name === 'Window'){
        return 'function Window() { [native code] }'
    }
    return _temp;
};

补完之后发现值一样了。
在这里插入图片描述

如果有需要可以请教博主。

  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值