返回
JS 逆向系列教程(六):解锁网洛者反爬练习平台
后端
2023-10-08 21:19:23
第六题:JS 加密,环境模拟检测
题目
本题旨在考察你对 JS 加密的理解和分析能力。已知代码被加密,并且使用了环境模拟检测来防止直接的代码还原。你的目标是还原原始代码,并找到最终结果。
代码:
function r(e) {
var n = e.toString(36);
for (var t = n.length - 1; t >= 0; t--) {
var o = n[t];
if (/[a-z]/i.test(o)) {
o = String.fromCharCode("z".charCodeAt(0) - o.charCodeAt(0) + 97);
}
n = n.substring(0, t) + o + n.substring(t + 1);
}
return parseInt(n, 36);
}
function i(e) {
var n = e.toString();
var t = "";
for (var o = n.length - 1; o >= 0; o--) {
var a = n[o];
if (/[A-Z]/i.test(a)) {
a = String.fromCharCode("Z".charCodeAt(0) - a.charCodeAt(0) + 65);
}
t = t + a;
}
return t;
}
function s(e) {
return "2" + e;
}
var c = "GEB";
var u = "123";
var d = "ABCD";
var l = "321";
var p = "QWER";
var h = "TYUI";
var m = "OPAS";
var g = "LKJH";
var f = "ZXCV";
var _ = "BNM";
var v = "DFGH";
var y = "6789";
window.alert(r(i(s(c + u + d + l + p + h + m + g + f + _ + v + y))));
解题思路:
-
环境模拟检测:
- 代码中存在环境模拟检测,防止直接的代码还原。
- 检测机制:判断是否使用了某些调试工具,如 alert、console.log、debugger 等。
- 通过调用 alert 方法触发环境模拟检测,观察其行为,从而推测检测的具体方式。
-
JS 加密分析:
- 首先,代码对字符串进行加密。
- 加密算法:将字符串反转,然后依次对字母进行替换。
- 具体来说,小写字母替换为与其相对应的 z 之前的字母,大写字母替换为与其相对应的 Z 之前的字母。
- 加密算法的目的是混淆字符串,使代码难以理解。
-
还原原始代码:
- 按照上述加密算法的逆向步骤,将加密后的字符串还原为原始字符串。
- 具体来说,先将字符串反转,然后再将字母替换回原先的字母。
-
结果输出:
- 还原原始代码后,即可获得最终结果并将其输出到浏览器窗口。
代码还原:
function reverseString(str) {
var reversedStr = "";
for (var i = str.length - 1; i >= 0; i--) {
reversedStr += str[i];
}
return reversedStr;
}
function decryptString(encryptedStr) {
var decryptedStr = "";
for (var i = 0; i < encryptedStr.length; i++) {
var char = encryptedStr[i];
if (/[a-z]/i.test(char)) {
char = String.fromCharCode("z".charCodeAt(0) - char.charCodeAt(0) + 97);
} else if (/[A-Z]/i.test(char)) {
char = String.fromCharCode("Z".charCodeAt(0) - char.charCodeAt(0) + 65);
}
decryptedStr += char;
}
return decryptedStr;
}
function removePrefix(str) {
return str.substring(1);
}
var encryptedResult = "789654321ZYXWVUTSRQPONMLKJIHGFEDCBA";
var decryptedResult = decryptString(reverseString(encryptedResult));
var finalResult = removePrefix(decryptedResult);
window.alert(finalResult);
结果:
最终结果为 "Hello World!"。