AST 反混淆处理示例(二)

本文章只做技术探讨, 请勿用于非法用途。

引言

再聊一下 AST 反混淆, 聊一下常见一些的 OB 混淆的处理方法。

实战

要处理的是 reese84 的加密, 部分加密代码如下。

JavaScript 复制代码
function _0x38facf(_0x7f638c) {
    var _0x266430 = a1_0x422d
      , _0x1ed4bb = this[_0x266430(0x45b) + _0x266430(0x3be)]
      , _0x5b3338 = _0x295651[_0x266430(0x2b2)](this, _0x7f638c) || this
      , _0x1bd4e5 = _0x1ed4bb[_0x266430(0x437) + _0x266430(0x274)];
    return Object[_0x266430(0x28c) + _0x266430(0x439) + 'Of'] ? Object[_0x266430(0x28c) + _0x266430(0x439) + 'Of'](_0x5b3338, _0x1bd4e5) : _0x5b3338[_0x266430(0x1f2) + _0x266430(0x1d9)] = _0x1bd4e5,
    _0x5b3338;
}

老规矩, 源码放这里, 是一个航司网站, 感兴趣可以自己去看看。www.etihad.com/

思路

目的还是要得到一份明文代码, 如下所示。

JavaScript 复制代码
// 加密原文
var _0x416d2b = localStorage[_0x45c9ef(0x33f) + 'm'](_0x2c07b5[_0x45c9ef(0x24a) + _0x45c9ef(0x2a0)]);
// 目标代码
var _0x416d2b = localStorage["getItem"](_0x2c07b5["COOKIE_NAME"]);

可以看到是一份 OB 混淆的代码, 加密类似 _0x266430(0x45b) 或 _0x45c9ef(0x33f) 形式, 首先我们需要通过调试来找到解密函数。

加密代码示例

加密代码结构示例

通过调试可以发现, 所有的解密函数都是通过 a1_0x422d 变量赋值, 然后进行调用解密, 可以做一个具体测试。

解密测试

可以看到, 加载解密函数, 然后替换为原函数调用, 就能成功解密。

步骤

由此我们可以确定处理方法。

JavaScript 复制代码
1. eval 加载解密函数。
2. 定位加密位置, 运行解密函数。
3. 将原本的加密代码替换。

开整

按照上边的步骤, 逐一实现。

解密函数单独封装文件 key.js

AST 代码示例

稍微提一点, 也不是所有 _0x45c9ef(0x33f) 形式的代码都是加密代码, 也有部分是函数调用, 可以做一个 try catch 处理。由此, 我们可以得到一份代码如下。

JavaScript 复制代码
function _0x38facf(_0x7f638c) {
  var _0x266430 = a1_0x422d,
    _0x1ed4bb = this["constructor"],
    _0x5b3338 = _0x295651["call"](this, _0x7f638c) || this,
    _0x1bd4e5 = _0x1ed4bb["prototype"];
  return Object["setPrototype" + 'Of'] ? Object["setPrototype" + 'Of'](_0x5b3338, _0x1bd4e5) : _0x5b3338["__proto__"] = _0x1bd4e5, _0x5b3338;
}

然后来处理字符串相加的情况。

AST 代码示例

最终得到字符串解密完成的代码如下。

JavaScript 复制代码
function _0x38facf(_0x7f638c) {
  var _0x266430 = a1_0x422d,
    _0x1ed4bb = this["constructor"],
    _0x5b3338 = _0x295651["call"](this, _0x7f638c) || this,
    _0x1bd4e5 = _0x1ed4bb["prototype"];
  return Object["setPrototypeOf"] ? Object["setPrototypeOf"](_0x5b3338, _0x1bd4e5) : _0x5b3338["__proto__"] = _0x1bd4e5, _0x5b3338;
}

总结

文章主要是聊一些思路, 希望可以作为参考。

一些基础的写法可以参考之前的文章, 这次的 OB 混淆应该是更加常见一些的。

请洒潘江,各倾陆海云尔。

相关推荐
Mr Xu_6 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
hedley(●'◡'●)7 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
百思可瑞教育7 小时前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
CappuccinoRose8 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
全栈前端老曹8 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员8 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
小杨同学呀呀呀呀9 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue
qq_532453539 小时前
使用 Three.js 构建沉浸式全景图AR
开发语言·javascript·ar
Mr Xu_17 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠17 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript