Akamai 3.0反混淆

声明

本文仅供学习交流使用, 如侵立删!

代码格式化检测绕过

在对Akamai代码进行反混淆之前
首先需要绕过代码格式化检测
不然就算后续代码反混淆成功
也会因为代码格式化检测而导致请求失败
一般代码格式化检测都会使用toString方法或正则相关方法
因此先hook toString方法进行验证
hook代码:

let new_func = Function.prototype.toString
Function.prototype.toString = function () {
  debugger  return new_func.apply(this, arguments);
}

在成功触发断点后
追溯相关函数堆栈
找到函数sO

在函数sO中
函数Mw获取加密js文件某一个函数的toString字符串
然后使用substr方法截取(可通过a.substr关键字查找此逻辑实现)
这个函数中定义的常量
最终返回这个常量的字符串

查找这个常量  

而函数O中则是通过计算返回一个常量(可通过>>> 0关键字查找此逻辑实现)
函数Mw返回的常量字符串减去函数O返回的常量
得到一个固定值赋值给QO
通过QO进行后续的toString检测
如果加密js代码进行了代码反混淆
则截取不到此常量字符串
从而导致QO为NaN
导致格式化校验失败
所以先获取未格式化后的QO值
在替换的js文件中进行直接赋值
即可绕过格式化检测

常量折叠与替换

在加密js文件中
存在着+[]、!+[]等形式的常量
还有与其相关的表达式

因此可使用babel编写对应的插件将这些常量进行折叠
并在折叠之后将其赋值的变量引用进行替换

字符串解密替换

在Akamai 3.0中
字符串解密可以分为两种形式
一种是以typeof开头的三元表达式
具体格式:
  typeof 表达式 ? 表达式 : 表达式
使用正则进行匹配查看(使用了常量折叠与替换反混淆插件)

针对这种形式的代码
可以使用babel遍历ConditionalExpression节点
获取相关源代码
插件代码:


let typeof_encrypt_str = '['function typeof_re_replace(path){    let code = path + ''    if (code.substr(0,6) === "typeof"){        typeof_encrypt_str += "\"" + code + "\"" + ","        // console.log(code)        // console.log("-----------------")    }    path.skip()}traverse(ast, {ConditionalExpression: {exit: [typeof_re_replace]},});typeof_encrypt_str += "]"

另外一种则是函数调用的形式
这种形式又可以分成三种格式
具体格式:
  函数名()[函数名(1个参数,参数类型为数字)](多个参数)
  函数名()[函数名(1个参数,参数类型为数字)].call(多个参数)
  函数名()[函数名(1个参数,参数类型为数字)].apply(多个参数)

在浏览器中使用对应正则进行匹配(使用了常量折叠与替换反混淆插件)

在本地使用正则对加密js源码进行匹配
获取相关源代码
最后就是跟Akamai 2.0一样的套路了
本地获取解密相关代码
在浏览器中给加密js打上断点
断点触发后
运行解密相关代码
获取解密后的字符串
最后通过解密相关代码的映射
替换成解密后的字符串
从而完成字符串解密

结果展示

联系

欢迎关注我的公众号, 与账号同名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值