JS逆向爬虫
JS混淆
1. 何为 JS 混淆
JavaScript 混淆是一种将 JavaScript 代码进行某种处理的方式,目的是使代码难以被阅读和理解。why do that?
JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看,如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制你的劳动成果,所以可以做的就是让代码变得更加的难以阅读,他人难以复制你的成果,实现“加密”的目的。
混淆的方法可以包括改变变量名、添加无意义的代码、删除空格和注释等。混淆后的代码仍然可以正常运行,但是对于未经授权的人来说难以理解和维护。
变量重命名
变量重命名是 JavaScript 代码混淆中最简单且最常用的方法之一。这种方法的基本思想是将所有可能包含敏感信息的变量重命名为无意义的字符串。例如,将 username
替换为 a
,将 password
替换为 b
。将变量名替换为无意义的字符串或者短字符,使得人类阅读难度大大增加。例如:
// 没有代码混淆
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);
// 使用变量名混淆进行代码混淆
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);
函数名混淆
函数名混淆是另一种常用的 JavaScript 代码混淆技术。它的基本思想是将所有函数名替换为随机的、无意义的字符串,从而使代码更难被理解和调试。
// 没有代码混淆
function add(x, y) {
return x + y;
}
console.log(add(2, 3));
// 使用函数名混淆进行代码混淆
var a = function(b, c) {
return b + c;
}
console.log(a(2, 3));
//这种本质还是和上面介绍的变量重命名一样。
压缩代码
压缩是另一种常见的JavaScript代码混淆技术。通过使用各种压缩算法,可以将JavaScript代码文件缩小到原始大小的一半以下。虽然这样的代码难以阅读,但对于需要快速加载和运行的Web应用程序来说非常有用。例如:
//原始代码
function calculateSum(num1, num2) {
var sum = num1 + num2;
return sum;
}
var result = calculateSum(3, 4);
console.log(result);
//压缩代码
function calculateSum(a,b){
return a+b}console.log(calculateSum(3,4));
代码打乱 / JS 控制流混淆
JS 控制流混淆是一种消除JavaScript代码的可预测性的技术,通过使用控制流混淆算法,改变程序结构来防止代码被轻易地理解和分析的技术。简单来说,就是通过修改代码中的控制流语句(如 if、while 等)的顺序、嵌套、去除等方式来增加代码的复杂性,从而使得代码难以被反编译、破解或者逆向工程攻击。以下是一个简短的示例:
var a = 1;
var b = 0;
if (a === 1) {
b = 3;
} else {
b = 4;
}
//结果:a=1,b=3
这段代码可以通过控制流混淆的方式进行优化。例如,可以将 if
块内部的语句交错、嵌套,增加运算符的数量,达到混淆的效果:
var a = 1;
var b = 0;
if (!(a !== 1)) {
if (!(![])) b = 3;
} else {
if (!(!{
})) b = 4;
}
// 结果:a=1,b=3
2. OB混淆
OB 混淆是指将 JavaScript 代码中的变量名、函数名、字符串等替换为无意义的字符串,从而增加代码的保护性和防止代码的逆向分析。此外,它还可以在代码中添加死代码、无用的函数等,增加代码的复杂度和难以理解性,从而增加代码的保密性。
官网:https://obfuscator.io/
将进行OB混淆的代码进行JS代码格式化
JS代码格式化:https://www.qianbo.com.cn/Tool/Beautify/Js-Formatter.html
var _0x30bb = ['log', 'Hello\x20World!']; //列表元素(被混淆的真实代码部分)也有可能会被base64等机制编码
//该函数是将_0x30bb列表进行了元素进行了移位,将列表变为了['Hello\x20World!','log']
(function (_0x38d89d, _0x30bbb2) {
var _0xae0a32 = function (_0x2e4e9d) {
while (--_0x2e4e9d) {
_0x38d89d['push'](_0x38d89d['shift']());
}
};
_0xae0a32(++_0x30bbb2);
}(_0x30bb, 0x153)); //在浏览器Console中加载执行该自运行函数后,打印_0x30bb列表查看移位结果
//该函数为解密函数(用来还原真实的代码)
var _0xae0a = function (_0x38d89d, _0x30bbb2) {
_0x38d89d = _0x38d89d - 0x0;
var _0xae0a32 = _0x30bb[_0x38d89d];
return _0xae0a32;
};
//ob混淆的js代码
function hi() {
console[_0xae0a('0x1')](_0xae0a('0x0')