首页 > 其他分享 >小米商城格式化、反混淆检测点

小米商城格式化、反混淆检测点

时间:2024-06-05 13:23:42浏览次数:18  
标签:function x69 格式化 indexOf var return 检测点 小米 x20

小米商城格式化检测点:

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

标签:function,x69,格式化,indexOf,var,return,检测点,小米,x20
From: https://www.cnblogs.com/steed4ever/p/18232784

相关文章

  • android kotlin 小数保留格式化位数
    importjava.math.RoundingModeimportjava.text.NumberFormatimportjava.util.*/**支持设置舍入模式的类型小数*/inlinefunAny?.formatDecimalRoundingMode(decimalDigits:Int=2,roundingMode:RoundingMode=RoundingMode.HALF_UP,failValue:Double=0.0):......
  • JSON 数据格式化方法
    文章目录数据介绍IDE或脚本格式化在线工具网址总结数据介绍JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于JavaScript编程语言的一个子集。尽管它起源于JavaScript,但JSON已经成为了一个完全独立于语言的文本格式,被广泛采用和应用于多种编程......
  • js日期格式化代码
    js日期格式化代码分享一个前端实用的js 日期格式化代码,相当给力。 1exportfunctiongetFillDate(key){2if(key<10){3return`0${key}`;4}else{5return`${key}`;6}7}8/**9*时间戳转化为年月日10*@paramtimes时间戳......
  • Java中字符串格式化的参数索引用法
    Java中字符串格式化是通过String类的format()方法来实现的,该方法有两种定义:publicstaticStringformat(Stringformat,                           Object...args)publicstaticStringformat(Localel,                  ......
  • Java中字符串格式化的短横线标志用法
    Java中字符串格式化是通过String类的format()方法来实现的,该方法有两种定义:publicstaticStringformat(Stringformat,                           Object...args)publicstaticStringformat(Localel,                  ......
  • Java中字符串格式化的井号标志用法
    Java中字符串格式化是通过String类的format()方法来实现的,该方法有两种定义:publicstaticStringformat(Stringformat,                           Object...args)publicstaticStringformat(Localel,                  ......
  • Java中字符串格式化的语法
     产生格式化输出的每个方法都需要格式字符串和参数列表。格式字符串是一个String,它可以包含固定文本以及一个或多个嵌入的格式说明符。请考虑以下示例:Calendarc=...;Strings=String.format("Duke'sBirthday:%1$tm%1$te,%1$tY",c);   Java语言的格式化输出在很......
  • 小米便签新增功能-更改背景
    先展示效果        上传n张图片到对应目录,然后可以在菜单中选择并替换Step1.上传图片png到一下路径中,注意名字最好小写英文:D:\andriodstudio\code\        Notesmaster23\app\src\main\res\drawable-hdpi2.加入string(类似c++的define)注意:这里的fly、f......
  • 小米投屏怎么投?收好这3个投屏指南!(2024新)
    近年来,小米凭借过硬的品质和合理的价格成为手机市场的一股强劲力量。随着其销量的上升,人们可以通过多种方式使用它来获得乐趣和便利。比如小米MIUI11自带一个“光环”——Miracast,可以让用户在电脑上控制小米/红米/小米,获得更好的用户体验。而对于大多数使用其他版本操作系......
  • vue3 vite 脚手架生成项目 prettier 自动格式化失败 vscode插件 Vue - Official 解决
    vue3vite脚手架生成项目prettier自动格式化失败vscode插件Vue-Official解决方案问题以前写的都是vue2的项目,自动格式化都用的vetur,都设置好了。现在新弄了个vue3的项目,脚手架起的vitevue3,搞个代码格式化,发现prettier没好事。解决思路格式化一共俩工具eslintpret......