type
status
date
slug
summary
tags
category
icon
password
前置知识
Hook JSON.stringify
小红书式jvmp的,可以通过补环境、插桩来实现。先介绍下什么是插桩
插桩
插桩(Instrumentation)是一种软件技术,用于在程序执行期间向代码中插入额外的指令或代码片段,以收集信息、监视程序行为、修改程序逻辑或进行性能分析等目的。
插桩通常在应用程序的源代码或目标代码级别进行,可以通过静态插桩或动态插桩的方式实现。静态插桩是在编译时或链接时修改代码,而动态插桩是在运行时通过修改内存中的程序指令实现。
插桩技术可以用于多种用途,包括但不限于以下几个方面:
- 监视和调试:插桩可以用于收集程序执行期间的运行时信息,如函数调用、变量值、异常处理等,以帮助调试和排除错误。
- 性能分析:插桩可以用于收集程序的性能数据,如函数执行时间、内存使用情况等,以进行性能优化和瓶颈分析。
- 安全检测:插桩可以用于在程序执行期间检测潜在的安全漏洞或恶意行为,如检查输入验证、访问控制等。
- 动态修改程序行为:插桩可以用于在程序执行期间动态修改程序的行为,如替换函数调用、修改参数值等,以实现特定的功能或修复bug。
插桩技术在软件开发、测试、分析和安全等领域都有广泛的应用。它提供了一种灵活和强大的手段,可以对程序进行深入的观察和干预,帮助开发人员和研究人员更好地理解和改进软件系统。
对每一个插桩不现实,所以插桩的关键是找准位置插桩
请求分析
点击下面的专栏会出现一个ajax请求的url




载荷和响应数据都是明文的,那么查看headers

有这几个可疑的,可以先复制测试一下,看看哪个是必须的
经过测试分析 只有X-s 和x-t是我们需要逆向的,这个x-t很明显是个时间戳,这个x-s是 XYW_ 后面部分是base64字符串,我们再控制台输出解码查看


可以看到 是对json数据进行的base64编码,这个payload像是加密的数据,下面针对这个x-s进行逆向分析
入口定位
定位方式一,关键字搜索X-s

找到了几处,分别打上断点,进行调试

停留在这个位置,我们控制大打印标红的

那么可以确定这一段代码就是生成x-s的值的方法,通过三元运算可以得到是window._webmsxyw(c, i)来获取的x-s值,

c 是请求url的一部分,i是请求载荷。接下来定位到window._webmsxyw这个方法中

代码做了混淆
定位方式二,Hook JSON.stringify
既然这个x-s值,是做了base64的转码,那么肯定有一个转为json字符串的过程
找到请求url的启动器的第一条,点进去,并在最上面一行加入断点,控制台运行hook函数,并进行调试




已经停到我们hook函数处,接下来我看查看调用栈,是谁调用了这个函数

我们挨着往前推,找到xsXt这个调用栈,点进去

正式我们刚才关键字定位的位置
代码段测试
既然是jvmp的,那我们把源码拷贝一份到本地

再最下面指定c,i的值,然后进行函数调用

刷新,运行

发现是可以运行并输出结果的,那么接下来进行插桩分析
插桩分析
查看整体源码,是执行了一个Sanji()的函数,并传入了windo对象和后面的数据,第二个参数b是我们主要定位的,是核心代码


那么这个_ace_aa949.b 就是数据参数,搜索一下定位


是在_ace_75a05 中做的解码,定位_ace_75a05

_ace_75a05作为实参传递给了 _ace_99485
定位_ace_99485函数

这一段就是我们的主函数区域
- 注意,可以明显看见主循环这里运行的总次数几十万次,特别夸张,所以打印或其他操作时要谨慎,否则很容易卡崩系统。
_ace_aec23很关键,是指令数组,包含加减乘除各指令函数。
- 明显
_ace_1ae3c是使用最多的一个方法,可以考虑作为插桩位置试试看
fromCharCode与charAt
此次插桩打印,并没有我们所要的结果
JSON序列化前插桩

看到这个apply方法,可以在这边打印下日志

通过搜索 /api关键字


1. 对url进行字符拼接得到
url=/api/sns/web/v1/homefeed{"cursor_score":"","num":31,"refresh_type":1,"note_index":31,"unread_begin_note_id":"","unread_end_note_id":"","unread_note_count":0,"category":"homefeed_recommend","search_key":"","need_num":6,"image_formats":["jpg","webp","avif"],"need_filter_image":false}
对字符进行md5摘要: 715243593357fd41b05b8bc83c1296c2
2.在搜索MD5的值,发现找不到,只能换个地方插桩,说明这个插桩位置并没有用到MD5的值
发现主函数里面有一个_ace_aec23数组,这个数组存放了许多函数,属于指令集的,发现在这里数组下,有几个运算,其中+运算是字符或者数字运算,可以在这边进行插桩,这里做了一下打印日志的过滤,过滤一下无用的信息


3.针对控制台输出的内容,搜索上面的MD5值
最终找到

x1: 为上面url字符串md5摘要的
x2:固定字符串
x3: cookie中a1值
x4: 是时间戳
4.继续往下查找,发现有了一个base64的字符串

我们拿到这个字符串进行解码查看,

是上面x1x2x3x4拼接字符串的base64转码。
5.往下面继续找,出现了encrypt关键字


加密数据
说明 对此base64字符串又进行了加密处理,至于怎么加密,需要继续寻找
6.组合json字符串
往后面滑动,可以看到,这个加密的字符串被添加到了一个对象中,值为payload

这段字符串正是我们最开始,针对x-s 后面base64部分解码得到的数据,那么后面肯定也会对这个字符串做了一个base64编码
7.json字符串base64编码

8.编码之后进行组合字符串拼接
继续向下滑动可以看到,又对base64编码后的数据,进行了字符串拼接
XYW_ + base64转码的json字符串

至此,最终的数据就是我们需要的完整的X-s的值,那么现在问题是如何获取加密方法
9.还原步骤5中的加密方法
那么是如何加密,用的什么算法?
高频使用法,哪个函数使用频率高,又是在指令集位运算函数中,可以观察,并定位这个函数,并打印
_ace_1ae3c 这个使用频率高,找到_ace_1ae3c,最终是调用下面这个函数,我们打印需要的参数


定位到_ace_b81ca

我们在此处插桩,并过滤一些无用的信息

可以定义一个window.data,将打印的数据拼接到data中,然后复制数据到本地查看
window.data = ""
window.data +=_ace_7e97a.toString()+"\n";

通过本地文件查找x4关键字,然后找到x1x2x3x4字符串,进行base64转码,得到的结果再次查找
x1=ffd4270a2af9736f4c2d46ac666df940;x2=0|0|0|1|0|0|1|0|0|0|1|0|0|0|0;x3=18875c53892wgd3o71a3ws1raoh1jairz42rmepl950000266508;x4=1712545101624;
btoa("x1=ffd4270a2af9736f4c2d46ac666df940;x2=0|0|0|1|0|0|1|0|0|0|1|0|0|0|0;x3=18875c53892wgd3o71a3ws1raoh1jairz42rmepl950000266508;x4=1712545101624;)
'eDE9ZmZkNDI3MGEyYWY5NzM2ZjRjMmQ0NmFjNjY2ZGY5NDA7eDI9MHwwfDB8MXwwfDB8MXwwfDB8MHwxfDB8MHwwfDA7eDM9MTg4NzVjNTM4OTJ3Z2QzbzcxYTN3czFyYW9oMWphaXJ6NDJybWVwbDk1MDAwMDI2NjUwODt4ND0xNzEyNTQ1MTAxNjI0Ow=='
找到bsae64相应位置,然后进行往下排插,找到数字数组,也就是加密相关的方法

这种连续的数字数组,就是加密算法,可以随便拿几个,转换成16进制,网上搜索即可查询到对应的算法。通过查到是DES进行加密的
下面只需要获取key就可以了
key一定是des加密前确定的,可以确定是生成base64后面第一个位置就是key(单独的数字数组,32位),也是一个数字数组,或者复制一串32位的数字数组,进行对x1x2x3x4加密后的数据进行解密,观察能否得到原始数据,逐一排查正确的key。
key 是单独一行,每加密一段,都需要一个key

测试key
我们可以拿到这个key,正好也是32位,符合DES加密key 的长度,然后进行解密测试,代码如下

发现能够解密,所以这个key是正确的
x-s 加密流程梳理
JS 代码测试获取x-s值
可以获取到:

整合python+JS完整代码
JS代码
python完整代码
- Author:dittoyang
- URL:https://blog.yangziyang.top/article/4f654175-aa63-4dd0-b1ac-934da1c9ce88
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!