JS逆向 - 某乎搜索接口x-zse-96参数分析

文章旨在学习和记录,若有侵权,请联系删除

文章目录

  • 前言
  • 一、抓包
  • 二、逆向
    • 1. 定位js
    • 2. 跟堆栈
    • 3. 扣代码
    • 4. 补环境
  • 总结


前言

目标网址:aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9zZWFyY2hfdjM/dD1nZW5lcmFsJnE9JUU3JTlGJUE1JUU0JUI5JThFJmNvcnJlY3Rpb249MSZvZmZzZXQ9MCZsaW1pdD0yMCZmaWx0ZXJfZmllbGRzPSZsY19pZHg9MCZzaG93X2FsbF90b3BpY3M9MCZzZWFyY2hfc291cmNlPU5vcm1hbA==

目标参数:x-zse-96


一、抓包

在页面点击搜索键寻找接口,确定目标参数。JS逆向 - 某乎搜索接口x-zse-96参数分析_第1张图片

二、逆向

1. 定位js

全局搜索中搜索 x-zse-96,很舒服只在一个文件 main.app.xxx里面;
点进去,继续搜索x-zse-96,会搜到两个地方,下图为目标处。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第2张图片

2. 跟堆栈

我们发现 x-zse-96 是由 “2.0_” 和 y 拼接而成的,而y其实就是 signature,signature 等于 u()(f()(s)) ,我们在sigsignature处打上断点,刷新网页。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第3张图片
怎么理解u()(f()(s)) 呢?
其实我们可以将 u()(f()(s)) 拆开来看,方法u() 传入了 方法f() ,然后f() 传入了参数s。

我们从最里面往外看,先看参数s是什么:
JS逆向 - 某乎搜索接口x-zse-96参数分析_第4张图片
如上图所见,参数s 是用 + 拼接的 固定值 和 接口url后缀 和 服务器返回的同名cookie。我们可以在调试工具里找到该cookie:
JS逆向 - 某乎搜索接口x-zse-96参数分析_第5张图片
接着我们来看 方法f(),先看下调用结果,是熟悉的32位小写字符串,不禁怀疑方法f() 是hash的md5或sha1,那我们来校验下
JS逆向 - 某乎搜索接口x-zse-96参数分析_第6张图片
在这里插入图片描述
JS逆向 - 某乎搜索接口x-zse-96参数分析_第7张图片
这边使用了猿人学的工具网站进行了md5检验,发现和网站输出的结果一模一样,所以方法f() 其实就是md5,那我们就可以通过python的hashlib在请求前构造字符串。(也可以直接扣出f())

然后就剩方法u() 了,选中u() 点进去看,直接定位到的是函数b;我们可以看到与 b同级的方法函数都是逗号分隔开的,意味着这些个代码块是在一个大的对象内,可以直接往上找到对象的开头处扣下来。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第8张图片
这个对象的头部是一个function,我们只要将这整个function扣下来,再做一些处理就能够模拟出加密的结果啦。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第9张图片

3. 扣代码

扣下来的代码骨骼长这样,小小改动下,
给函数起名为wzj,传入形参data(其实传入的实参数就是前面加密的md5)。
函数尾部返回 b函数调用参数data。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第10张图片
传入上面加密得出的md5值,浏览器环境运行结果如下:
参数:848951efd31705cb9bcbd5251310516a
输出:aXNqr4u0r02xcTYqyhS8nqU8FCFxoX20yBOBr49y6_FX
JS逆向 - 某乎搜索接口x-zse-96参数分析_第11张图片
看下网站的调用情况:
JS逆向 - 某乎搜索接口x-zse-96参数分析_第12张图片
结果一致,加密算法部分成功扣出,剩下的就是补环境了。

4. 补环境

我们首先运行一下前面扣出来的代码,看看是否能成功调用。
控制台报了__g._encrypt不是一个方法函数,我们有理由怀疑代码检测了我们的环境,从而不给这个方法定义。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第13张图片
那我们先补上环境看看,这次补环境我来介绍下神器 jsdom。
我们先node安装一下 jsdom,如果没安装node可以自行教程安装,菜鸟教程这有非常详细的安装配置使用指南:https://www.runoob.com/nodejs/nodejs-install-setup.html
安装好node后直接 npm install jsdom ,出现下图样式即为安装成功:
JS逆向 - 某乎搜索接口x-zse-96参数分析_第14张图片
然后我们将下面这段代码贴到扣出来的代码顶部

const { JSDOM } = require('jsdom');
const jsDomIntance = new JSDOM(`
    
    
    

`
) const window = jsDomIntance.window; const document = jsDomIntance.document;

运行后上面 __g 的报错没有了,然后出现了个新的报错 atob is not defined 。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第15张图片
atob 是 BOM(浏览器对象模型)里面的方法,所以node环境和DOM里面是没有的,我们需要自己实现一个。

if (typeof btoa === 'undefined') {
    btoa = function (str) {
    return new Buffer.from(str).toString('base64');
  };
}

if (typeof atob === 'undefined') {
    atob = function (b64Encoded) {
    return new Buffer.from(b64Encoded, 'base64').toString('binary');
  };
}

继续补到头部,然后运行。
JS逆向 - 某乎搜索接口x-zse-96参数分析_第16张图片
和网站调用出来的一模一样,可以直接拿来用了。

总结

1.某乎的加密算法还算比较好扣,补环境这块介绍了神器 jsdom的基础用法,补起来十分的省心,但 jsdom不是万能的,有些大厂的加密算法是能够检测到 jsdom的,需要多加注意。
2.还有一个小坑就是模拟的 atob Base64方法中,某乎的加密需要将结果转为binary(上面已经实现)否则还是会报__g 未定义的错误。
3.最后一点是在模拟发送请求时,加密x-zse-96使用d_c0需要和cookie中的保持一致,否则不给返回数据。

码字不易,希望大佬们看完点个小赞哈~~~

你可能感兴趣的:(Js逆向,python,javascript)