AST反混淆实战|某国外混淆框架一小段混淆js还原分析

news2024/12/27 12:22:32

关注它,不迷路。       

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

1. 需求

我相信做币圈爬虫的兄弟,或多或少的见过类似下面的混淆js:

860b681b9aace0e4dd4a76ea38907f53.png

大部分的变量名,主要以 "__p_" 开头,分析下来,其实是ob混淆上面再套了一层壳。

再去掉第一层壳以后,发现还套了一层,它的函数如下:

function __p_1295650017_calc(__p_0552970006, __p_6576181459) {
  switch (__p_3757655876) {
    case 12:
      return !__p_0552970006;
    case 26:
      return -__p_0552970006;
    case -29:
      return __p_0552970006 + __p_6576181459;
    case -6:
      return __p_0552970006 - __p_6576181459;
    case 57:
      return ~__p_0552970006;
    case 35:
      return __p_0552970006 / __p_6576181459;
    case 3:
      return __p_0552970006 * __p_6576181459;
    case 2:
      return typeof __p_0552970006;
    case 6:
      return void __p_0552970006;
  }
}

这个混淆函数很有意思,它有两个形参,函数里面有包含一个全局变量 

__p_3757655876,而这个全局变量,又由下面的函数来控制:

function __p_2245858992(a) {
  a = __p_3757655876 + (__p_3757655876 = a, 0);
  return a;
}

而上面的 混淆函数,它的函数调用有这样的:

__p_1295650017_calc(1940, __p_3757655876 = 26)

函数的结果很明显是 -26;

也有这样的:

__p_1295650017_calc(_0x10e09f(746), "e", __p_2245858992(-29))

函数的结果很明显是 _0x10e09f(746) + "e";

还有一个,就是,对于不同版本的混淆文件,它的这个函数定义是变化着的,如:

function __p_0807818337_calc(__p_9916442306, __p_4970943498) {
  switch (__p_3679524284) {
    case 13:
      return !__p_9916442306;
    case 7:
      return -__p_9916442306;
    case 31:
      return __p_9916442306 + __p_4970943498;
    case 3:
      return __p_9916442306 - __p_4970943498;
    case 21:
      return ~__p_9916442306;
    case 50:
      return __p_9916442306 / __p_4970943498;
    case -47:
      return __p_9916442306 * __p_4970943498;
    case 18:
      return typeof __p_9916442306;
    case 55:
      return void __p_9916442306;
  }
}

2. 共同点

如果想要写出通用的插件,就得找出它的共同点。先来看看有哪些共同点:

  1. 函数名不一样,但都以 _calc 结尾

  2. 函数体结构是一样的,但是 每个case 后面的值不一样。

  3. case体是一样的,都是 return 语句。

很快写出代码:

const getCalcFunction = 
{
  FunctionDeclaration(path)
  {
    let {scope,node} = path;
    
    let {id,body,params} = node;
    
    let name = id.name;
    
    if (!name.endsWith('calc'))
    {
      return;
    }
    
  }
}

因为整个混淆js,只有它是以 "calc" 结尾的,因此,只需简单的判断一下就可以了。

接下来怎么写呢?

根据每个case 里的return语句来写?

3. 隐藏的彩蛋

观察 每个case里的return语句,拿到在线解析网站上观察,只有两种类型:

BinaryExpression  UnaryExpression 类型,而它们有个共同点,都有 operator 这个子节点,即操作符。因此,我们可以使用 一个 Object类型的变量来保存它.即通过每个 case的值 和 operator 来注册一个键值对,保存起来。遍历的时候去取就可以了。

const getCalcFunction = 
{
  FunctionDeclaration(path)
  {
    let {scope,node} = path;
    
    let {id,body,params} = node;
    
    let name = id.name;
    
    if (!name.endsWith('calc'))
    {
      return;
    }
    let newMap = new Object();
    let cases = body.body[0].cases;
    
    for (let eachCase of cases)
    {
      let {test,consequent} = eachCase;
      
      let value = test.value || -test.argument.value;
      
      let operator = consequent[0].argument.operator;
      
      newMap[value] = operator;
    }


    console.log(newMap);
    
  }
}

打印结果:

1d51aaaa2a64cca71667c04e6f9cecf6.png

拿到了 case 的值和 它的操作符,再去构造节点就简单了。

这里也许你有个疑问,就是 BinaryExpression  UnaryExpression 它们有个共同的操作符:  "-",如何区分呢?

当然是根据它函数调用的实参个数来区分了。实参是2个的时候,它肯定是UnaryExpression  类型;实参是3个的时候,它肯定是 BinaryExpression 类型。

文件demo在星球里,请星友们完成后续的还原工作:

https://t.zsxq.com/13Sv5Igr1

今天的文章就分享到这里,后续分享更多的技巧,敬请期待。

6e592ed211219aabdfeb2264206fbbc0.jpeg

欢迎加入知识星球,学习更多AST和爬虫技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

触想五代强固型工业一体机在近海船舶上的应用

1、行业发展背景 近海船舶的发展紧密关联着海上运输、渔业贸易、旅游开发、能源探测等多领域,带动区域经济、文化繁荣发展。 随着现代科学与信息技术在各行各业的作用增强,工业4.0带动的产业升级逐步渗透进船舶领域,在此背景下,船…

【网络安全 --- xss-labs靶场通关(1-10关)】详细的xss-labs靶场通关思路及技巧讲解,让你对xss漏洞的理解更深刻

靶场安装: 靶场安装请参考以下博客,既详细有提供工具: 【网络安全 --- xss-labs靶场】xss-labs靶场安装详细教程,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源)-CSDN博客【网络安全 --- xss-labs通…

基于SSM的社区物业管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

C++前缀和算法的应用:从仓库到码头运输箱子原理、源码、测试用例

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 双指针 单调双向队列 题目 你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。 给你…

【Git】idea提交项目到Gitee

文章目录 1. 创建Gitee仓库1. 新建仓库2. 添加描述3. 复制仓库地址 2. idea建立连接提交2.1 Create Git Repository2.2 选择要提交的根目录2.3 Commit2.4 Push2.5 提交成功 1. 创建Gitee仓库 1. 新建仓库 2. 添加描述 3. 复制仓库地址 点击右上角克隆/下载,复制HT…

bitbucket.org 用法

这个网站需要魔法,注册完成后添加厂库时间2023.10 图1 图2 第二张图 ,不要.gitignore文件 sourcetree 1,创建前端项目 npm create vitelatest 2.打开vscode创建本地Git 看到Git代提交的文件 sourcetree,新建 已存在的本地厂库 提交到Git 添…

CSRF Token为什么写在Cookie中?CSRF漏洞分析

1. 什么是CSRF? CSRF或XSRF,跨站请求伪造。简单地说,就是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品&#xff…

Java - 多进程编程(对比线程、API 操作)

目录 一、多进程编程 1.1、为什么要使用多进程编程 1.2、Java 中多进程编程的实现 1.2.1、前言 1.2.2、进程创建 1.2.3、进程等待 1.2.4、封装操作到一个工具类中 一、多进程编程 1.1、为什么要使用多进程编程 一个 .exe 文件执行以后,就会变成一个进程. 多…

高质量发展新引擎:智能工业操作系统助力产业升级

工业操作系统是推动制造业高质量发展的重要支撑,也是推动经济发展方式转变的重要手段。打造自主可控的工业实时操作系统是实现工业科技自立自强的必然要求,是推动高质量发展的必由之路。 基于软件定义控制的智能工业操作系统 Intewell操作系统是由科东…

【技术番外篇】国家高新技术企业 认定

第一个网站:高新技术企业认定管理工作网 http://www.innocom.gov.cn/gqrdw/index.shtml 多给认定机构打咨询电话,少走弯路 有什么不懂的地方就可以打电话咨询专业人士 http://www.innocom.gov.cn/gqrdw/c101321/201905/3b94fbc91a894bcbba97fb7125c9…

【ChatGLM2-6B】nginx转发配置

背景 好不容易把ChatGLM2-6B大语言模型部署好了,使用streamlit方式启动起来了,终于可以愉快的玩耍了,然后想着申请一个域名,使用HTTPS协议访问,但实践过程中,发现这个大语言模型的nginx转发配置还是有点小…

Swingbench 压力测试(超详细)

目录 前提需要有配置好的oracle哦 1、环境准备 2、安装Swingbench 3、造数据 4、压测 前提需要有配置好的oracle哦 1、环境准备 启动监听 lsnrctl start 启动数据库 sqlplus / as sysdba startup 创建表 CREATE TABLESPACE soe DATAFILE /u01/app/oracle/oradata/or…

重生奇迹MU游戏上格斗家挂机小技巧

重生奇迹MU作为一个独特的职业,重生奇迹MU游戏中的格斗家有着多种挂机技巧,以下是一些重生奇迹MU格斗家挂机小技巧供玩家参考: 1.使用幽冥光速拳 幽冥光速拳是格斗家的核心技能之一,可以快速消灭怪物并提高经验值。建议玩家将此…

【PX4报错】Crash dumps present on SD,vehicle needs service

报错: Critical: Preflight Fail: Crash dumps present on SD,vehicle needs service 解决: 将COM_ARM_HFLT_CHECK改为Disabled 参考: PX4常见解锁失败报错及解决方法

PCA降维可视化

二维 import pandas as pd import warnings warnings.filterwarnings("ignore")df pd.read_csv(data/data.csv).dropna() features df.columns[:-1] X, y df[features], df[label]from sklearn.preprocessing import MinMaxScaler # 创建MinMaxScaler对象 scaler…

论坛介绍|COSCon'23 大数据(D)

众多开源爱好者翘首期盼的开源盛会:第八届中国开源年会(COSCon23)将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是:“开源:川流不息、山海相映”!各位新老朋友们,欢迎到成都&a…

柯桥银泰附近有学德语的地方吗,留学德语培训

01 die Garantiefr jemandem/etwas 给某人或某事的保障 Das System bietet die Garantie fr die Bauer. 02 der Gebrauch von etwas 使用某物 Wir haben den Gebrauch vom Computer gelerbt. 我们学会了使用电脑。 03 Die Geduld mit jemandem/etwas 对..的耐心 Der Lehre…

llava1.5-部署

llava1.5 ——demo部署 下载代码和权重 新建weights文件夹,并下载到LLaVA/weights/中。->需要修改文件名为llava-版本,例如llava-v1.5-7b. 运行 启动控制台 python -m llava.serve.controller --host 0.0.0.0 --port 4006启动gradio python -m…

网络拥塞控制的经济学原理

作为一个流通和兑换系统(与被发送速率兑换出的带宽不同,公路交通不是兑换系统,车辆只是单体),网络传输与货币流通和兑换是一回事,借一些经济学术语能更深刻理解拥塞的成因和缓解以及制定拥塞控制策略,这是一个新视角。…

2024年浙大MPA复试可能面临的变数:权重加大

熟悉浙大mpa项目常规批复试规则的同学都知道,每年的复试成绩权重一般都在40%,这个权重对于每年复试后综合成绩的排名影响会比较大,按照mpa联考复试1分等于初试3分的规则,联考笔试成绩假如有15分差异的两个考生,复试成绩…