免责声明:本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

逆向目标

  • 目标:抖音网页端用户信息接口 X-Bogus 参数
  • 接口:aHR0cHM6Ly93d3cuZG91eWluLmNvbS9hd2VtZS92MS93ZWIvdXNlci9wcm9maWxlL290aGVyLw==
  • 参数:
    • X-Bogus: DFSzswVYwR2ANJV5ttm-TDok/RBL
    • msToken: XdvBn3ow8atTxF5IT6Nozn_D976Sh-fQQais1pUkC0U-…3iUKTT_yGo4Q1A9KBUXxYALyw==
    • ttwid: 1%7CwRK6LHw2rKAyHM8EeD4WLyVctABf-…5f35595a6e1f587dcc9f09b4fe

虽然接口入参有很多,但是实际上必不可少且需要逆向的就只有X-Bogus,msToken和Cookie中的ttwid。本文主要介绍X-Bogus的逆向,关于msToken和ttwid,后续会发文。

关于JSVMP

JSVMP参考文章

JSVMP是什么?

JS加密的研究背景和意义

JS混淆和JS压缩的前端代码攻防机制分析

代码虚拟化保护原理分析

深入了解JS 加密技术及JSVMP保护原理分析

给”某音”的js虚拟机写一个编译器

JSVMP代码特征

$jsvmprt,_$webrt_1668687510之类的,第一个参数很长的一串字节码。

JSVMP逆向分析有哪些方法?

就目前来讲,除去Playwright等自动化工具,JSVMP 的逆向方法有三种:RPC 远程调用,补环境,日志断点还原算法。其中日志断点也称为插桩,找到关键位置,输出关键参数的日志信息,从结果往上倒推生成逻辑,以达到算法还原的目的,之前介绍过,参考《JS逆向案例——利用插桩分析某音X-Bogus参数》。RPC的方式以后有时间再写,本文主要介绍如何使用补环境的方法来生成签名参数。

逆向过程

签名参数定位

先抓包,进入博主主页之后,刷新,看到相应的接口和入参:

image-20230602181930856

打下XHR断点,然后刷新页面重新请求主页:

成功打上了断点,并且此时已经生成了msToken和X-Bogus参数。往前跟栈,来到一个叫 webmssdk.js 的JS文件,这里就是生成参数的主要JS逻辑了,也就是JSVMP,整体上做了一个混淆如图:

image-20230525221623399

我们用v_jstools做一个简单的还原,还原之后用浏览器的override功能替换,之后重新加载,如图:

image-20230526141726633

往上跟栈到符号函数$这里:

image-20230602195200151

在往上跟栈:

image-20230602195847236

可以看到很明显的JSVMP的特征,参数a是请求的params。

确认一下定位的加密方法有没有问题:

image-20230602202828745

没有问题,至此我们就成功定位到加密函数。

补环境

本文介绍手动补环境,关于自动补环境框架,半自动补环境框架后边发文介绍。

将整个webmssdk.es5.js的代码抠出来,然后定义全局变量__0x5a8f25,将_0x5a8f25方法导出,然后运行,如下:

image-20230602203506375

提示window未定义,补上window定义:

1
var window = global;

接着运行:

image-20230602203704800

提示document未定义,补上document:

1
2
window.document = {
}

后边的过程就不一一贴了,整理下最终全部的补环境代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var window = global;
window.Request = function() {};
window.Headers = function() {};
window.document = {
referrer: "",
addEventListener: function() {},
createElement: function() {
return {};
},
}
window.navigator = {
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
};
window.location = {
"ancestorOrigins": {},
"href": "https://www.douyin.com/",
"origin": "https://www.douyin.com",
"protocol": "https:",
"host": "www.douyin.com",
"hostname": "www.douyin.com",
"port": "",
"pathname": "/",
"search": "",
"hash": ""
};
window.screen = {
availHeight: 900,
availLeft: 0,
availTop: 0,
availWidth: 1440,
colorDepth: 30,
height: 900
}

运行与测试

补好环境之后,运行,结果如下:

image-20230602204034504

成功生成X-Bogus参数。

若需要完整代码或者讨论,扫描加微信。

image-20230517010053227