XHS xs逆向分析

avatar
作者
猴君
阅读量:0

 已经把所有的侵权地方删除,望批准 

前言

1.本文单纯学习jsvmp和交流,无任何其他意图 

2.学习jsvmp,通过插桩和算法还原。

问:什么是vmp?

JSVMP(JavaScript Virtual Machine Protocol)是一种协议,用于在不同的JavaScript虚拟机(如V8、SpiderMonkey等)和调试器之间进行通信。它定义了一套标准的消息格式和通信规则,使得调试器可以与不同的JavaScript虚拟机进行交互,实现调试、监控和性能分析等功能。

JSVMP的作用包括但不限于:

  1. 调试: JSVMP允许调试器与JavaScript虚拟机进行通信,以便在代码执行过程中进行断点设置、变量查看、调用堆栈跟踪等调试操作。

  2. 性能分析: 通过JSVMP,性能分析工具可以与JavaScript虚拟机交互,收集代码执行时的性能数据,如函数执行时间、内存占用情况等,以便进行性能优化。

  3. 监控: JSVMP还可以用于监控JavaScript应用程序的运行状态,例如监控内存使用情况、异常抛出情况等,以便及时发现和处理问题。

总的来说,JSVMP为开发人员和工具提供了一种标准的交互方式,使得他们可以更方便地对JavaScript应用程序进行调试、性能分析和监控。

1.抓包分析

通过抓包分析得到数据包为这个node

 观察载荷发现 search_id有点像逆向参数 但是请求几次发现 这是个随机值 直接写死就好

 观察请求头发现 三个参数需要加密,但是很明显x-t是个时间戳,再次经过测试发现,需要逆向的只有X-s一个值,观察X-s发现,他是由XYW_拼接上一个字符串成分的(根据逆向经验来说ey是{的base64编码),我们对其进行base64解码

发现payload就是我们要求的参数

 全局搜索x-b,发现生成的地方就是在中间的那个函数,至此,抓包分析已经结束

2.代码分析

(1)进入函数

发现这是一段完全看不懂的代码(所以现在放弃还来得及),这个便是vmp代码了(vmp上文已经介绍)。我们新添一个代码段,测试一下是不是加密值

 执行完结果就是xs 判断没错

3.插桩分析

问:什么是插桩?

在软件开发中,插桩(instrumentation)是指在程序的源代码或者目标代码中插入额外的代码,以便在程序执行时收集信息、监视程序行为或修改程序行为的过程。插桩通常是通过在程序的关键位置插入代码来实现的,这些位置可以是函数调用、循环开始或结束、变量赋值等。

插桩的主要目的包括但不限于:

  1. 性能分析: 插桩可以用于在程序执行时收集性能数据,例如函数执行时间、内存使用情况等,以便进行性能分析和优化。

  2. 调试: 插桩可以在程序执行时插入调试代码,以便在程序运行时进行调试操作,如打印调试信息、监视变量值等。

  3. 安全检查: 插桩可以用于在程序执行时插入安全检查代码,以检测潜在的安全漏洞或恶意行为。

  4. 动态分析: 插桩可以用于在程序执行时收集动态信息,如代码覆盖率、函数调用图等,以便进行动态分析和测试。

插桩通常是通过静态分析或动态分析技术实现的。静态插桩是在程序编译或加载时修改程序的源代码或目标代码,而动态插桩是在程序运行时通过代码注入等方式插入额外的代码。

那我们接下来要在哪个地方插桩呢 ?

那当然vmp的最小指令集进行,那我们先分析代码来找到他最小指令集的位置

 我们再进入_ace_1ae3c函数里面

 发现实际上最小指令是这个函数,那我们便在这个位置进行插装

插装代码如下

console.log(_ace_d656a)                 if(_ace_7e97a && _ace_7e97a[1]!='W' &&_ace_7e97a[1]!="implementation"){                     window.data+=_ace_7e97a.toString()+"\n";                     window.a=_ace_7e97a                 console.log(_ace_7e97a)                 }

打印插装结果

天纳!九十多万条数据(很有可能电脑卡死,我也是一把一把泪卡过来的),如果经常卡死的话可以把打印内容保存到文档里,现在我们就是要对这堆数据进行分析

4.算法分析

首先我們得明白我們在做什麽 我们得对参数进行分析

1.我们先搜索/api/sns/web/v1/search/notes,找到其最后一个位置

发现是url+载荷进行拼接 这个大数组要么是加密结果要么是加密方法里的数字 我们搜索发现搜索不到加密方式 那接着往下走

Tips:将其转成16进制更容易搜到

我们接着往下找发现

x1为32位的字符串(盲猜是md5加密)

x2这种格式的数据一般都是环境检测值 直接写死

x3发现来自cookie里的a1

x4时间戳

对刚才的url加上载荷进行md5加密

发现刚好匹配 所以以上猜测成立

再往下找数据

发现了这个数据,观察很像base64,我们对他进行解码发现

 就是对x1 x2 x3 x4进行base64

然后我们再往下找找到生成数据的地方,发现

在这里payload已经生成了,所以我们往前找

 发现这里有大数组,这里极有可能是加密方法里的参数,我们把他转成16进制再搜索

发现这大概率是一个des加密,那么我们此时此刻还差一个key key通常是16,32位的

 发现这个恰好是32位,那我们此时只要带入加密便可得知是不是正确的了

 至此,所有加密都已经找到

5.算法总结

x1=对url和载荷拼接后进行md5摘要

x2=环境 (可以写死x2=0|0|0|1|0|0|1|0|0|0|1|0|0|0|0)

x3=cookie里的a1

x4=时间戳

再获取payload=对x1到x4用;拼接起来进行base64编码 最后通过des生成

最后 payload带入{ "signSvn": "51", "signType": "x1", "appId": "xhs-pc-web", "signVersion": "1", "payload": payload }进行base64编码,再在开头加上XYW_

至此,逆向完成

6.效果演示

测试完成,逆向成功

补充

如果是在浏览器控制台进行算法分析会更容易看出各种加密方式,直接通过tostring保存到文档会有很多干扰,这里给出新的优化插装代码(前面也是忘了)

if (_ace_7e97a && _ace_7e97a[1] != 'W' && _ace_7e97a[1] != "implementation") {                     try {                         window.data += JSON.stringify(_ace_7e97a) + "\n";                         window.a = _ace_7e97a                         console.log(JSON.stringify(_ace_7e97a))                     } catch (e) {}                 }

这样子保存到文档会更加紧凑,还可以分段插桩也更容易看出,这里我就不再过多赘述,有不足的地方欢迎指针

需要源码主页私信我,有求必应

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!