1.初始JSVMP
JSVMP是"JavaScript Virtual Machine Protection"的缩写,是一种前端代码虚拟化保护技术。它的核心思想是在JavaScript代码保护过程中引入代码虚拟化,将目标代码转换成自定义的字节码,这些字节码只有特殊的解释器才能识别,从而隐藏目标代码的关键逻辑。JSVMP的保护流程大致如下:服务器端读取JavaScript代码,进行词法分析、语法分析,生成AST语法树,然后生成私有指令,最后生成对应私有解释器,并将私有指令加密与私有解释器发送给浏览器。在执行时,一边解释一边执行。目前,JSVMP的逆向方法主要有三种:RPC远程调用、补环境、日志断点还原算
2.如何用jsvmp实现下面代码
console.log(2*5+8);
1.什么是栈
栈(stack)是一种类似数组的数据结构
栈的特点:
- 属于有序集合
- 遵从后进先出(LIFO)原则
- 最早进入栈中元素的位置叫做栈底,最后进入的叫做栈顶
- 新元素靠近栈顶,旧元素靠近栈底
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指针 +1
break;
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])
学习是漫长的事情,坚持一定很酷!