AST混淆与解混淆笔记:数值常量加密

本文主要是作者记笔记为主,温故而知新,记录混淆和解混淆的代码
以以下代码为例:

function test(a, b){const c = "123";a = a + 1 // aa = a + 2a = a * 1234a = a.toString()a = a.substring(0, 3)b = a + "00"return b;
}
test(2)
console.log(test(1))

首先导入库

const fs = require('fs');
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const types = require("@babel/types");
const generator = require("@babel/generator").default;const jscode = fs.readFileSync("./test2.js", {encoding: "utf-8"
});
let ast = parser.parse(jscode);

将1,2,1234这些数值常量进行异或的方式进行加密,混淆代码如下:

const obnum = {NumberLiteral(path) {if (types.isNumericLiteral(path.node)) {let result = path.node.value ^ 0x3;path.replaceWith(types.binaryExpression('^', types.numericLiteral(result), types.numericLiteral(0x3)));}path.skip()}
}
traverse(ast, obnum)

混淆后的代码如下:

function test(a, b) {const c = "123";a = a + (2 ^ 3); // aa = a + (1 ^ 3);a = a * (1233 ^ 3);a = a.toString();a = a.substring(3 ^ 3, 0 ^ 3);b = a + "00";return b;
}
test(1 ^ 3);
console.log(test(2 ^ 3));

解混淆的ast代码如下:

// 混淆代码,将其中的数值常量进行异或混(解混淆)
const obnum = {BinaryExpression(path) {if (types.isBinaryExpression(path.node, {operator: '^'})) {// console.log(11)let left = path.node.left;let right = path.node.right;let result = left.value ^ right.value;path.replaceWith(types.numericLiteral(result));}}
}traverse(ast, obnum)

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

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

相关文章

android--RXJava+Retrofit封装使用

在欲望的城市里,你就是我最后的信仰。 目录 前言 一,方法封装 二,okhttpretrofitrxjava 实现网络请求 前言 关于RXJava的基本使用,请参考 文章android--RXJava详细使用篇-CSDN博客 下面我们讲一下RXJava在android中的相对比较…

[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

AIGC专题:生成式AI(GenAI)赋能供应链之路

今天分享的是AIGC系列深度研究报告:《AIGC专题:生成式AI(GenAI)赋能供应链之路》。 (报告出品方:Gartner) 报告共计:46页 什么是生成式人工智能 ChatGPT:一种OpenAI服…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”,这就是ABC输入法,点击上面的Delete按钮,删除整项ABC内容&#xff0c…

MySQL表的基本操作

目录 一、创建表的语法 二、表的物理存储类型 三、数据类型 3.1 文本类型类型: 3.2 数字类型: 3.3 时间\日期类型: 常用数据类型: 四、查看表 五、删除表 六、修改表的结构 八、数据库字典 九、表的约束 9.1 五类完整…

Unity 常见的图像压缩格式优缺点

在Unity中,将图像压缩至更小的大小,既可以加快加载速度,也可以减少内存的占用。根据不同的目标平台,Unity提供了以下几种常见的图像压缩格式: 1. RGBA Compressed: 是一种通过压缩的方式来存储RGBA(红色、…

中国的茶文化:现代生活中的茶文化

中国的茶文化:现代生活中的茶文化 引言 在现代社会的快节奏生活中,茶文化并未随时间流逝而褪色,反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴,成为一种连接历史、人文与现代生活方式的艺术形式。本文…

Python算法题集_滑动窗口最大值

本文为Python算法题集之一的代码示例 题目239:滑动窗口最大值 说明:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗…

DevExpress WinForms中文教程 - 如何创建可访问的WinForms应用?(一)

为用户创建易访问的Windows Forms应用程序不仅是最佳实践的体现,还是对包容性和以用户为中心的设计承诺。在应用程序开发生命周期的早期考虑与可访问性相关的需求可以节省长期运行的时间(因为它将决定设计决策和代码实现)。 一个可访问的WinForms应用程序提供了各种…

【Python基础知识】(19)三种内置生成式

文章目录 一、列表生成式二 、字典生成式三、集合生成式 一、列表生成式 # 1. 列表生成式,语法:[被追加的数据 循环语句 循环或者判断语句] lst2 [i * 10 for i in range(10, 20)] print(lst2) # 输出:[100, 110, 120, 130, 140, 150, 160…

Python中类的相关术语(附带案例)

目录 1、面向对象 2、类 3、实例 4、初始化方法 5、魔法方法 6、字符串方法 7、self 8、数据、属性、操作、行为 9、父类、基类、超类 or 子类、派生类 10、多态 11、重载多态 and 重写多态 12、名称解释 1、面向对象 在Python中,面向对象编程&…

Qt关于qss文件的添加使用

把ui设计得更加的养眼,肯定需要对控件的属性进行设置,qt中就是关于qss文件的使用。 那么如何创建和添加qss文件呢 1.新建一个文本文件的txt 2.将文本文件的后缀改为qss(类比html) 3.放置到项目的资源文件夹下 4.添加资源文件 5.在…

代码随想录算法训练营第二二天| 二叉搜索树的最近公共祖先、二叉搜索树中的插入操作、删除二叉搜索树中的节点

目录 二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点普通二叉树的删除方式 LeetCode 235. 二叉搜索树的最近公共祖先 LeetCode 701.二叉搜索树中的插入操作 LeetCode 450.删除二叉搜索树中的节点 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到…

windows安装oracle之后怎么连接使用

目录 1.打开SQl Developer 2.选择JDK 3.登录 4.创建表空间,用户 安装oracle的详细教程 WINDOWS安装Oracle11.2.0.4-CSDN博客 1.打开SQl Developer 找到 SQl Developer 2.选择JDK 根据你安装的oracle版本,因为我的oracle是安装的32位的,所以这里jdk也要选择32位 选择到ja…

1.迭代与递归 - JS

迭代与递归是函数进阶的第一个门槛。迭代就是对已知变量反复赋值变换;递归就是函数体内调用自身。 迭代 一个迭代是就是一个循环,根据迭代式对变量反复赋值。 求近似根(切线法); 迭代描述: x 0 x_0 x0…

Docker核心教程

1. 概述 官网:https://docs.docker.com/ Docker Hub 网站:https://hub.docker.com/ 容器较为官方的解释: 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立…

Threejs API——`OrbitControls`相机控件

文章目录 API用法API OrbitControls 相机控制用法 导入import {OrbitControls } from three/examples/jsm/controls/OrbitControls.js import {DRACOLoader,AmbientLight,Color,MOUSE,

Java项目要不要部署在Docker里?

部署Java项目有很多种方式,传统的方式是直接在物理机或虚拟机上部署应用,但为什么现在容器化部署变得越来越流行, 个人觉得原因有以下几个: 1、 环境一致性:使用Docker可以确保开发、测试和生产环境的一致性&#xff…

传感器类总结(一)MPU9250 3-2程序关于IIC的底层程序

关于IIC的逻辑和底层协议可以看之前总结的 #IIC 通信协议 1、读写数据 1.1、写数据 发送N个字节程序的流程: 1、发送起始信号 2、发送从机地址和写 3、等待从机发回应答信号 4、发送第一字节数据 等待应答 5、发送下一字节数据 等带应答或非应答信号 6、发送停止信号停止发送…

D365:Debug

文章目录 前言一、附加进程二、选择进程三、DebugDebug进ApplicationSuite文件方法一方法二 前言 使用 Visual Studio 调试 D365 一、附加进程 点击路径 Debug > Attach to Process 二、选择进程 勾选下面的Show processes from all users,选择w3wp.exe,点击At…