【1.0】Js逆向补充之Js混淆

发布时间 2023-10-16 22:20:29作者: Chimengmeng

【一】什么是Js混淆

  • JavaScript 混淆是一种将 JavaScript 代码进行某种处理的方式,目的是使代码难以被阅读和理解。
    • why do that?
  • JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看
    • 如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制你的劳动成果
    • 所以可以做的就是让代码变得更加的难以阅读,他人难以复制你的成果,实现“加密”的目的。
  • 混淆的方法可以包括改变变量名、添加无意义的代码、删除空格和注释等。
    • 混淆后的代码仍然可以正常运行,但是对于未经授权的人来说难以理解和维护。

【二】Js混淆的几种方式

【1】变量重命名

  • 变量重命名是 JavaScript 代码混淆中最简单且最常用的方法之一。
  • 这种方法的基本思想是将所有可能包含敏感信息的变量重命名为无意义的字符串。
  • 例如,将 username 替换为 a,将 password 替换为 b
  • 将变量名替换为无意义的字符串或者短字符,使得人类阅读难度大大增加。

(1)没有代码混淆

var username = "user123";
var password = "pass456";
function login(user, pass) {  
	if (user === username && pass === password) {
  	console.log("Login successful!");  
  } else {    
    console.log("Login failed!");  
  }}
login(username, password);

(2)使用变量名混淆进行代码混淆

var a = "user123";
var b = "pass456";
function c(d, e) {  
	if (d === a && e === b) {    
    console.log("Login successful!");  
  } else {    
    console.log("Login failed!");  
  }}
c(a, b);

【2】函数名混淆

  • 函数名混淆是另一种常用的 JavaScript 代码混淆技术。
  • 它的基本思想是将所有函数名替换为随机的、无意义的字符串,从而使代码更难被理解和调试。

(1)没有代码混淆

function add(x, y) {  
  return x + y;
}
console.log(add(2, 3));

(2)使用函数名混淆进行代码混淆

var a = function(b, c) {  
  			return b + c;
			}
console.log(a(2, 3));
  • 这种本质还是和上面介绍的变量重命名一样。

【3】压缩代码

  • 压缩是另一种常见的JavaScript代码混淆技术。
  • 通过使用各种压缩算法,可以将JavaScript代码文件缩小到原始大小的一半以下。
  • 虽然这样的代码难以阅读,但对于需要快速加载和运行的Web应用程序来说非常有用。

(1)原始代码

function calculateSum(num1, num2) {  
	var sum = num1 + num2;  
  return sum;
}
var result = calculateSum(3, 4);
console.log(result);

(2)压缩代码

function calculateSum(a,b){return a+b}console.log(calculateSum(3,4));

【4】代码打乱 / JS 控制流混淆

  • JS 控制流混淆是一种消除JavaScript代码的可预测性的技术,通过使用控制流混淆算法,改变程序结构来防止代码被轻易地理解和分析的技术。
  • 简单来说,就是通过修改代码中的控制流语句(如 if、while 等)的顺序、嵌套、去除等方式来增加代码的复杂性,从而使得代码难以被反编译、破解或者逆向工程攻击。

(1)原始代码

var a = 1;
var b = 0;

if (a === 1) {  
  	b = 3;  
  } else {  
  	b = 4;
  }

//结果:a=1,b=3
  • 这段代码可以通过控制流混淆的方式进行优化。
  • 例如,可以将 if 块内部的语句交错、嵌套,增加运算符的数量,达到混淆的效果

(2)控制流混淆

var a = 1;
var b = 0;
if (!(a !== 1)) {  
  if (!(![])) b = 3;
} else {  
  if (!(!{})) b = 4;
}
//结果:a=1,b=3