JS逆向-某乎x-zse-96参数(2023-2-6)
前言
该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~
需求
目标网站:
aHR0cHM6Ly93d3cuemhpaHUuY29tL3RvcGljLzE5NTU1NTEzL2hvdA==
接口:
aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9jb21tZW50X3Y1L2Fuc3dlcnMvMjc5MTIwNDY2Ny9yb290X2NvbW1lbnQ=
正文
全局搜索某乎关键字、然后在JS里面有2处地方,全部选中然后下断点调试
可以看出:
x-zse-96 = “2.0_” + E
E = S.signature
再往上看
所以signature = j®.encrypt(f()(s))
s = ‘101_3_3.0+/api/v4/comment_v5/answers/2867180344/root_comment?order_by=score&limit=20&offset=+AGCTpuBzLxaPTu0YisV-exWuEPNOda8mJ6Y=|1673921615’
f()(s) 是一个标准的MD5加密算法(替换一下加密参数即可知)
可以看到每次数据都不一样,应该是有一个随机值,需要hook随机数的返回。
Math.random = function(){return 0.50
};
控制台注入后在测试数据就一样了
j( r).encrypt 进入这个方法,,跳到了一个D方法。可以看出是一个webpack。把这个方法所在的模块扣出来
可以看到末尾导出了ZP = D,而我们D方法正式我们的加密方法。这个模块也没有看到引用了其它模块,因此就不需要去导入加载器了,把模块里面的代码扣出来
在浏览器去跑一下是可以正常运行的,接下来就是补相应的环境
在头部加上jsdom的代码
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;
这个结果和样本明显不一样,说明还缺少了其他环境没有补到,,这个时候就需要使用自动吐环境,对前面的环境变量上代理,看看还用到了什么属性和方法
对于JS逆向来说,我们扣完代码的目的就是调用目标网站的加/解密函数或某个值的算法,一般情况下我们把他的算法扣下来能够直接执行,但是如果检测了浏览器指纹,那就比较难了,只能够去深入分析进行补环境。
一般的补环境的是通过运行程序后的undefined报错去一点一点分析,一点一点的去补一些环境,是非常掉头发的。
所以我们使用 Proxy 对全局遍历window、document、navigator等常见环境检测点进行代理,拦截代理对象的读取、函数调用等操作,并通过控制台输出,这样的话我们就能够实现检测环境自吐的功能,后续我们再针对吐出来的环境统一的进行补环境,这样就会方便的多。
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]}
});
document = new Proxy(document, {set(target, property, value, receiver) {console.log("设置属性set document", property, typeof value);return Reflect.set(...arguments);},get(target, property, receiver) {console.log("获取属性get document", property, typeof target[property]);return target[property]}
});
navigator = new Proxy(navigator, {set(target, property, value, receiver) {console.log("设置属性set navigator", property, typeof value);return Reflect.set(...arguments);},get(target, property, receiver) {console.log("获取属性get navigator", property, typeof target[property]);return target[property]}
});
location = new Proxy(location, {set(target, property, value, receiver) {console.log("设置属性set location", property, typeof value);return Reflect.set(...arguments);},get(target, property, receiver) {console.log("获取属性get location", property, typeof target[property]);return target[property]}
});
history = new Proxy(history, {set(target, property, value, receiver) {console.log("设置属性set history", property, typeof value);return Reflect.set(...arguments);},get(target, property, receiver) {console.log("获取属性get history", property, typeof target[property]);return target[property]}
});
screen = new Proxy(screen, {set(target, property, value, receiver) {console.log("设置属性set screen", property, typeof value);return Reflect.set(...arguments);},get(target, property, receiver) {console.log("获取属性get screen", property, typeof target[property]);return target[property]}
});
第一次跑:
代理停在了这个地方
需要Hook一下,这里是无法直接赋值的,添加以下代码:
var object_tostring = Object.prototype.toString
Object.prototype.toString = function (){let _xxx = object_tostring.call(this, arguments);// console.log(this)if(this.constructor.name == 'Document'){return '[object HTMLDocument]'}return _xxx
}
第二次跑:
在jsdom给它一个初始化的值
第三次跑:
报这个错:
需要npm install canvas --save
第四次跑:
在控制台看看
同样需要再Hook一下,在刚刚hook的地方加一个else if
第五次跑:
代理停在了这里
我们在浏览器window._resourceLoader 是一个undefined
而这里是一个object
第六次跑:
同上,window._sessionHistory=undefined
第七次跑:
补上:
alert = window.alert
第八次跑:
同样需要hook一下
var Function_tostring = Function.prototype.toString
Function.prototype.toString = function (){let _sss = Function_tostring.call(this, arguments);console.log(this)console.log(_sss,'sssss')if(this.name === 'Window'){return 'function Window() { [native code] }'}return _sss
}
此时返回的结果已经和浏览器的一样了
补充:此处抓包的接口仅为某个问题的评论
过程中貌似没有用到x-zst-81
后面就是一些参数的拼接了,此处就不展开讲了。
最后
欢迎联系作者交流更多
JS逆向-某乎x-zse-96参数(2023-2-6)相关推荐
- 【JS逆向系列】某乎x96参数3.0版本与jsvmp进阶
[JS逆向系列]某乎x96参数3.0版本与jsvmp进阶 前言 初看js代码 补环境方案 修改字节码方案(反混淆与反汇编) 算法还原 后记 前言 距离上一次的某乎jsvmp也过了好一段时间,现在也从2 ...
- 【JS逆向系列】某乎x96参数与jsvmp初体验
[JS逆向系列]某乎x96参数与jsvmp初体验 js分析 jsvmp分析 第一种解决方案-补环境 第二种解决方案-修改操作码 第三种解决方案-算法还原 参考文章 样品网址:aHR0cHM6Ly93d ...
- 【JS逆向】xx社区 帖子 请求参数加密(nonce)
注意:文章内容仅用于学习和技术交流,如有侵权请联系我删除. 学者应洁身自好,切勿做出违法的事情,旨在提供逆向思路. ➣➣欢迎关注本人微信公众号:Anonymous NoteBook➣➣ 分享好玩有趣的 ...
- 爬虫----js逆向某宝h5的sign参数
抓包 开发者工具中抓到包,发现有我们需要的商品数据. 分析构成的参数 对比两次请求发现,变化的参数只有两个: t参数: 一眼就看出来是一个13位时间戳 sign参数:貌似是一些参数经过哈希加密算法之后 ...
- JS逆向加密——美团店铺详情_token参数
美团店铺详情_token参数 网址 :https://sh.meituan.com/meishi/c17/ 可以在请求地址 找到 getPoiList 的请求链接,请求参数有多个,但是多次请求对比发现 ...
- JS逆向实战12——某店 captchaToken 参数 加密
今天爬取的是网站需要模拟登陆 目标网站 aHR0cHM6Ly9wYXNzcG9ydC55aGQuY29tL3Bhc3Nwb3J0L2xvZ2luX2lucHV0LmRv 浏览器抓包分析 随便输入一堆假 ...
- js逆向 - 某电商网站 fingerprint 参数
本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除! 目标网站:aHR0cHM6Ly93d3cuamQuY29tLw== 目标接口:Cmh0dHBzOi8vYXB ...
- Python爬虫——教你js逆向爬取网易云评论
大家好!我是霖hero 正所谓条条道路通罗马,上次我们使用了Selenium自动化工具来爬取网易云的音乐评论,Selenium自动化工具可以驱动浏览器执行特定的动作,获得浏览器当前呈现的页面的源代码, ...
- 送书 | 用啥selenium!JS逆向不香吗?
大家好!我是啃书君 正所谓条条道路通罗马,上次我们使用了Selenium自动化工具来爬取网易云的音乐评论,Selenium自动化工具可以驱动浏览器执行特定的动作,获得浏览器当前呈现的页面的源代码,做到 ...
最新文章
- c++编程 文件系统
- linux命令详解——top
- 对几种二叉树的简单理解
- wpf 按钮样式_键盘 | 01.在程序集间引用样式
- Anaconda是什么?Anconda下载安装教程 - Python零基础入门教程
- dockerfile 与 docker-compose的区别
- java web 启动顺序_JavaWeb开发Servlet过滤器链执行顺序详解
- 近年来NLP在法律领域的相关研究工作
- 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
- 软考笔记第九天之多媒体基础
- 异常连接导致的内存泄漏排查
- 通俗版 TCP/UDP三次握手 四次握手
- linux下c语言创建进程实验报告,linux下的c语言编程实验报告
- 解析kml文件,提取经纬度信息存入csv
- LCD屏的驱动芯片注意事项
- 下拉框优化威zx78_搜索框下拉优化即zx78
- 复数(Complex Number)
- z变换判断稳定性和因果性_试题库 - 7:z变换 -
- java 8 stream入门_跟上 Java 8 : Stream API 快速入门
- 跨越OpenGL和D3D的鸿沟