AST还原技术专题:一键处理obfuscator混淆代码后的扫尾工作

使用obfuscator工具生成混淆代码

1.打开混淆工具的在线地址:

https://obfuscator.io/

  

2.代码混淆前如下,如图所示:

3.点击 Obfuscate 按钮,将示例代码进行混淆。

4.混淆后的代码保存,使用星球里的一键解混淆脚本进行还原。

5.还原后的代码大致如下,大家还原后的代码只是变量名不一样罢了:


   
  1. function hi() {
  2.   var _0x307455 = function () {
  3.     {
  4.       var _0x1e101d = true;
  5.       return function (_0x1cd74e, _0x16dad5) {
  6.         {
  7.           var _0x1250e0 = _0x1e101d ? function () {
  8.             {
  9.               if (_0x16dad5) {
  10.                 {
  11.                   var _0x44e987 = _0x16dad5["apply"](_0x1cd74e, arguments);
  12.                   _0x16dad5 = null;
  13.                   return _0x44e987;
  14.                 }
  15.               }
  16.             }
  17.           } : function () {};
  18.           _0x1e101d = false;
  19.           return _0x1250e0;
  20.         }
  21.       };
  22.     }
  23.   }(),
  24.       _0x304d95 = _0x307455(this, function () {
  25.     {
  26.       var _0x4a9a61 = function () {
  27.         {
  28.           var _0x527fd6 = _0x4a9a61["constructor"]("return /\" + this + \"/")()["constructor"]("^([^ ]+( +[^ ]+)+)+[^ ]}");
  29.           return !_0x527fd6["test"](_0x304d95);
  30.         }
  31.       };
  32.       return _0x4a9a61();
  33.     }
  34.   });
  35.   _0x304d95();
  36.   var _0x10ac23 = function () {
  37.     {
  38.       var _0x653565 = true;
  39.       return function (_0x1bdd5d, _0x5040c3) {
  40.         {
  41.           var _0x100ba7 = _0x653565 ? function () {
  42.             {
  43.               if (_0x5040c3) {
  44.                 {
  45.                   var _0x549fd3 = _0x5040c3["apply"](_0x1bdd5d, arguments);
  46.                   _0x5040c3 = null;
  47.                   return _0x549fd3;
  48.                 }
  49.               }
  50.             }
  51.           } : function () {};
  52.           _0x653565 = false;
  53.           return _0x100ba7;
  54.         }
  55.       };
  56.     }
  57.   }();
  58.   (function () {
  59.     _0x10ac23(this, function () {
  60.       {
  61.         var _0x26fc8f = new RegExp("function *\\( *\\)"),
  62.             _0xf7d7bc = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)"'i'),
  63.             _0x450156 = _0x4cd1ad("init");
  64.         if (!_0x26fc8f["test"](_0x450156 + "chain") || !_0xf7d7bc["test"](_0x450156 + "input")) {
  65.           _0x450156('0');
  66.         } else {
  67.           _0x4cd1ad();
  68.         }
  69.       }
  70.     })();
  71.   })();
  72.   var _0x217c41 = function () {
  73.     {
  74.       var _0x40159b = true;
  75.       return function (_0x5f416c, _0x233990) {
  76.         {
  77.           var _0x45c84c = _0x40159b ? function () {
  78.             {
  79.               if (_0x233990) {
  80.                 {
  81.                   var _0x1c4feb = _0x233990["apply"](_0x5f416c, arguments);
  82.                   _0x233990 = null;
  83.                   return _0x1c4feb;
  84.                 }
  85.               }
  86.             }
  87.           } : function () {};
  88.           _0x40159b = false;
  89.           return _0x45c84c;
  90.         }
  91.       };
  92.     }
  93.   }(),
  94.       _0x2f6a3f = _0x217c41(this, function () {
  95.     {
  96.       var _0x394d50 = function () {
  97.         {
  98.           var _0x4146cf;
  99.           try {
  100.             _0x4146cf = Function("return (function() " + "{}.constructor(\"return this\")( )" + ');')();
  101.           } catch (_0x1d99d4) {
  102.             _0x4146cf = window;
  103.           }
  104.           return _0x4146cf;
  105.         }
  106.       },
  107.           _0x4e041d = _0x394d50(),
  108.           _0x1590e0 = _0x4e041d["console"] = _0x4e041d["console"] || {},
  109.           _0x304c65 = ["log""warn""info""error""exception""table""trace"];
  110.       for (var _0x4bae25 = 0; _0x4bae25 < _0x304c65["length"]; _0x4bae25++) {
  111.         {
  112.           var _0x2196a9 = _0x217c41["constructor"]["prototype"]["bind"](_0x217c41);
  113.           var _0xed7fc7 = _0x304c65[_0x4bae25];
  114.           var _0x10e1d7 = _0x1590e0[_0xed7fc7] || _0x2196a9;
  115.           _0x2196a9["__proto__"] = _0x217c41["bind"](_0x217c41);
  116.           _0x2196a9["toString"] = _0x10e1d7["toString"]["bind"](_0x10e1d7);
  117.           _0x1590e0[_0xed7fc7] = _0x2196a9;
  118.         }
  119.       }
  120.     }
  121.   });
  122.   _0x2f6a3f();
  123.   console["log"]("Hello World!");
  124. }
  125. hi();
  126. function _0x4cd1ad(_0x497b07) {
  127.   function _0x17e787(_0x487201) {
  128.     if (typeof _0x487201 === "string") {
  129.       return function (_0xc22f0d) {}["constructor"]("while (true) {}")["apply"]("counter");
  130.     } else {
  131.       if (('' + _0x487201 / _0x487201)["length"] !== 1 || _0x487201 % 20 === 0) {
  132.         (function () {
  133.           return true;
  134.         })["constructor"]("debu" + "gger")["call"]("action");
  135.       } else {
  136.         (function () {
  137.           return false;
  138.         })["constructor"]("debu" + "gger")["apply"]("stateObject");
  139.       }
  140.     }
  141.     _0x17e787(++_0x487201);
  142.   }
  143.   try {
  144.     if (_0x497b07) return _0x17e787;else _0x17e787(0);
  145.   } catch (_0x1c05f1) {}
  146. }
  147. setInterval(function () {
  148.   _0x4cd1ad();
  149. }, 4000);

代码分析

代码很长,但是不要慌,稍微有点耐心即可。下面来逐步分析:

  1. 定义了一个 hi 函数,无实参,无返回值。

  2. 调用了上面定义的 hi 函数。

  3. 定义了一个 _0x4cd1ad 函数,有实参,有返回值

  4. 使用 setInterval 函数定时执行 上面定义的 _0x4cd1ad 函数

从前往后开始分析,第一步,先来看看这个 hi 函数:

  1. 无形式参数,无返回值

  2. 函数里面又定义了一堆函数,如 _0x307455、_0x304d95...等

  3. 有些是自执行函数,有些则是定义后马上就调用了,只调用了一次

  4. console["log"]("Hello World!"); 这是函数的最后一行代码

在星球里曾多次强调,一个函数,主要关注它

  1. 有没有改变实参

  2. 有没有改变全局变量

  3. 有没有返回值

经过仔细分析后可以发现, _0x307455、_0x304d95...这样的函数啥也没改变,纯粹是增加代码复杂度和阻碍调试或者禁用console的一些功能,那和功能代码没半毛钱关系,因此,可以统统删除。hi 函数化简后就只剩这样了:


   
  1. function hi() {
  2.   console["log"]("Hello World!");
  3. }
  4. hi();

这样看着就清爽多了哇。

同理,_0x4cd1ad 函数是一个 debugger相关的函数,也是阻碍调试的,与加密无关,也可以进行删,后面的定时执行 一并删除。

到此,整个混淆代码处理后,真正有效的代码就只有这样了:


   
  1. function hi() {
  2.   console["log"]("Hello World!");
  3. }
  4. hi();

与混淆前的代码一模一样,做到了 100 % 的还原。

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/114994546

(完)