ob混淆过的代码有那些特征?

特征一: 大数组 + 移位自执行函数 + 解密字符串函数

下面的代码是一个之前我在官网上混淆的一个例子:

可以看到,大数组为变量 _0x33fc,移位自执行函数体比较大,其实化简后有效的就这么点:

(function(_0x40b128, _0x10e158) {var _0x1c0044 = function(_0x1cab6b) {while (--_0x1cab6b) {_0x40b128['push'](_0x40b128['shift']());}}_0x21186e = function(_0x44fcdc, _0x2309cd) {_0x44fcdc(++_0x2309cd);};_0x21186e(_0x1c0044, _0x10e158);
}(_0x33fc, -0xa25 + 0x1436 * -0x1 + 0x1f96));

具体的化简过程可以参考我的这篇文章: JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!

而解密函数是 _0x14b7,因为后面有很多地方会调用这个函数。

特征二: 定义的Object,其key和value很有规律

var _0x22e4cc = {};
_0x22e4cc["_0x2e7dd3"] = function(_0x16ad58, _0x5d4167) {return _0x16ad58 === _0x5d4167;
};
_0x22e4cc['_0x1b1554'] = "string";
_0x22e4cc["_0x2ab7a2"] = function(_0x120b76, _0x5482f3) {return _0x120b76 !== _0x5482f3;
};
_0x22e4cc["_0x16d15a"] = function(_0x35fd52, _0xb88db7) {return _0x35fd52 + _0xb88db7;
};
_0x22e4cc["_0x267303"] = function(_0x516608, _0x46e9cb) {return _0x516608 / _0x46e9cb;
};
_0x22e4cc["_0x179f12"] = 'length';
_0x22e4cc["_0x4f8e92"] = function(_0xafceb, _0x3c43b9) {return _0xafceb % _0x3c43b9;
}
;
_0x22e4cc["_0x3fba04"] = function(_0x3c0262, _0x3c50b7) {return _0x3c0262 + _0x3c50b7;
}
;
_0x22e4cc["_0x158e00"] = "debu";
_0x22e4cc["_0x1203cd"] = "action";
_0x22e4cc["_0x50462a"] = "gger";
_0x22e4cc["_0x3e6826"] = "stateObject";
_0x22e4cc["_0x3fcd8d"] = function(_0x2c50a6, _0x24e706) {return _0x2c50a6(_0x24e706);
};

上面代码所示的Object变量为 _0x22e4cc,其key值长度是一样的,而它对应的value要么是字符串,要么是函数,其返回结构也是非常简单。

特征三: while + switch 组合

var _0x5ee804 = '4|5|3|0|2|1'['split']('|'), _0x572cee = 0;
while (!![]) {switch (_0x5ee804[_0x572cee++]) {case '0':_0xdedd5["__proto__"] = _0x2f44f0['bind'](_0x2f44f0);continue;case '1':_0x39a3d5[_0x359747] = _0xdedd5;continue;case '2':_0xdedd5['toString'] = _0x1941e5["toString"]["bind"](_0x1941e5);continue;case '3':var _0x1941e5 = _0x39a3d5[_0x359747] || _0xdedd5;continue;case '4':var _0xdedd5 = _0x2f44f0["constructor"]['prototype']["bind"](_0x2f44f0);continue;case '5':var _0x359747 = _0x195f0c[_0x301b17];continue;}break;
}

看到这个特征,相信大部分人都看到过,一个很简单的控制流平坦化,而且,ob混淆的控制流平坦化基本都是这样,还没见过不一样的。哪天要是在case语句中修改case值,就不好弄咯。

特征四: 一些干扰调试的垃圾代码

如:

setInterval(function () {_0x5dcd51();
}, 4000);
function _0x5dcd51(_0x712948) {function _0x441fc1(_0x2aae3c) {if (typeof _0x2aae3c === "string") return function (_0x1430b6) {}["constructor"]("while (true) {}")["apply"]('counter');else ('' + _0x2aae3c / _0x2aae3c)["length"] !== 1 || _0x2aae3c % 20 === 0 ? function () {return true;}['constructor']("debugger")["call"]("action") : function () {return false;}["constructor"]("debugger")['apply']("stateObject");_0x441fc1(++_0x2aae3c);}try {if (_0x712948) return _0x441fc1;else _0x441fc1(0);} catch (_0x219393) {}
}

也有类似这样的:

var _0x4bea14 = _0x46c669(this, function() {function _0x139538() {var _0x1664a7;try {_0x1664a7 = Function("return (function() {}.constructor(\"return this\")( ));")();} catch (_0x1d7d81) {_0x1664a7 = window;}return _0x1664a7;}var _0x1f8e02 = _0x139538();var _0x4fd052 = _0x1f8e02["console"] = _0x1f8e02["console"] || {};var _0x1d2e26 = ["log", "warn", "info", "error", "exception", "table", "trace"];for (var _0x3f35ef = 0; _0x3f35ef < _0x1d2e26["length"]; _0x3f35ef++) {var _0x4cca25 = _0x46c669["constructor"]["prototype"]["bind"](_0x46c669);var _0x11486c = _0x1d2e26[_0x3f35ef];var _0x29f6cb = _0x4fd052[_0x11486c] || _0x4cca25;_0x4cca25["__proto__"] = _0x46c669["bind"](_0x46c669);_0x4cca25["toString"] = _0x29f6cb["toString"]["bind"](_0x29f6cb);_0x4fd052[_0x11486c] = _0x4cca25;}
});_0x4bea14();

这些代码是干扰或者阻扰你进行调试的,对加密参数来说,没有什么用,我一般都是直接删除。

ob混淆的代码特征基本上就是这些,而最新版的ob混淆,也只是第一个略有修改,大数组变成了一个函数,其他的基本没变。

欢迎关注本人微信公众号,学习更多AST相关知识。

AST实战|手把手教你还原ob混淆:ob混淆代码特征相关推荐

  1. 内网渗透-实战|手把手教你如何进行内网渗透

    实战|手把手教你如何进行内网渗透 x00 Preface 内网渗透主要是基于前期外围打点getshell的webserver,通过收集webserver上的信息,然后对其他内网主机进行口令上的攻击,当 ...

  2. 实战|手把手教你如何使用抓包神器MitmProxy

    大家好,我是阿辰,今天教大家如何使用MitmProxy抓包工具. 玩爬虫的小伙伴都知道,抓包工具除了MitmProxy外,还有Fiddler.Charles以及浏览器netwrok等 既然都有这么多抓 ...

  3. 实战|手把手教你利用Python网络爬虫获取新房数据

    一.项目背景 大家好,我是J哥. 新房数据,对于房地产置业者来说是买房的重要参考依据,对于房地产开发商来说,也是分析竞争对手项目的绝佳途径,对于房地产代理来说,是踩盘前的重要准备. 今天J哥以惠民之家 ...

  4. 手把手教你使用curl2py自动构造爬虫代码并进行网络爬虫

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 白头搔更短,浑欲不胜簪. 大家好, ...

  5. AST实战|免安装一键还原ob混淆详细使用教程

    关注它,不迷路. 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 一.环境安装 在nodejs官网下载最新稳定版并安装: 下载地址: htt ...

  6. 最详细的爬虫实战 | 手把手教你用Python爬虫(附详细源码)

    什么是爬虫? 实践来源于理论,做爬虫前肯定要先了解相关的规则和原理,要知道互联网可不是法外之地,你一顿爬虫骚操作搞不好哪天就- 首先,咱先看下爬虫的定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOA ...

  7. 实战 | 手把手教你设计优惠券前后台

    最近有小伙伴咨询我优惠券如何设计?今天就实际举个例子来告诉大家优惠券如何设计. 优惠券是一种重要的促销手段,可以显著的提高商品的转化率,常见的优惠券有满减券.满赠券.代金券.优惠码.通用券,互联网金融 ...

  8. python爬虫技术源码_实战|手把手教你用Python爬虫(附详细源码)

    大家好,我是J哥,专注原创,致力于用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.最近J哥做了个爬虫小项目,感觉还挺适合新手入门的,于是迫不及待想分享给大家. 什么是爬虫? ...

  9. 实战|手把手教你用Python爬虫(附详细源码)

    什么是爬虫? 实践来源于理论,做爬虫前肯定要先了解相关的规则和原理,要知道互联网可不是法外之地,你一顿爬虫骚操作搞不好哪天就- 首先,咱先看下爬虫的定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOA ...

最新文章

  1. 第一个android程序HelloWorld
  2. Android开发各类常见错误解决方案
  3. 荷兰人发明的新客机是劈叉的!乘客坐在机翼上
  4. 【CF1200E】Compress Words【kmp】
  5. centos7安装rabbitmq 总结
  6. nginx企业级优化实战
  7. 碰到 oracle 10g ORA-00257
  8. 知识图谱-实体消歧(语义消歧)
  9. 用java输入学生姓名查询成绩_java实现学生成绩录入系统
  10. 软件需求的三个层次——业务需求、用户需求和功能需求的区别
  11. 使用网络图展示Venn图集合及Cytoscape操作视频
  12. 【黑金视频连载】NIOS II视频教程(01)--软件安装
  13. vue-H5缩放屏幕以及IOS滚动不流畅
  14. thinkPHP基于php的衡水游泳馆管理系统--php-计算机毕业设计
  15. java框架 - web服务器
  16. 在滴滴数据分析岗实习的8个月
  17. 点击图片放大,实现移动端双指缩放,单指拖拽功能
  18. Python表格数据处理方法
  19. 自己动手修相机——解决佳能镜头光圈故障
  20. App崩溃原因定位分析

热门文章

  1. python和正则表达式抽取文本化的信息
  2. 1112_Vue+SpringBoot+Mybatis的简单员工管理项目
  3. 辗转相除法(python)
  4. 【camera】【ISP】Lens Shading Correction镜头阴影校正
  5. IT女孩又来总结了-2015年终总结
  6. STM32 CubeMX学习:7. ADC模数转化
  7. Win系统如何修改远程桌面端口3389
  8. linux bmc管理(工作笔记,随时更新)
  9. linux怎么查找文件
  10. 数据分析的六大黄金法则