返回

JS 逆向系列教程(六):解锁网洛者反爬练习平台

后端

第六题: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))));

解题思路:

  1. 环境模拟检测:

    • 代码中存在环境模拟检测,防止直接的代码还原。
    • 检测机制:判断是否使用了某些调试工具,如 alert、console.log、debugger 等。
    • 通过调用 alert 方法触发环境模拟检测,观察其行为,从而推测检测的具体方式。
  2. JS 加密分析:

    • 首先,代码对字符串进行加密。
    • 加密算法:将字符串反转,然后依次对字母进行替换。
    • 具体来说,小写字母替换为与其相对应的 z 之前的字母,大写字母替换为与其相对应的 Z 之前的字母。
    • 加密算法的目的是混淆字符串,使代码难以理解。
  3. 还原原始代码:

    • 按照上述加密算法的逆向步骤,将加密后的字符串还原为原始字符串。
    • 具体来说,先将字符串反转,然后再将字母替换回原先的字母。
  4. 结果输出:

    • 还原原始代码后,即可获得最终结果并将其输出到浏览器窗口。

代码还原:

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!"。