【爬虫JS逆向之旅】某9安全中心登录参数逆向 - 1(验证接口篇)

0 阅读6分钟

既然走了这么远了,干脆再走远一点。 -- 电影《肖申克的救赎》


📓 前言

特别声明,本文所提供的逆向思路及代码仅供学习参考使用,请勿使用 爬虫脚本 对网站进行 高频率 以及 高并发 数据抓取操作,若对网站造成损失的,后果自负!!!

📖 网址

aHR0cHM6Ly9hcS45OS5jb20vVjMvTkRVc2VyX0xvZ2luLmh0bQ==

🔎 观察

首先是接口中的 参数

我的习惯是先全局搜索一下这些值,看一下哪些是 接口 返回的

  • appKey

这是固定在JS文件中的,所以不用去逆向。

  • behaviorData 需要逆向
  • d 是接口返回,但并非固定值,是点击登录时接口返回的,加密的参数可能携带 账号/密码 ,本文章先固定,后续会出文章讲

  • token 是接口 /get 返回的值,也无需逆向

以此类推,其余的值都需要逆向,观察完毕。

🚀 技术前瞻

在开始逆向之前,我需要简单介绍一下但我们在 JS逆向 的过程中遇到 wasm 的时候,该怎么进行简单的判断和处理。首先,wasm 是什么,简单来说,浏览器中的专属语言是 Javascript ,那么如果我用 CC++ 这种不支持在浏览器中直接执行的语言写了一个方法,我想要在 JS 中调用这个方法,该怎么办?于是就会使用到 wasm 技术,将我们写的 C/C++ 文件编译成 wasm 文件,在 JS 中调用以此解决我的需求。我们作为 逆向者 ,关注的是它的 初始调用 位置,以便我们进行后续的 逆向 操作。

wasmJS 语言中的调用方式:

方法一:使用 WebAssembly.instantiateStreaming 调用

  • 特征代码
WebAssembly.instantiateStreaming(wasm_code, importObject);
  • 这种调用方式, wasm_code 参数需要 流式加载 Wasm 文件,也就是用 fetch 请求网页中提供的 .wasm 文件链接,而 importObject 则是可选模块,有的代码中不需要,有的需要,要根据具体代码进行补充。

**

  • 这种调用方式我在逆向过程中很少用,因为既然能找到 wasm 文件的链接,我直接下载下来用下面讲到的 WebAssembly.instantiate 直接调用就行了,免去网络请求这一步。

方法二: 使用 WebAssembly.instantiate调用

  • 特征代码
WebAssembly.instantiate(wasm_code, importObject);
  • 这种调用方式是在网页中明确找到了 wasm 文件时的常用方法,先把 wasm 文件下载下来,然后用 fs 读取 wasm 文件的二进制数据,赋值给 wasm_code 就行了,而 importObject 和方法一中的相同。

方法三使用编译生成的 胶水文件 调用

  • 特征代码
const result = Module.ccall('add', 'number', ['number', 'number'], [10, 20]);
  • 这种调用方法主要是使用 Emscripten 等工具将 C/C++ 代码编译成一份 胶水文件 (xxx.js,一般与wasm文件同名)和一份 wasm 文件(xxx.wasm),我们的主要目标是找到 胶水文件 ,必要时还要找到对应的 wasm 文件。

🎮 正文

首先,我先介绍 behaviorData 逆向过程,我用的 关键字 搜索,主要是快🤭

断住的位置就是生成的地方

这段代码的逻辑是,执行 等号 后面的异步回调,将返回值中的 behaviorData 赋值给 z ,将返回值中的 tqdna 赋值给 C

这里需要注意的是,异步 只有在执行完毕之后才会返回值,如果你要查看这个方法返回的最终值的话,可以将断点打在它的下方

  • z

  • C

其实这个 C 值就是参数中的 d 值,我们暂且不管,重要的是 behaviorData 的生成位置,主要是这个 e 方法

点进去,然后触发 断点

步入 t[e(178)] 方法

看出来了么,这不就是前面说的 wasm 调用的 第三种 方法的特征代码么。

Module 是什么?其实就是这个 this.jsonEncryptor ,因为在这里它调用了 ccall

那这个 this.jsonEncryptor 从哪来,在代码上方可以找到

但是你如果去找 JsonEncrypt 时,在本 JS 文件中找不到的,因为它是其它文件外调过来的,也就是 胶水文件 ,具体你随便点入它下面定义的方法可以找到

代码 收起来就可以看到

既然 胶水文件 找到了,那对应的 wasm 文件呢,我没找到😂,但我经过跟 AI 的不断对线中,知道了有一种情况不需要 wasm 文件,那就是在 胶水文件 中有调用 wasm 文件的代码,特征就是文件中有类似于 base64 编码形式的 wasm 数据流

这个时候,我们只要有 胶水文件 就可以了

现在把需要的代码先复制到本地

t 是什么,是 轨迹信息 ,这里不做介绍,后续会出文章,这里先固定

再把 混淆 的处理一下

调用的代码如下

将这里的 this.jsonEncryptor 替换为 Module

运行

没有数据?忘了说了 Module 是一个 异步 对象,需要用 then 调用

成了?没那么简单,注意这个 o 值,打印一下

看浏览器中的值

为了确定这个值是不是固定的,可以加个 日志点

那么可以确定,我们的代码有问题,询问了 AI 后,猜测是 环境 的问题,用 jsdom 模拟环境

结果

猜的没错,至此,behaviorData 的逆向告一段落。

接下来就是 signnonce 值,主要生成方法为 i.getSign

nonce 的值可以确定是 时间戳

C 值感觉是 MD5 ,看一下参数,A 在代码上方,是固定值,这里其实也定义了 sessionId

主要是这个 (0, E.MD5) 到底是不是 MD5 加密

那没什么好说的,用原生加密方法就行了。

接下来还剩一个 pointJson

主要方法看 i.encryptPointData ,传入的值为坐标点信息,这个统一放在后续 轨迹 生成的文章中去讲,这里先固定

进入方法

接着是这个 t.encryptData

是不是很眼熟,其实就是上面 behaviorData 的加密函数,共用的,只不过传入的值不同,加密出来的值就有所不同。

好了,关于 验证 接口的参数逆向就此结束,接下来其它的 接口 逆向我会在后续更新,可以给本菜鸟 关注❤ 一波,以便获得最新的文章推送。^_^


更多有趣内容,可关注wx公众号“小恰学逆向”,分享一些爬虫JS逆向技术以及有趣的工具。(●´ω`●)