某音 Js 逆向思路

本文章只做技术探讨, 请勿用于非法用途。

目标网站

今天来处理某音。

目标是获取某用户的所有作品, 通过刷新页面搜索内容可以确定目标接口。www.douyin.com/aweme/v1/we...

网站分析

加密参数分析

确定接口之后可以多刷新几次, 观察参数的变化, 确定需要逆向哪些参数。

请求接口参数示例

多次对比后可以发现, 每次请求只有 msTokena_bogus 两个参数会变化,也就是我们需要逆向处理的参数。

堆栈情况

打断点方式很多, 可以根据网络中请求的 启动器 页面来尝试打断点, 也可以用 xhr 端点来做, 总之能断到就可以, 这里我用 xhr 端点来做示例。

xhr 端点堆栈示例

在堆栈中可以查看参数的情况, 可以看到 xhr 断到的地方两个参数都已经生成了(xhr 断到的地方是发送请求的地方, 一定是生成参数的), 然后我们继续根据堆栈往上翻, 一直到参数生成之前, 就可以确定参数生成的位置。

跟值分析

一直往上翻堆栈, 分析各种参数, 会发现抖音应该是有几套逻辑的, 但是每套逻辑都会经过 bdms.js 这个文件, 且加密参数是在这后边第一次出现的。

加密入口示例

bdms.js 内容

到这里我们可以得到如下信息。

diff 复制代码
- bdms.js 里就是加密的位置, 我们可以通过模拟加密入口的调用方式来同样的生成数据。
- bdms.js 中大量的循环嵌套 if、else 可以表明这是一个 jsvmp。

基于此, 我们分析加密入口的调用方式, 是直接 new 了一个 XMLhttpRequest 对象, 然后调用他的 send 方法, 且并无返回值, 所以我们还得确定如何拿到加密结果。

注: 这里之前踩了一个坑, 一开始是将 bdms.js 的 n 函数(即 XMLhttpRequest.send 实际调用的方法)暴露到全局进行调用的, 但是这个 n 函数是基于闭包的 e、r 参数变化的, 如果要用这种方式, 需要做一个判断, 在 e、r 的值正确的时候再暴露 n 函数。一开始没注意这个问题, 暴露的函数是错误的, 导致补环境是补了很多还是什么都没有, 最后还是插桩比日志才发现完全不对劲。

jsvmp 分析

分析 jsvmp 的时候, 我们可以跟一下逻辑, 找一个尽可能能看到更多明文信息的地方进行日志插桩, 然后查看日志找找有用的东西。

日志插桩位置

msToken 日志

a_bogus 日志

日志插桩出来的内容很多, 分析后可以看到 a_bogus 和 msToken 的值都是在这里生成的, 我们只需要在他们生成后暴露到全局供我们使用就行了。

还有一点就是, 某音的请求很多, 会有大量的日志干扰我们分析, 而且日志会把浏览器搞崩掉, 所以我们在加密前的位置都再加上一个断点, 只需要看加密时的日志就行。

加密入口断点

我们只需要关注我的目标接口的加密过程就行, 所以这里要用条件断点, 如上图所示。

一方面是方便我们分析插桩日志, 另一方面在这里我们可以直接复制调用时的参数信息, 还有就是之后补环境对比日志也更方便。

开整

加密函数处理

首先就是将加密函数也就是 bdms.js 文件给复制到本地, 然后把加密出来的参数放到 window 里暴露给全局。

加密函数处理

然后构建一个 XMLhttpRequest 对象, 根据调试时候的内容复制入参(XMLhttpReques 和 null), 模拟调用。

加密参数入参示例

模拟调用函数示例

生成结果示例

补环境

补环境的话, 可以用 Proxy 的方式代理 window、navigater 等对象来自吐被检测的环境, 也可以对比之前的插桩日志来进行调试。

我这边建议优先用 Proxy 代理来看着补, 实在得不到结果, 再考虑对比堆栈。

部分补环境代码示例

用之前复制的入参得到可用的结果, 就说明环境是补好了, 这时候我们把入参里的一些内容抽出来当作参数传进调用就完成逆向这一块了。

注: 环境在补的时候多测一测, 有些环境不完全补也能生成的, 边补边测吧。

请求部分

请求我这边是用 Python 来做的, 使用 execjs 包来调用刚才的加密函数, 放到请求参数里一起发送就行。

Python 部分示例

请求结果示例

遗留问题

关于其他参数问题, 做一个大概说明。

首先, 某音获取数据其实是不用登录的。但还是需要 Cookie 传入, 关键部分就是 ttwid 这块, 是有效期的。Cookie 的获取可以通过 www.douyin.com/ttwid/check... 这个接口来进行续签的。

其他的参数大多都是不会变的, 但是我没进行长期的测试, 暂时通过续签就可以满足我的需求, 有兴趣的话大家可以自行测一测。

总结

经典的 jsvmp 问题, 调试起来倒是不算麻烦, 环境检测其实也并没有很多, 有兴趣可以跟着试一试。

说起来, node21.x 之后的版本官方对 navigator 做了支持, 然后 Proxy 检测不到了, 哪位大哥有没有解决办法。

请洒潘江,各倾陆海云尔。

相关推荐
街尾杂货店&4 小时前
webpack - 单独打包指定JS文件(因为不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改)
前端·javascript·webpack
月光技术杂谈4 小时前
用Deepseek 实现一个基于web的扣图应用
前端·javascript·html5·ccs·tensorflow.js·canvas api
kevlin_coder5 小时前
🚀 实现同一个滚动区域包含多个虚拟滚动列表
前端·javascript
金梦人生5 小时前
JS 性能优化
前端·javascript
peachSoda75 小时前
自定义配置小程序tabbar逻辑思路
javascript·vue.js·微信小程序·小程序
hbqjzx5 小时前
记录一个自动学习的脚本开发过程
开发语言·javascript·学习
浪裡遊5 小时前
React开发模式解析:JSX语法与生命周期管理
前端·javascript·react.js·前端框架·ecmascript
fruge5 小时前
Vue 3 完全指南:响应式原理、组合式 API 与实战优化
javascript·vue.js·ecmascript
Aoda5 小时前
从痛点到落地:PawHaven 的 Monorepo 架构设计
前端·javascript