当前位置: 首页 > news >正文

初始JSVMP

1.初始JSVMP

JSVMP是"JavaScript Virtual Machine Protection"的缩写,是一种前端代码虚拟化保护技术。它的核心思想是在JavaScript代码保护过程中引入代码虚拟化,将目标代码转换成自定义的字节码,这些字节码只有特殊的解释器才能识别,从而隐藏目标代码的关键逻辑。JSVMP的保护流程大致如下:服务器端读取JavaScript代码,进行词法分析、语法分析,生成AST语法树,然后生成私有指令,最后生成对应私有解释器,并将私有指令加密与私有解释器发送给浏览器。在执行时,一边解释一边执行。目前,JSVMP的逆向方法主要有三种:RPC远程调用、补环境、日志断点还原算

2.如何用jsvmp实现下面代码

console.log(2*5+8);

1.什么是栈

栈(stack)是一种类似数组的数据结构
栈的特点:

  1. 属于有序集合
  2. 遵从后进先出(LIFO)原则
  3. 最早进入栈中元素的位置叫做栈底,最后进入的叫做栈顶
  4. 新元素靠近栈顶,旧元素靠近栈底

2.实现过程

1.先计算 2* 5 =10

2.在计算 10 + 8 = 18;
3.console.log(18); //打印栈顶元素即可

3.设计指令

入栈操作 push 指令为 1
操作运算符 op * 指令为 2
操作运算符 op + 指令为 3
函数调用 console.log 指令为 4

2.手动生成指令集

第一步 2 和 5 分别入栈
入栈指令为1

1 2 1 5

第二步,需要用到 op *,因此,这里需要 指令 2

1 2 1 5 2

第三步 8入栈

1 2 1 5 2 1 8

第四步 需要用到 op +,因此,这里需要 指令 3

1 2 1 5 2 1 8 3

第五步 调用打印函数

1 2 1 5 2 1 8 3 4

function vmFunc(instList)
{function vm(pc,stack){stack = stack || [];let left,right,top;console.log(instList[9])while(1){let inst = instList[pc++]; //元素已取完,退出循环if(inst == undefined){break;}switch(inst){case 1:stack.push(instList[pc++]); //入栈,pc指针 +1break;case 2://操作运算符 op  *right = stack.pop();left  = stack.pop();stack.push(left * right);break;case 3://操作运算符 op  +right = stack.pop();left  = stack.pop();stack.push(left + right);break;                   case 4://函数调用 console.log top = stack.pop();console.log(top);break;default:throw {};}}}vm(0);
}vmFunc([1,2,1,5,2,1,8,3,4])

学习是漫长的事情,坚持一定很酷!

http://www.lryc.cn/news/347199.html

相关文章:

  • 【机器学习数据可视化-04】Pyecharts数据可视化宝典
  • 通过 Java 操作 redis -- zset 有序集合基本命令
  • 力扣 516. 最长回文子序列 python AC
  • 数据库编程
  • (docker)进入容器后如何使用本机gpu
  • java基础知识点总结2024版(8万字超详细整理)
  • vue中使用element的i18n语言转换(保姆式教程-保证能用)
  • 01 设计模式--单例模式
  • css backdrop-filter 实现背景滤镜
  • AR人脸道具SDK解决方案,实现道具与人脸的自然融合
  • Windows安装RabbitMQ教程(附安装包)
  • 这个问题无人能解,菜鸟勿进
  • 揭秘高效引流获客的艺术:转化技巧大公开
  • 【Unity 鼠标输入检测】
  • LeetCode hot100-33-Y
  • C++和Python通信引文道路社评电商大规模行为图结构数据模型
  • 单片机-点亮第一盏灯
  • C++组合类
  • Linux学习笔记3
  • 免费证件照一键换底色
  • 使用 FFmpeg 从音视频中提取音频
  • GraphQL在现代Web应用中的应用与优势
  • socket编程 学习笔记 理解
  • SC-Lego-LOAM建图与ndt_localization的实车实现
  • vs code中如何使用git
  • Vue项目中如何通过配置修改项目名称
  • ThinkPHP5.1 创建控制器类
  • 完全背包问题(c++)
  • 综合性练习(验证码案例)
  • 实用的Chrome命令 帮你打开Chrome浏览器的隐藏功能