已经把所有的侵权地方删除,望批准
前言
1.本文单纯学习jsvmp和交流,无任何其他意图
2.学习jsvmp,通过插桩和算法还原。
问:什么是vmp?
JSVMP(JavaScript Virtual Machine Protocol)是一种协议,用于在不同的JavaScript虚拟机(如V8、SpiderMonkey等)和调试器之间进行通信。它定义了一套标准的消息格式和通信规则,使得调试器可以与不同的JavaScript虚拟机进行交互,实现调试、监控和性能分析等功能。
JSVMP的作用包括但不限于:
调试: JSVMP允许调试器与JavaScript虚拟机进行通信,以便在代码执行过程中进行断点设置、变量查看、调用堆栈跟踪等调试操作。
性能分析: 通过JSVMP,性能分析工具可以与JavaScript虚拟机交互,收集代码执行时的性能数据,如函数执行时间、内存占用情况等,以便进行性能优化。
监控: 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)是指在程序的源代码或者目标代码中插入额外的代码,以便在程序执行时收集信息、监视程序行为或修改程序行为的过程。插桩通常是通过在程序的关键位置插入代码来实现的,这些位置可以是函数调用、循环开始或结束、变量赋值等。
插桩的主要目的包括但不限于:
性能分析: 插桩可以用于在程序执行时收集性能数据,例如函数执行时间、内存使用情况等,以便进行性能分析和优化。
调试: 插桩可以在程序执行时插入调试代码,以便在程序运行时进行调试操作,如打印调试信息、监视变量值等。
安全检查: 插桩可以用于在程序执行时插入安全检查代码,以检测潜在的安全漏洞或恶意行为。
动态分析: 插桩可以用于在程序执行时收集动态信息,如代码覆盖率、函数调用图等,以便进行动态分析和测试。
插桩通常是通过静态分析或动态分析技术实现的。静态插桩是在程序编译或加载时修改程序的源代码或目标代码,而动态插桩是在程序运行时通过代码注入等方式插入额外的代码。
那我们接下来要在哪个地方插桩呢 ?
那当然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) {} }
这样子保存到文档会更加紧凑,还可以分段插桩也更容易看出,这里我就不再过多赘述,有不足的地方欢迎指针
需要源码主页私信我,有求必应