jsvmp逆向实战x-s、x-t算法还原

news2024/10/7 17:27:54

jsvmp逆向实战x-s、x-t算法还原

            • 什么是jsvmp
            • 定位关键点
            • log插桩
            • 日志分析
            • 代码还原

什么是jsvmp

jsvmp就是将js源代码首先编译为自定义的字节码,只有对应的解释器才能执行这种字节码,这是一种前端代码虚拟化保护技术。

整体架构流程是服务器端通过对JavaScript代码词法分析 -> 语法分析 -> 语法树->生成AST->生成私有指令->生成对应私有解释器,将私有指令加密与私有解释器发送给浏览器,就开始一边解释,一边执行。

这些都不重要,只要知道有这么个技术就行了。jsvmp有一个特性,加密结果是一个一个字符生成的,要想一个个生成肯定需要循环,那无非就是for循环或者while循环以及switch case。这一点至关重要,算法的分析还原就依赖这个特性。

定位关键点

全局搜索关键字“X-s”,定位到main.***.js,这个js文件中会有多处生成x-s的地方,全部打上断点,最终会定位到 c = (a || void 0 !== window._webmsxyw ? window._webmsxyw : sign)(u, i) || {};,只有这行代码被调用并且生成了x-s,其它的几处都是原来的老版本已经废弃了。
在这里插入图片描述

log插桩

在断点处单步调试就会进入到jsvmp,把这个js文件保存到本地并用v_jstools进行ast混淆解密,选择仅变量压缩,压缩变量后替换原来的代码。
在这里插入图片描述

在这里插入图片描述
还记得我前面说过的jsvmp的特性吗?如果你还记得那将会为你节省大量时间,这个时候如果去盲目的动态调试你就会进入一个迷宫永远走不出来,正确做法就是直接在js文件中寻找循环的位置。
在这里插入图片描述
144行到164行有两个while循环,在这两个循环里面添加日志点,144-150这个while循环会无限执行,32g内存都能撑爆,暂时不管这个循环,在161行位置插入日志"h:",JSON.stringify(h[0]),"C:",C,"H:",H,运行结果如下图。
在这里插入图片描述
分析日志可知,当C==781的时候x-s已经生成,但具体生成步骤日志里并没有,那就在160行插入条件断点C==780&&H[0]==31&&H[1]==3&&H[2]==83&&H[3]==1&&H[4]==0,并且把所有进行过运算的方法里都插入日志点,比如185行"%","左:",r(A, B),"右:",r(E, Q),203行"|","左:",r(A, B),"右:",r(E, Q)等,142行特别重要"h3:",JSON.stringify(h[0]),"A:",A,"B:",B,这个日志点一定要打上。
在这里插入图片描述日志点打好之后先停用断点,只保留160行的条件断点,然后继续执行,再次断在160行。
在这里插入图片描述
清空控制台日志信息,启用所有断点(263行的断点停用,这个方法就是拼接字符串),继续执行代码,执行完毕后将日志保存到本地。
在这里插入图片描述

日志分析

notepad打开日志,拉到最底下,复制X-s前面一小部分,全局搜索,全词匹配,然后全部标记。
在这里插入图片描述
匹配结果
仔细观察下图中标红的位置,会发现明显规律,“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”是固定的,这个时候就可以大胆猜测了,它可能是调用了字符串的charAt方法,传入参数就是下方的数字,返回一个字符,然后依次将字符拼接。
在这里插入图片描述
控制台验证一下,果然如此。
在这里插入图片描述
接下来就得找出13、19、0、34这四个数字怎么来的,往上翻看日志,找到了可疑之处,这里出现了一些位移计算,也生成了上一步需要的数字。
在这里插入图片描述
控制台验证一下,经过反复验证得知,13 = 53 >> 2,19 =((53&3)<<4)|(48>>4),0 = ((48&15)<<2)|(34>>6),34 = 34&63,而且加粗的数字是固定的,那么下一步就是要确定53,48,34的生成逻辑。
在这里插入图片描述
接着往上翻看日志,又找到可疑之处,一个json字符串"{\"signSvn\":\"50\",\"signType\":\"x1\",\"appId\":\"xhs-pc-web\",\"signVersion\":\"1\",\"payload\":\"5c401130ca247f32ba75cbf05e0e58476fd112ed52f233f67fce4c61c5bc93dfc25b0c6065eda2f639a922d4481a611116e2e3bfb89e2da1dad61c5041d6ac2bdad61c5041d6ac2bba1c4fcc5520a3e3f9f6b953ff819f7c4d3964d610405efa8a7e6e067da7404c0381f161cf3a5952aefd4645c665dc827a83a6069b97009fd07c9b6d6913acbc9074093d7367e83ad4cdc39c2b950152b2ef9cd5fbe10084ffcb49de03a9400d0a36d7b01017de7dfffbe9b83b736a194ddc12db02f7193f\"}"
在这里插入图片描述
数字12、13、14有规律的增长,也生成了上一步需要的数字53,48,34,还有三字符’5’、‘0’,‘"’,这三个字符像是从json字符串里面取出来的,12、13、14分别是索引,然后调用’5’.charCodeAt(),‘0’.charCodeAt(),‘"’.charCodeAt()。控制台验证一下猜想,果然如此。
在这里插入图片描述

代码还原

经过上面几个步骤分析,大致生成逻辑已经捋清楚,除了json字符串里面的payload还没还原外,其它的步骤都已还原,并对比了浏览器和代码生成的结果,是一致的,完整代码如下,下一篇文章将分析payload的还原过程。


var str1 = "{\"signSvn\":\"50\",\"signType\":\"x1\",\"appId\":\"xhs-pc-web\",\"signVersion\":\"1\",\"payload\":\"16e0c0c108d9481f25fa55e5d0b68ca2a3754a5a6fd39af8945de60083f572f85fbf196a7df36325df512bc23f13ef9616e2e3bfb89e2da1dad61c5041d6ac2bdad61c5041d6ac2bba1c4fcc5520a3e3f9f6b953ff819f7c4d3964d610405efa8a7e6e067da7404c0381f161cf3a5952aefd4645c665dc827a83a6069b97009fd07c9b6d6913acbc9074093d7367e83ad4cdc39c2b950152b2ef9cd5fbe10084ffcb49de03a9400d0a36d7b01017de7daaeec9560d5a42f0e8cf56bde5e4d9b8\"}";
var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var data = "XYW_";
var arr1 = []
for (var i = 0; i < str1.length; i++){
    var code = str1[i].charCodeAt();
    arr1.push(code)
}
var arr3 = [];
for(var i = 0; i< arr1.length; i += 3){
    arr3.push(arr1.slice(i, i + 3));
}

for (var i = 0; i < arr3.length; i++){
    var arr = arr3[i];
    var arg1 = move_r(arr[0],2);
    var arg2 = move_l(arr[0]&3,4) | move_r(arr[1],4);
    var arg3 = move_l(arr[1]&15,2) | move_r(arr[2],6)
    get_data([arg1,arg2,arg3,arr[2]&63])

}

function move_r(l,r){
    return l >> r;
}

function move_l(l,r){
    return l << r;
}

function get_data(arr){
    for (var i = 0; i < arr.length; i++){
        var code = arr[i];
        var result = str2.charAt(code);
        data += result;
    }
}
console.log(data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sui基金会联合Tencent Cloud和Numen在香港举办的生态交流会圆满结束

5月24日&#xff0c;由Sui基金会、Tencent Cloud和Numen Cyber联合举办的Sui生态交流会在香港圆满结束。感谢Tencent Cloud为本次活动提供了场地支持。本次活动共吸引了60余名行业同仁线上和线下的参与。 本次活动旨在提升Web3产业对Sui生态的认识&#xff0c;并为生态中的开发…

调用华为API实现图像搜索

调用华为API实现图像搜索 1、作者介绍2、华为API介绍2.1 华为云图像搜索2.2 图像搜索应用场景2.2.1商品图片搜索2.2.2版权图片搜索 2.3 调用华为API实现图像标签 3、实验过程3.1完整代码3.2运行结果3.3常见错误 1、作者介绍 张勇进&#xff0c;男&#xff0c;西安工程大学电子…

通过Python的pdfplumber库将pdf转为图片

文章目录 前言一、pdfplumber库是什么&#xff1f;二、安装pdfplumber库三、查看pdfplumber库版本四、pdf素材五、将pdf转为图片1.引入库2.定义pdf路径3.打开PDF文件4.遍历每一页5.将PDF页面转换为Image对象6.将Image对象保存为图片文件7.效果 总结 前言 大家好&#xff0c;我是…

ChatGLM-6B之SSE通信(Server-sent Events)

写这篇博客还是很激动开心的&#xff0c;因为是我经过两周的时间&#xff0c;查阅各个地方的资料&#xff0c;经过不断的代码修改&#xff0c;不断的上传到有显卡的服务器运行才得出的可行的接口调用解决方案&#xff0c;在这里记录并分享一下。 研究历程&#xff08;只是感受&…

更适合iPhone的手柄,按键手感真不赖,LEADJOY M1B上手

很多朋友平时玩手游的时候&#xff0c;操作体验往往不是很好&#xff0c;特别是到了夏天&#xff0c;手机玩久了总是热气腾腾的&#xff0c;对此&#xff0c;只需要配上一副手游手柄&#xff0c;就可以获得媲美掌机的游戏体验。最近我就在用一款LEADJOY M1B游戏手柄&#xff0c…

如何选择语音芯片?主流语音方案如何选,九芯电子来推荐

市场分析 近年来&#xff0c;随着我国半导体的不断发展和技术领域的不断突破&#xff0c;语音芯片实现了越来越多的国产化。其中涌现出的像NVD系列、NRK330X系列等不乏国产优秀产品。凭借其优秀的性能、设计&#xff0c;赢得了市场上的好评如潮。 对比分析 OTP语音芯片&#…

webAPI学习笔记3——BOM浏览器对象模型

目录 1、BOM概述 1.1 什么是 BOM 1.2 BOM 的构成 2. window 对象的常见事件 2.1 窗口加载事件 2.2 调整窗口大小事件 3. 定时器 3.1 两种定时器 3.2 setTimeout() 定时器 案例&#xff1a; 5秒后自动关闭的广告 3.3 停止 setTimeout() 定时器 3.4 setInterval() 定时…

解决不联网环境pip安装librosa、numba、llvmlite报错和版本兼容问题

项目场景&#xff1a; 项目是需要在内网不联网环境部署GitHub上一个有关音频、视频处理的深度学习Python工程&#xff0c;因此许多包需要下载好wheel包或tar包后在内网环境安装。 这个过程遇到了许多兼容性问题引起的报错。Python版本与librosa、numba、llvmlite版本兼容问题…

小狗避障-第14届蓝桥杯省赛Scratch中级组真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第139讲。 小狗避障&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组编程第4题&#xf…

从代码审计的角度分析 Ruoyi v4.7.6 的任意文件下载漏洞

前言 Ruoyi 的 v4.7.6 是 2022 年 12 月 16 日发布的一个版本&#xff0c;而任意文件下载漏洞实际上 12 月底的时候就已经爆出了&#xff0c;也陆续有一些文章在写这个漏洞&#xff0c;但是 Ruoyi 一直没有更新修复。 上月中旬&#xff08;2023 年 5 月&#xff09;&#xff0c…

内网渗透(八十四)之ADCS配置启用基于SSL的LDAP(LDAPS)

ADCS配置启用基于SSL的LDAP(LDAPS) 打开AD CS,选择证书颁发机构 选择证书模板,右键管理 选择Kerberos身份验证,右键 复制模板 然后会有一个Kerberos身份验证的副本,右键更改名称,更改为LDAPS 选择LDAPS,右键属性 设置模板属性,请求处理——>允许导出私钥(O) 创建证书…

最快实现一个自己的扫地机

​ 作者&#xff1a;良知犹存 转载授权以及围观&#xff1a;欢迎关注微信公众号&#xff1a;羽林君 或者添加作者个人微信&#xff1a;become_me 扫地机介绍 扫地机器人行业本质是技术驱动型行业&#xff0c;产品围绕导航系统的升级成为行业发展的主旋律。按功能划分&a…

【武汉万象奥科】瑞芯微RK3568芯片

▎产品展示 RK3568核心板是基于Rockchip的RK3568设计的一款高性能核心板。该处理器集成了最新的高性能CPU、GPU&#xff0c;并拥有丰富的接口&#xff0c;非常适用于工业自动化控制、人机界面、中小型医疗分析器、电力等多种行业应用。 ▎RK3568产品特点 ▎高性能处理器 ○ 采用…

linuxOPS基础_vmware虚拟机安装及介绍

虚拟机概念 什么是虚拟机&#xff1f; 虚拟机&#xff0c;有些时候想模拟出一个真实的电脑环境&#xff0c;碍于使用真机安装代价太大&#xff0c;因此而诞生的一款可以模拟操作系统运行的软件。 虚拟机目前有2 个比较有名的产品&#xff1a;vmware 出品的vmware workstatio…

pix2pixHD---model---辨别器

搭建完生成器后搭建辨别器。 首先看辨别器的输入&#xff1a;分别是标签和生成器输出。 在训练时候&#xff0c;辨别器通道输入等于生成器的输出加上conditional即标签和实例的拼接。通道相加就是图片concat。 如果使用实例图片&#xff0c;那么辨别器输入通道数加1&#xff…

《Spring Guides系列学习》guide21 - guide25

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

这款高性价比商用笔记本值得入手

随话说&#xff1a;工欲善其事&#xff0c;必先利其器。 对于打工人的我来说&#xff0c;办公一定要有一款适合的笔记本&#xff0c;否则真的是事倍功半。近日入手了戴尔Latitude 3330这款笔记本&#xff0c;通过使用体验&#xff0c;感觉真是一款高性价比的笔记本了。 接下来…

分布式事务解决方案Seata 整合 Spring Cloud + Nacos

1. 简介 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 2. Docker 安装 Seata 2.1 下载镜像 docker pull seataio/se…

电子合同网页预览盖章效果实现

电子合同在现在应用越来越广&#xff0c;需求也就随之产生。 本篇文章主要记录两种网页盖章效果实现方式&#xff0c;自己记录一下&#xff0c; 也给需要的人提供一点思路和帮助。 效果 JqueryCSS实现 原理 通过定位盖章位置&#xff0c;之后操作图片悬浮到盖章位置 1.设置…

浙江大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 浙江大学&#xff08;A&#xff09;考研难度&#xff08;☆☆☆☆☆☆&#xff09; 浙江大学计算机科学与技术学院成立于1978年&#xff0c;始终秉承“人为本&#xff0c;和为贵&#xff0c;变则通”的文化理念&#…