前言

该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~

需求

目标网站:
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)相关推荐

  1. 【JS逆向系列】某乎x96参数3.0版本与jsvmp进阶

    [JS逆向系列]某乎x96参数3.0版本与jsvmp进阶 前言 初看js代码 补环境方案 修改字节码方案(反混淆与反汇编) 算法还原 后记 前言 距离上一次的某乎jsvmp也过了好一段时间,现在也从2 ...

  2. 【JS逆向系列】某乎x96参数与jsvmp初体验

    [JS逆向系列]某乎x96参数与jsvmp初体验 js分析 jsvmp分析 第一种解决方案-补环境 第二种解决方案-修改操作码 第三种解决方案-算法还原 参考文章 样品网址:aHR0cHM6Ly93d ...

  3. 【JS逆向】xx社区 帖子 请求参数加密(nonce)

    注意:文章内容仅用于学习和技术交流,如有侵权请联系我删除. 学者应洁身自好,切勿做出违法的事情,旨在提供逆向思路. ➣➣欢迎关注本人微信公众号:Anonymous NoteBook➣➣ 分享好玩有趣的 ...

  4. 爬虫----js逆向某宝h5的sign参数

    抓包 开发者工具中抓到包,发现有我们需要的商品数据. 分析构成的参数 对比两次请求发现,变化的参数只有两个: t参数: 一眼就看出来是一个13位时间戳 sign参数:貌似是一些参数经过哈希加密算法之后 ...

  5. JS逆向加密——美团店铺详情_token参数

    美团店铺详情_token参数 网址 :https://sh.meituan.com/meishi/c17/ 可以在请求地址 找到 getPoiList 的请求链接,请求参数有多个,但是多次请求对比发现 ...

  6. JS逆向实战12——某店 captchaToken 参数 加密

    今天爬取的是网站需要模拟登陆 目标网站 aHR0cHM6Ly9wYXNzcG9ydC55aGQuY29tL3Bhc3Nwb3J0L2xvZ2luX2lucHV0LmRv 浏览器抓包分析 随便输入一堆假 ...

  7. js逆向 - 某电商网站 fingerprint 参数

    本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除! 目标网站:aHR0cHM6Ly93d3cuamQuY29tLw== 目标接口:Cmh0dHBzOi8vYXB ...

  8. Python爬虫——教你js逆向爬取网易云评论

    大家好!我是霖hero 正所谓条条道路通罗马,上次我们使用了Selenium自动化工具来爬取网易云的音乐评论,Selenium自动化工具可以驱动浏览器执行特定的动作,获得浏览器当前呈现的页面的源代码, ...

  9. 送书 | 用啥selenium!JS逆向不香吗?

    大家好!我是啃书君 正所谓条条道路通罗马,上次我们使用了Selenium自动化工具来爬取网易云的音乐评论,Selenium自动化工具可以驱动浏览器执行特定的动作,获得浏览器当前呈现的页面的源代码,做到 ...

最新文章

  1. c++编程 文件系统
  2. linux命令详解——top
  3. 对几种二叉树的简单理解
  4. wpf 按钮样式_键盘 | 01.在程序集间引用样式
  5. Anaconda是什么?Anconda下载安装教程 - Python零基础入门教程
  6. dockerfile 与 docker-compose的区别
  7. java web 启动顺序_JavaWeb开发Servlet过滤器链执行顺序详解
  8. 近年来NLP在法律领域的相关研究工作
  9. 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
  10. 软考笔记第九天之多媒体基础
  11. 异常连接导致的内存泄漏排查
  12. 通俗版 TCP/UDP三次握手 四次握手
  13. linux下c语言创建进程实验报告,linux下的c语言编程实验报告
  14. 解析kml文件,提取经纬度信息存入csv
  15. LCD屏的驱动芯片注意事项
  16. 下拉框优化威zx78_搜索框下拉优化即zx78
  17. 复数(Complex Number)
  18. z变换判断稳定性和因果性_试题库 - 7:z变换 -
  19. java 8 stream入门_跟上 Java 8 : Stream API 快速入门
  20. 跨越OpenGL和D3D的鸿沟

热门文章

  1. 成功抗“疫”背后的IT科技
  2. 平凉锅盔西北美食的文化的传承之一
  3. ews java api maven_通过 EWS JAVA API读取exchange邮件
  4. 用Python批量替换更改掉txt文本的内容
  5. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
  6. 腾讯视频会议真实内部实现分享
  7. 车子Linux系统,Linux车载系统Automotive Grade Linux
  8. Java实现家庭记账软件(文本界面)
  9. xxxiNetxxxxx2
  10. 期货反向跟单靠谱吗?