【无标题】

小米商城格式化检测点:

var a = function () {
    var x = !0;
    return function (a, t) {
      var e = x ? function () {
        if (t) {
          var x = t.apply(a, arguments);
          t = null;
          return x;
        }
      } : function () {};
      x = !1;
      return e;
    };
  }();
  var t = {};
  function e(n) {
    var r = a(this, function () {
      var x = function () {
          return "dev";
      },
        a = function () {
          return "window";
        };
      var t = function () {
        var a = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
        return !a.test(x.toString());
      };
      var e = function () {
        var x = new RegExp("(\\\\[x|u](\\w){2,4})+");
        return x.test(a.toString());
      };
      var n = function (x) {
        var a = 0;
        x.indexOf("i" === a) && r(x);
      };
      var r = function (x) {
        var a = 3;
        x.indexOf((!0 + "")[3]) !== a && n(x);
      };
      t() ? n("indеxOf") : e() ? n("indexOf") : n("indеxOf");
    });
    r();

  }

e(e.s=124)

执行这段代码后,将出现循环调用出现栈溢出。。

image-20240605110251236

查看栈:

image-20240605110335310

一看nr互相调用

快刀斩乱麻:

1.让其中一个不去调用另一个,于是找到n将调用r的代码注释:

      var n = function (x) {
        var a = 0;
        //x.indexOf("i" === a) && r(x);
      };

运行看看:

成功执行。

但是知其然,知其所以然,看看它是检测啥?

进入第一个调用的地方:

image-20240605111607958

image-20240605111539419

仔细看这个a正则表达式,可以看出,a格式上必须满足没有换行符…

那就把a还原,弄成一行,但是,运行后又进入了e函数:

image-20240605112606848

这个格式就比较鬼畜了,有没有换行符都返回false。

仔细看这:

 t() ? n("indеxOf") : e() ? n("indexOf") : n("indеxOf");

t检测为假后,又进入了e的检测,e检测为真还是假,都会调用n(‘indexOf’),进入死循环,

但是t检测为真呢?依然进入n(“indexOf”)进入死循环呀!!!这尼玛什么鬼!突然想到,我勒个去,我这是反混淆后的代码,我们得看看原来的代码才行!

原来的代码:

 var _0x2af70d = function() {
                return '\x64\x65\x76';
            }
              , _0x149eed = function() {
                return '\x77\x69\x6e\x64\x6f\x77';
            };
            var _0x1ba3ec = function() {
                var _0x326b6c = new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');
                return !_0x326b6c['\x74\x65\x73\x74'](_0x2af70d['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
            };
            var _0x567cbd = function() {
                var _0x566a50 = new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');
                return _0x566a50['\x74\x65\x73\x74'](_0x149eed['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
            };
            var _0x828b58 = function(_0x4770f2) {
                var _0x5fe41d = ~-0x1 >> 0x1 + 0xff % 0x0;
                if (_0x4770f2['\x69\x6e\x64\x65\x78\x4f\x66']('\x69' === _0x5fe41d)) {
                    _0x1670cc(_0x4770f2);
                }
            };
            var _0x1670cc = function(_0x413b09) {
                var _0x4a50c7 = ~-0x4 >> 0x1 + 0xff % 0x0;
                if (_0x413b09['\x69\x6e\x64\x65\x78\x4f\x66']((!![] + '')[0x3]) !== _0x4a50c7) {
                    _0x828b58(_0x413b09);
                }
            };
            if (!_0x1ba3ec()) {
                if (!_0x567cbd()) {
                    _0x828b58('\x69\x6e\x64\u0435\x78\x4f\x66');
                } else {
                    _0x828b58('\x69\x6e\x64\x65\x78\x4f\x66');
                }
            } else {
                _0x828b58('\x69\x6e\x64\u0435\x78\x4f\x66');
            }
        });
        _0x39ebcf();

_0x828b58('\x69\x6e\x64\u0435\x78\x4f\x66');

我勒个去,这个indexOf是byte形式的字符串,它对e进行索引是找不到e的,所以这里还是检测是否将\x形式\u形式的字符串进行了反混淆

总结:

1.检测是否将字符串的\x \u形式反混淆

2.检测是否换行格式化

综上思路的话,大概明白了他是怎么检测的了。这样的话,也就知道怎么去处理了,反正处理方式很多的,但是呢,一般原则,省时省力,处理的话,最好就是最开始的那种,干掉互相调用链,或者就是找到调用入口直接注释,这里就是:

  function e(n) {
    var r = a(this, function () {
      var x = function () {
          return "dev";
      },
        a = function () {
          return "window";
        };
      var t = function () {
        var a = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
        return !a.test(x.toString());
      };
      var e = function () {
        var x = new RegExp("(\\\\[x|u](\\w){2,4})+");
        return x.test(a.toString());
      };
      var n = function (x) {
        var a = 0;
        x.indexOf("i" === a) && r(x);
      };
      var r = function (x) {
        var a = 3;
        x.indexOf((!0 + "")[3]) !== a && n(x);
      };
      t() ? n("indеxOf") : e() ? n("indexOf") : n("indеxOf");
    });
    //r();

  }

直接把r()调用注释,也就可以不进入这一套判断逻辑。

同样的检测地方还有:

    var _0xc3cbb7 = function() {
        var _0x2c1eed = {
            'data': {
                'key': 'cookie',
                'value': 'timeout'
            },
            'setCookie': function(_0x2a4253, _0x4a45c8, _0x5a7b75, _0x142fca) {
                _0x142fca = _0x142fca || {};
                var _0x47dfad = _0x4a45c8 + '=' + _0x5a7b75;
                var _0x456411 = 0x0;
                for (var _0x456411 = 0x0, _0x2f51c3 = _0x2a4253['length']; _0x456411 < _0x2f51c3; _0x456411++) {
                    var _0x2e20cf = _0x2a4253[_0x456411];
                    _0x47dfad += ';\x20' + _0x2e20cf;
                    var _0x4743a3 = _0x2a4253[_0x2e20cf];
                    _0x2a4253['push'](_0x4743a3);
                    _0x2f51c3 = _0x2a4253['length'];
                    if (_0x4743a3 !== !![]) {
                        _0x47dfad += '=' + _0x4743a3;
                    }
                }
                _0x142fca['cookie'] = _0x47dfad;
            },
            'removeCookie': function() {
                return 'dev';
            },
            'getCookie': function(_0x5c79de, _0x5a90fd) {
                _0x5c79de = _0x5c79de || function(_0x3f5d05) {
                    return _0x3f5d05;
                }
                ;
                var _0x4a6be9 = _0x5c79de(new RegExp('(?:^|;\x20)' + _0x5a90fd['replace'](/([.$?*|{}()[]\/+^])/g, '$1') + '=([^;]*)'));
                var _0x7b7045 = function(_0x1f9b0a, _0x3c3639) {
                    _0x1f9b0a(++_0x3c3639);
                };
                _0x7b7045(_0x404828, _0x478507);
                return _0x4a6be9 ? decodeURIComponent(_0x4a6be9[0x1]) : undefined;
            }
        };
        var _0x40d28c = function() {
            var _0x2e7122 = new RegExp('\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*[\x27|\x22].+[\x27|\x22];?\x20*}');
            return _0x2e7122['test'](_0x2c1eed['removeCookie']['toString']());
        };
        _0x2c1eed['updateCookie'] = _0x40d28c;
        var _0x452d20 = '';
        var _0xc45909 = _0x2c1eed['updateCookie']();
        if (!_0xc45909) {
            _0x2c1eed['setCookie'](['*'], 'counter', 0x1);
        } else if (_0xc45909) {
            _0x452d20 = _0x2c1eed['getCookie'](null, 'counter');
        } else {
            _0x2c1eed['removeCookie']();
        }
    };
    _0xc3cbb7();

这个大家自行观看。\

记得加入我们的学习群:961566389

点击链接加入群聊:https://h5.qun.qq.com/s/62P0xwrCNO

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星云牛马

帮到您的话,可否请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值