JavaScript 代码混淆与反混淆技术详解

news2025/4/13 1:52:18

一、代码混淆:让别人看不懂你的代码

混淆技术就是一种“代码伪装术”,目的是让别人很难看懂你的代码逻辑,从而保护你的核心算法或敏感信息。

1. 变量名压缩

原理:把变量名改成乱码,比如把calculatePrice改成a,把quantity改成b效果:别人看到代码时,完全不知道这些变量代表什么,逻辑变得难以追踪。

示例

// 混淆前
function calculatePrice(quantity, unitPrice) {
    return quantity * unitPrice;
}

// 混淆后
function a(b, c) {
    return b * c;
}
2. 控制流扁平化

原理:把代码逻辑打乱,像迷宫一样绕来绕去,别人很难看出原始逻辑。 效果:别人静态分析代码时,完全看不懂执行顺序,必须运行代码才能理解。

示例

// 混淆前(简单循环)
function sum(n) {
    let total = 0;
    for (let i = 0; i < n; i++) {
        total += i;
    }
    return total;
}

// 混淆后(逻辑被打乱)
function sum(n) {
    let state = 0, total = 0, i = 0;
    while (true) {
        switch (state) {
            case 0: state = 1; break;
            case 1: if (i < n) { state = 2; } else { state = 3; } break;
            case 2: total += i; i++; state = 1; break;
            case 3: return total;
        }
    }
}
3. 字符串编码

原理:把敏感信息(比如API密钥)加密存储,运行时再动态解密。 效果:别人直接看代码时,完全看不到敏感信息,必须运行代码才能看到解密后的内容。

示例

// 混淆前
console.log("API Key: 12345");

// 混淆后(加密存储)
const _0x5c0d = ["log", "API\x20Key:\x2012345"];
function _0x28e8(key) {
    return _0x5c0d[parseInt(key, 16)];
}
console[_0x28e8("0x0")](_0x28e8("0x1"));

二、反混淆:破解混淆代码

反混淆就是“拆伪装”,目的是让混淆后的代码恢复可读性。

1. 静态分析

正则替换:用工具提取加密的字符串,替换回原始内容。 AST解析:通过代码结构分析,还原被扁平化的逻辑。

2. 动态调试

Chrome DevTools:通过断点调试,观察变量值和执行流程。 Hook函数:劫持关键函数(比如eval),捕获动态解密后的代码。

3. 自动化工具

JSNice:用AI推测变量名,生成更易读的代码。 Babel插件:通过规则还原控制流。

三、工具推荐

混淆工具
  1. javascript-obfuscator:支持字符串加密和控制流扁平化

    npm install javascript-obfuscator
    javascript-obfuscator input.js --output output.js
  2. Terser:压缩代码,同时混淆变量名

    terser input.js -o output.js -m -c
反混淆工具
  1. js-beautify:格式化压缩代码,恢复缩进

    js-beautify input.js -o output.js
  2. AST Explorer:可视化分析代码结构,辅助还原逻辑。

四、攻防博弈

对抗案例

  • 如果混淆代码用eval动态执行,可以通过Hookeval捕获明文逻辑。

  • 防御建议:组合多种混淆技术(比如控制流扁平化 + 字符串加密),并加入反调试代码。

反调试示例

setInterval(() => {
  if (typeof console._commandLineAPI !== 'undefined') {
    window.location.reload(); // 发现调试就刷新页面
  }
}, 1000);

五、总结与建议

  • 适用场景:保护核心算法(比如加密逻辑)、防止代码被抄袭。

  • 性能权衡:控制流扁平化可能让代码运行效率下降10%-20%。

  • 最佳实践

    • 用工具链(比如Webpack + Terser)自动化混淆。

    • 混淆前后务必测试功能是否正常。

    • 避免过度混淆,否则自己维护代码也会很麻烦。

总之,代码混淆是一种有效的保护手段,但不是万能的。建议结合服务端校验、代码签名等多层防护,才能更安全!

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

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

相关文章

Git开发

目录 Linux下Git安装Git基本指令分支管理远程仓库与本地仓库标签管理多人协作同一分支下不同分支下 企业级开发模型 -- git flow 模型 在现实中&#xff0c;当我们完成一个文档的初稿后&#xff0c;后面可能还需要对初稿进行反复修改&#xff0c;从而形成不同版本的文档。显然&…

verilog有符号数的乘法

无符号整数的乘法 1、单周期乘法器&#xff08; 无符号整数 &#xff09; 对于低速要求的乘法器&#xff0c;可以简单的使用 * 实现。 module Mult(input wire [7:0] multiplicand ,input wire [7:0] multipliter ,output wire [7:0] product);as…

DevDocs:抓取并整理技术文档的MCP服务

GitHub&#xff1a;https://github.com/cyberagiinc/DevDocs 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI DevDocs 是一个完全免费的开源工具&#xff0c;由 CyberAGI 团队开发&#xff0c;托管在 GitHub 上。它专为程序员和软件开发…

第十四届蓝桥杯大赛软件赛国赛Python大学B组题解

文章目录 弹珠堆放划分偶串交易账本背包问题翻转最大阶梯最长回文前后缀贸易航线困局 弹珠堆放 递推式 a i a i − 1 i a_ia_{i-1}i ai​ai−1​i&#xff0c; n 20230610 n20230610 n20230610非常小&#xff0c;直接模拟 答案等于 494 494 494 划分 因为总和为 1 e 6 1e6…

折叠屏手机:技术进步了,柔性OLED面板测试技术需求跟上了吗?

全球智能手机市场陷入创新焦虑&#xff0c;折叠屏手机被寄予厚望&#xff0c;2023 年出货量同比增长 62%。但在供应链技术狂欢背后&#xff0c;存在诸多问题。消费端数据显示&#xff0c;用户使用频率低&#xff0c;定价策略反常。产业链重构虽让部分企业获利&#xff0c;却推高…

30天学Java第九天——线程

并行与并发的区别 并行是多核 CPU 上的多任务处理&#xff0c;多个任务在同一时间真正的同时执行并发是单核 CPU 上的多任务处理&#xff0c;多个任务在同一时间段内交替执行&#xff0c;通过时间片轮转实现交替执行&#xff0c;用于解决 IO 密集型任务的瓶颈 线程的创建方式…

自行搭建一个Git仓库托管平台

1.安装Git sudo apt install git 2.Git本地仓库创建&#xff08;自己选择一个文件夹&#xff09; git init 这里我在 /home/test 下面初始化了代码仓库 1. 首先在仓库中新建一个txt文件&#xff0c;并输入一些内容 2. 将文件添加到仓库 git add test.txt 执行之后没有任何输…

LeeCode 409.最长回文串

给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解释: 我们可以构造的…

【前端分享】JavaScript异步编程详解!

JavaScript 的异步编程是其核心特性之一&#xff0c;主要用于处理非阻塞操作&#xff08;如网络请求、文件读写、定时任务等&#xff09;。由于 JavaScript 是单线程的&#xff0c;异步机制可以避免代码阻塞&#xff0c;提高性能和用户体验。以下是 JavaScript 异步编程的核心概…

工厂模式(简单工厂,工厂方法,抽象工厂)

工厂模式 工厂模式是java中最常用的设计模式&#xff0c;主要是用来完成对象的创建&#xff0c;使得对象创建过程和对象使用过程分离。 简单来说是取消对象创建者和使用者的耦合&#xff0c;简化new 对象的创建。 优势 &#xff1a;对象的属性创建完整。 缺点&#xff1a; 创建…

Axure RP9教程 【数据传输】(页面值传递)| 作用域 :全局变量、局部变量

文章目录 引言作用域:全局变量作用域>局部变量作用域I 基于全局变量实现一个简单的登陆操作设置变量值的交互动作打开链接的交互动作接收并显示变量值注意点see also共享原型引言 全局变量在交互效果作用是页面值传递 作用域:全局变量作用域>局部变量作用域 全局变量…

IBM Rational Software Architect安装感受及使用初体验

1 安装感受 最近准备用UML 2.0绘制模型图。在读UML创始人之一Grady Booch写的书《Object-Oriented Analysis and Design with Applications》&#xff08;第3版&#xff09;1时&#xff0c;发现书中用的UML工具之一为IBM Rational Software Architect&#xff08;RSA&#xff…

VRRP学习

虚拟路由器冗余技术【三层技术】&#xff1a;网关冗余VRRP设计了VRRP组的概念&#xff0c;在一个 VRRP 组中&#xff0c;多台路由器共同构成一个虚拟路由器。这个虚拟路由器拥有一个虚拟 IP 地址【VRRP-ID默认是8位二进制&#xff0c;范围是0~255&#xff0c;用以标识和区别不同…

GPT-5、o3和o4-mini即将到来

原计划有所变更: 关于我们应有何期待的一些零散想法。 深度研究(Deep Research)确实强大但成本高昂且速度较慢(当前使用o3模型)。即将推出的o4-mini在性能上可能与o3相近,但将突破这些限制,让全球用户——甚至免费用户(尽管会有速率限制)——都能用上世界顶级AI研究助…

C#MVC项目引用Swagger的详细步骤

目录 一、安装Swagger依赖包二、配置Swagger服务三、启用XML注释四、调整启动配置五、验证与访问常见问题解决 以下是基于ASP.NET Core项目集成Swagger的详细步骤&#xff08;已适配当前项目结构&#xff09;&#xff1a; 一、安装Swagger依赖包 通过NuGet安装 右键点击项目…

golang 对象池sync.Pool

Golang中的sync.Pool是什么&#xff1f; sync.Pool 是 Go 标准库中提供的一个对象池&#xff08;Object Pool&#xff09;实现&#xff0c;用于缓存和复用临时对象&#xff0c;以减少内存分配和垃圾回收&#xff08;GC&#xff09;的压力。它的主要特点是&#xff1a; 临时对…

聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?

【全球云观察 &#xff5c; 科技热点关注】 随着近年来AI与大模型的兴起&#xff0c;云计算行业正在发生着一场大变局。 “在2025年春节期间&#xff0c;DeepSeek两周火爆全球&#xff0c;如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出&#xff0c;AI与…

解决前后端时区不一致问题

前后端时区不一致导致&#xff1a; 》数据不显示在前端 》页面显示时间有误 》一些对时间有要求的方法&#xff0c;无法正确执行&#xff0c;出现null值&#xff0c;加上我们对null值有判断/注解&#xff0c;程序就会报错中断&#xff0c;以为是业务逻辑问题&#xff0c;其实…

STL之序列式容器(Vector/Deque/List)

序列式容器 序列式容器包括&#xff1a;静态数组 array 、动态数组 vector 、双端队列 deque 、单链表 forward_ list 、双链表 list 。这五个容器中&#xff0c;我们需要讲解三个 vector 、 deque 、 list 的使 用&#xff0c;包括&#xff1a;初始化、遍历、尾部插入与删除、…

小试牛刀-抽奖程序

编写抽奖程序 需求&#xff1a;设计一个抽奖程序&#xff0c;点击抽奖按钮随机抽取一个名字作为中奖者 目标&#xff1a;了解项目结构&#xff0c;简单UI布局&#xff0c;属性方法、事件方法&#xff0c;程序运行及调试 界面原型 ​ 待抽奖&#xff1a; 点击抽奖按钮&#x…