当前位置: 首页 > news >正文

Akamai字符串解混淆

公司要搞一个网站,然后就开始了我的akm痛苦之旅,顺便分享一下字符串解混淆的思路

目标网站:aHR0cHM6Ly93d3cucmFkaXNzb25ob3RlbHMuY29tL2VuLXVzLw==

1、首先抓包看一下登录接口,是一个post,账号密码都是明文, 当时内心os:这不是手拿把掐!
在这里插入图片描述

然后复制curl,requests测试,ok,他不行,报403
在这里插入图片描述

2、 看参数, 请求头没什么加密,cookie有一个_abck,网上曾听闻这个参数,再次确认一下
在这里插入图片描述

第一次 get,set一次cookie
第二次post,更新一次cookie
第三次post,再次更新一次cookie
第四次post,更新 ~0~的cookie(需要手动点击页面,猜测检测了鼠标轨迹)

3、确诊:就是akm,看sensor_data, 是akm3.0 版本的
在这里插入图片描述

4、调试加密参数,在最后一次发包的地方,打断点
在这里插入图片描述

Ov是我们要搞的参数, 他是上方定义的
var Ov = nQ()[Lm(d4)](mb, nw)[NQ()[U5(ml)].apply(null, [nw, J8, qP, sY(vO)])](cXJ, lY(typeof Js()[r5(Ft)], Qx('', [][[]])) ? Js()[r5(BHJ)](sY(vO), qx, Ct) : Js()[r5(pY)](Uq, WLJ, RV));
对他进行拆解
nQ()[Lm(d4)](mb, nw) ==> '{"sensor_data":'NQ()[U5(ml)].apply(null, [nw, J8, qP, sY(vO)]) ==> 'concat'cXJ, 就是我们要搞的参数lY(typeof Js()[r5(Ft)], Qx('', [][[]])) ? Js()[r5(BHJ)](sY(vO), qx, Ct) : Js()[r5(pY)](Uq, WLJ, RV) ===> '}'  

在这里插入图片描述

5、可以看到有很多的混淆代码
第一种,函数调用类型: JS()[x(AA)](XX, XX, XX)
在这里插入图片描述

第二种,绑定调用类型,有apply那么一定有.call,毕竟他们是兄弟
在这里插入图片描述
在这里插入图片描述

第三种,问号表达式
在这里插入图片描述

6、梳理思路:把目标函数解密为字符串,转换为逗号表达式,不影响原函数的运行
在这里插入图片描述

7、先搭建基础的AST基础框架
在这里插入图片描述

8、看节点的特征,拿第一个函数调用来说,节点类型是CallExpression,再分别判断属性类型
网址:https://astexplorer.net/
在这里插入图片描述

types.isMemberExpression(node.callee) && types.isMemberExpression(node.callee.object) && (node.callee.property.name ===“apply” || node.callee.property.name ===“call”)
&& types.isCallExpression(node.callee.object.object) && types.isCallExpression(node.callee.object.property)
问号表达式的特征:ConditionalExpression,每一个都是CallExpression,再分别对三个进行判别
在这里插入图片描述

types.isCallExpression(node.test) && types.isCallExpression(node.consequent) && types.isCallExpression(node.alternate) && node.test.arguments.length === 2
&& is_string_decrypted(node.consequent) && is_string_decrypted(node.alternate)

9、创建obj[‘xxx’] = xxx, obj[‘xxx’], 首先看整体节点,是sequenceExpression,首字母记得要小写
在这里插入图片描述
在这里插入图片描述

types.sequenceExpression([
types.assignmentExpression(“=”, types.memberExpression(types.identifier(‘obj’), types.stringLiteral(path +“”), computed=true),
node),types.memberExpression(types.identifier(‘obj’), types.stringLiteral(path +“”), computed=true)
])

10、然后会将全部的代码,保存为这样格式的
在这里插入图片描述

11、替换原js文件,注意: 一定有tostring 检测(别问,大家都这么说的!)
在js头部,加下边的代码,断到后,会

!function () {let toString_ = Function.prototype.toString;Function.prototype.toString = function () {let res = toString_.call(this);debugger;return res;};
}();

hook它的原逻辑,然后直接返回原代码就可以了,下边的代码就可以换成我们处理过的代码
别忘了声明一个 obj = {}
在这里插入图片描述

12、让代码执行完成,看结果返回 0 的cookie, ok那我们代码已经没问题了
在这里插入图片描述

13、copy obj的所有json,写一个replace代码
在这里插入图片描述

然后我们就得到解混淆以后的代码
在这里插入图片描述

我自己尝试过,把混淆后的代码放上去,不能发包了,应该是检测了JS()函数的调用吧
不管了, 放在本地,和网站上的慢慢对比吧~~

http://www.dtcms.com/a/327919.html

相关文章:

  • RSA各种密钥格式
  • C++ Rust与Go
  • 【taro react】 ---- 实现 RuiPaging 滚动到底部加载更多数据
  • 使用 Docker 一键部署火山引擎 Sandbox-Fusion,并开放 8182 端口
  • QT6 如何在Linux Wayland 桌面系统抓屏和分享屏幕
  • 力扣hot100 | 双指针 | 283. 移动零、11. 盛最多水的容器、42. 接雨水
  • 2787. 将一个数字表示成幂的和的方案数
  • 三维工厂设计软件 AutoCAD Plant 3D 安装图文教程
  • 3DTiles转OSGB格式逆向转换方法研究
  • 国产3D大型装配设计新突破②:装配约束智能推断 | 中望3D 2026
  • Go之封装Http请求和日志
  • 【新启航】飞机起落架减震筒的深孔测量方法探究 - 激光频率梳 3D 轮廓检测
  • 简单认识CSRF
  • 常见认证信息的传递方式
  • 深入理解数据库架构:从原理到实践的完整指南
  • 【QT】QT6下载安装
  • @(AJAX)
  • JS 模块化与打包工具
  • 基于Hadoop的农产品价格数据分析与可视化【Springboot】
  • 【已解决】win10为什么git无法弹出用户登录框呢?
  • 家政小程序系统开发:推动家政行业数字化转型,共创美好未来
  • unity shader ——屏幕故障
  • hashmap如何解决碰撞
  • Pytorch编译
  • 1.Ansible 自动化介绍
  • 网站测评-利用缓存机制实现XSS的分步测试方法
  • 设置默认的pip下载清华源(国内镜像源)和pip使用清华源
  • SQL tutorials
  • 鸿蒙下载图片保存到相册,截取某个组件保存到相册
  • 农业园区气象站在高标准农田的用处