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

举报
悦来客栈的老板 发表于 2021/03/21 01:09:05 2021/03/21
【摘要】 使用obfuscator工具生成混淆代码 1.打开混淆工具的在线地址: https://obfuscator.io/ 2.代码混淆前如下,如图所示: 3.点击 Obfuscate 按钮,将示例代码进行混淆。 4.混淆后的代码保存,使用星球里的一键解混淆脚本进行还原。 5.还原后的代码大致如下,大家还原后的代码只是变量名不一样罢了: function&...

使用obfuscator工具生成混淆代码

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

https://obfuscator.io/

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

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

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

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

function hi() {
  var _0x307455 = function () {
    {
      var _0x1e101d = true;
      return function (_0x1cd74e, _0x16dad5) {
        {
          var _0x1250e0 = _0x1e101d ? function () {
            {
              if (_0x16dad5) {
                {
                  var _0x44e987 = _0x16dad5["apply"](_0x1cd74e, arguments);

                  _0x16dad5 = null;
                  return _0x44e987;
                }
              }
            }
          } : function () {};

          _0x1e101d = false;
          return _0x1250e0;
        }
      };
    }
  }(),
      _0x304d95 = _0x307455(this, function () {
    {
      var _0x4a9a61 = function () {
        {
          var _0x527fd6 = _0x4a9a61["constructor"]("return /\" + this + \"/")()["constructor"]("^([^ ]+( +[^ ]+)+)+[^ ]}");

          return !_0x527fd6["test"](_0x304d95);
        }
      };

      return _0x4a9a61();
    }
  });

  _0x304d95();

  var _0x10ac23 = function () {
    {
      var _0x653565 = true;
      return function (_0x1bdd5d, _0x5040c3) {
        {
          var _0x100ba7 = _0x653565 ? function () {
            {
              if (_0x5040c3) {
                {
                  var _0x549fd3 = _0x5040c3["apply"](_0x1bdd5d, arguments);

                  _0x5040c3 = null;
                  return _0x549fd3;
                }
              }
            }
          } : function () {};

          _0x653565 = false;
          return _0x100ba7;
        }
      };
    }
  }();

  (function () {
    _0x10ac23(this, function () {
      {
        var _0x26fc8f = new RegExp("function *\\( *\\)"),
            _0xf7d7bc = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", 'i'),
            _0x450156 = _0x4cd1ad("init");

        if (!_0x26fc8f["test"](_0x450156 + "chain") || !_0xf7d7bc["test"](_0x450156 + "input")) {
          _0x450156('0');
        } else {
          _0x4cd1ad();
        }
      }
    })();
  })();

  var _0x217c41 = function () {
    {
      var _0x40159b = true;
      return function (_0x5f416c, _0x233990) {
        {
          var _0x45c84c = _0x40159b ? function () {
            {
              if (_0x233990) {
                {
                  var _0x1c4feb = _0x233990["apply"](_0x5f416c, arguments);

                  _0x233990 = null;
                  return _0x1c4feb;
                }
              }
            }
          } : function () {};

          _0x40159b = false;
          return _0x45c84c;
        }
      };
    }
  }(),
      _0x2f6a3f = _0x217c41(this, function () {
    {
      var _0x394d50 = function () {
        {
          var _0x4146cf;

          try {
            _0x4146cf = Function("return (function() " + "{}.constructor(\"return this\")( )" + ');')();
          } catch (_0x1d99d4) {
            _0x4146cf = window;
          }

          return _0x4146cf;
        }
      },
          _0x4e041d = _0x394d50(),
          _0x1590e0 = _0x4e041d["console"] = _0x4e041d["console"] || {},
          _0x304c65 = ["log", "warn", "info", "error", "exception", "table", "trace"];

      for (var _0x4bae25 = 0; _0x4bae25 < _0x304c65["length"]; _0x4bae25++) {
        {
          var _0x2196a9 = _0x217c41["constructor"]["prototype"]["bind"](_0x217c41);

          var _0xed7fc7 = _0x304c65[_0x4bae25];

          var _0x10e1d7 = _0x1590e0[_0xed7fc7] || _0x2196a9;

          _0x2196a9["__proto__"] = _0x217c41["bind"](_0x217c41);
          _0x2196a9["toString"] = _0x10e1d7["toString"]["bind"](_0x10e1d7);
          _0x1590e0[_0xed7fc7] = _0x2196a9;
        }
      }
    }
  });

  _0x2f6a3f();

  console["log"]("Hello World!");
}

hi();

function _0x4cd1ad(_0x497b07) {
  function _0x17e787(_0x487201) {
    if (typeof _0x487201 === "string") {
      return function (_0xc22f0d) {}["constructor"]("while (true) {}")["apply"]("counter");
    } else {
      if (('' + _0x487201 / _0x487201)["length"] !== 1 || _0x487201 % 20 === 0) {
        (function () {
          return true;
        })["constructor"]("debu" + "gger")["call"]("action");
      } else {
        (function () {
          return false;
        })["constructor"]("debu" + "gger")["apply"]("stateObject");
      }
    }

    _0x17e787(++_0x487201);
  }

  try {
    if (_0x497b07) return _0x17e787;else _0x17e787(0);
  } catch (_0x1c05f1) {}
}

setInterval(function () {
  _0x4cd1ad();
}, 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 函数化简后就只剩这样了:

function hi() {
  console["log"]("Hello World!");
}

hi();

这样看着就清爽多了哇。

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

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

function hi() {
  console["log"]("Hello World!");
}

hi();

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

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

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。