AST入门与实战(三):if节点转switch节点(瑞数5)

news2025/2/13 14:41:58

原文地址:https://zhuoyue360.com/jsnx/110.html

1. 期望

这是一个瑞数5代解混淆的案例,我们本章节需要做的是把if节点的内容转换成switch-case内容.以此来熟悉AST对JS混淆的对抗.

原始代码:

function whileState() {
  while (1) {
    aV = cA[wU++];

    if (aV < 4) {
      if (aV < 1) {
        zT = window, kD = String, bO = Array, xX = document, nZ = Date;
      } else if (aV < 2) {
        iG = zT['ab'] = {};
      } else if (aV < 3) {
        iG = zT['ab'];
      } else {
        mM = !iG;
      }
    } else {
      if (aV < 5) {
        xT(0);
      } else if (aV < 6) {
        if (!mM) wU += 1;
      } else if (aV < 7) {
        lG = [4, 16, 64, 256, 1024, 4096, 16384, 65536];
      } else {
        return;
      }
    }
  }
}

期望代码:

function whileState() {
  while (1) {
    switch (cA[wU++]) {
      case 0:
        zT = window, kD = String, bO = Array, xX = document, nZ = Date;
        break;
      case 1:
        iG = zT['ab'] = {};
        break;
      case 2:
        iG = zT['ab'];
        break;
      case 3:
        mM = !iG;
        break;
      case 4:
        xT(0);
        break;
      case 5:
        if (!mM) wU += 1;
        break;
      case 6:
        lG = [4, 16, 64, 256, 1024, 4096, 16384, 65536];
        break;
      case 7:
        return;
        break;
    }
  }
}

2. 思路分析

首先,我们需要明确一点,aV 的索引是从0开始的,它是不可能为负数的.

那么也就可以有如下的转换:

if (aV < 1) {
	zT = window, kD = String, bO = Array, xX = document, nZ = Date;
}

转换成

if (aV == 0) {
	zT = window, kD = String, bO = Array, xX = document, nZ = Date;
}

这是蔡老板所说的夹逼原理 ,奈何文化低,我不懂.知道有这么一个回事就行.

思路如下(更加详细的看代码注释):

  1. while循环的参数是NumericLiteral ,且内容为1.
  2. body中只有2个节点
  3. 提取出aV
  4. 找到WhileStatement
  5. 枚举WhileStatement下的IfStatement节点.
  6. leftname应该为我们提取出的aV
  7. operator<
  8. right类型不能为IfStatement, 因为它有嵌套.
  9. 记录下了所有符合条件的body
  10. 生成switch 节点

image-20230811172025893

3. 代码

function collectSwitchCase(whilePath,name){
    // 菜老板知识星球获得.
    let ifNodes = [];

    // 遍历WhilePath
    whilePath.traverse({
        "IfStatement"(path)
        {
            //遍历所有的ifStatement;
            let {test,consequent,alternate} = path.node; //获取子节点
            let {left,operator,right} = test; // 必定是BinaryExpression

            if (!types.isIdentifier(left,{name:name}) || operator != '<' || !types.isNumericLiteral(right)) 
            {//条件过滤
                return;
            }

            let value = right.value;

            //保存整个body,记得生成switchCase节点的时候加上break节点。
            ifNodes[right.value-1] = consequent.body;   
            if (!types.isIfStatement(alternate))
            {
                ifNodes[right.value] = alternate.body;  //最后一个else,其实就是上一个else-if 的 test.right的值
            }	

        }
    })
    return ifNodes;


}


const if2switchReplace = {
    WhileStatement(path){
		let {test,body} = path.node;
        // `while`循环的参数是`NumericLiteral` ,且内容为`1`.  body中只有2个节点
        if(!types.isNumericLiteral(test,{value:1}) || body.body.length != 2){
            return
        }

        // 判断while循环格式, 条件过滤
        let blockBody = body.body;
        if (!types.isExpressionStatement(blockBody[0]) || !types.isIfStatement(blockBody[1]))
		{
			return;
		}
        // left 左边的节点就是我们需要的变量名
		let {left,right} = blockBody[0].expression; //或者左右节点       aV = cA[wU++];
        let name = left.name;
        
        // 获取到了变量名称后, 就需要收集使用了aV的case
		let ifNodes = collectSwitchCase(path,name);   //收集case

        //无case,直接返回。
		if (ifNodes.length == 0) return;   

        let len = ifNodes.length;
        for (let i=0; i < len; i++)
		{
             //每一个case最后都加break
			ifNodes[i].push(types.BreakStatement()); 
			ifNodes[i] = types.SwitchCase(test = types.valueToNode(i),consequent = ifNodes[i]);  //生成SwitchCase节点
		}

        //生成SwitchCase节点
        let switchNode = types.SwitchStatement(right,ifNodes);   
        path.node.body.body = [switchNode]; //最后的while节点只有一个Switch Node;


    }   
}

traverse(ast, if2switchReplace);

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

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

相关文章

metaRTC7 demo mac/ios编译指南

概要 metaRTC7.0开始全面支持mac/ios操作系统&#xff0c;新版本7.0.023 mac os demo 包含有srs/zlm的推拉流演示。发布版自带了x64版第三方类库&#xff0c;arm版第三方类库还需开发者自己编译。 源码下载 下载文件metartc7.023.7z https://github.com/metartc/metaRTC/re…

远程桌面弱口令攻击:网络安全的顽疾与挑战

导语&#xff1a; 随着远程办公和云技术的普及&#xff0c;远程桌面弱口令攻击成为了网络安全的顽疾。本文将深入探讨弱口令攻击的原理、危害以及有效的防范措施&#xff0c;帮助读者提升远程桌面安全性。 第一部分&#xff1a;弱口令攻击的原理与方法 1.1 什么是远程桌面弱口…

页面的滚动及scrollIntoView的穿透效果和解决

朋友今天遇到一个奇怪的问题&#xff0c;我觉得很有意思就记录一下。现象是这样的&#xff0c;页面有一个按钮&#xff0c;点击按钮以后会请求一个接口拿到一个iframe的地址然后创建一个iframe并渲染到页面上&#xff0c;iframe的页面加载完毕后会滑动到对应的某一个元素的位置…

统一门户|WorkPlus整合内部应用,构筑企业统一的智能工作入口

国家“十四五”发展规划中指出加强数字化发展&#xff0c;支持企业建设一体化数字平台&#xff0c;全面整合企业内部系统&#xff0c;提升产业链上下游协同效率。而在数字化经济浪潮下&#xff0c;企业和各类组织随着业务规模、人员规模的不断扩大&#xff0c;在信息化办公中存…

一次暴露面全开的红帽渗透测试【getshell】

0x01、信息收集阶段 注&#xff1a;本次信息收集过程主要使用FOFA网络探测平台 https://fofa.info/ 一开始进行收集的时候&#xff0c;有点迷&#xff0c;直接进行了大面积的"gov.in"域名收集 host"gov.in" && country"IN" 哈哈68465…

buuctf crypto刷题1

目录 (1) 凯撒&#xff1f;替换&#xff1f;呵呵!(替换密码爆破) (2) RSA1(dp泄露) (3) RSA2(dp泄露大整数分解) (4) RSA3(共模攻击) (5) 还原大师(md5爆破) (6) RSA(公钥文件解析) (7) RsaRoll (8) Dangerous RSA(小明文攻击) (9) [GUET-CTF2019]BabyRSA (10) [BJD…

成集云 | 聚水潭售后申请单同步伙伴云 | 解决方案

方案介绍 聚水潭是一款电商平台&#xff0c;提供售后申请功能帮助用户解决购物过程中遇到的问题&#xff0c;售后申请功能为用户提供了便利的售后服务&#xff0c;并促进用户与商家或卖家之间的沟通和协商。用户可以在聚水潭平台上轻松提交售后申请&#xff0c;并随时查看处理…

『赠书活动 | 第十七期』《Python网络爬虫:从入门到实战》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十七期』 本期书籍&#xff1a;《Python网络爬虫&#xff1a;从入门到实战》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收…

国内唯一!腾讯零信任iOA入选全球UEM厂商全景图

近日&#xff0c;国际权威机构Forrester发布《The Unified Endpoint Management Landscape, Q3 2023》&#xff08;以下简称“报告”&#xff09;&#xff0c;对全球24家统一终端管理厂商进行了综合性评估&#xff0c;腾讯安全凭借零信任iOA在DEX&#xff08;数字化员工体验&am…

烂尾30年的楼盘,变身高端豪宅,龙华又多一供应

近日&#xff0c;深圳市规划和自然资源局龙华管理局发布了恒地尊悦花园&#xff08;A807-0632&#xff09;建设工程规划许可证的通告。恒地尊悦花园位于龙华区民治街道民荣北路与民通路交果东侧&#xff0c;项目地块实际上就是烂尾了近30年的福罗拉山庄别墅区。 根据规划&#…

基于大模型的数据血缘异常归因分析

近日&#xff0c;以“元数据技术及应用创新”为主题&#xff0c;最新一季StartDT Hackathon&#xff08;奇点云黑客马拉松&#xff09;正式收官。 本期黑客松共吸引了近50位选手参赛&#xff0c;有的在实时数仓领域显神通&#xff0c;有的则再次请出了大模型。这些小组都有个共…

图像多目标跟踪

目标跟踪&#xff08;Object Tracking&#xff09;是自动驾驶中常见的任务&#xff0c;根据跟踪目标数量的不同&#xff0c;目标跟踪可分为&#xff1a; 单目标跟踪&#xff08;Single Object Tracking&#xff0c;SOT&#xff09;多目标跟踪&#xff08;Multi-Objects Tracki…

推特群推王构建你的流量池

随着社交媒体的兴起&#xff0c;推特已成为了一个信息传播、交流、互动的重要平台。在这个充满了各种声音和观点的数字世界里&#xff0c;如何有效地将自己的声音传达出去&#xff0c;吸引更多的关注和互动&#xff0c;已经成为了一个备受关注的话题。而在这个过程中&#xff0…

浏览器渲染进程的线程有哪些

浏览器的渲染进程的线程 GUI 渲染线程 GUI 渲染线程是在 GUI 应用程序中负责界面渲染的线程。负责渲染浏览器页面&#xff0c;解析 HTML、CSS&#xff0c;构建DOM 树、构建CSSOM树、构建渲染树和绘制页面&#xff1b;当界面需要重绘或由于某种操作引发回流时&#xff0c;该线程…

Scratch 之 如何矢量图中去除矢量刺

如果您曾经在“矢量编辑器”中使用过轮廓&#xff0c;那么您一定已经看到了这一点... 这被称为矢量刺&#xff0c;只有当你正在绘制的形状中有尖锐的点或角时才会发生这种情况&#xff0c;这真的很烦人&#x1f621; 所以在这个视频中&#xff0c;我将向你展示如何摆脱这些令人…

Byzer-LLM环境安装

1.Byzer-LLM简介 Byzer-LLM 是基于 Byzer 的一个扩展&#xff0c;让用户可以端到端的完成业务数据获取&#xff0c;处理&#xff0c;finetune大模型&#xff0c;多场景部署大模型等全流程。 该扩展的目标也是为了让企业更好的将业务数据注入到私有大模型&#xff08;开源或者商…

9.2.1Socket(UDP)

一.传输层: 1.UDP:无连接,不可靠,面向数据报,全双工. 2.TCP:有连接,可靠,面向字节流,全双工. 注意:这里的可不可靠是相对的,并且和安不安全无关. 二.UDP数据报套接字编程: 1.socket文件:表示网卡的这类文件. 2.DatagramPacket:表示一个UDP数据报. 三.代码实现: 1.回显服务…

渠道失灵?新零售迎来数据大屏新“大脑”

前言 **“新零售”**是以消费者需求为中心的数据驱动的泛零售形态,其核心是“人”、 “货”、“场”三者的重新定义与关系重构,而重构背后最根本的驱动因素是数据。新零售时代&#xff0c;数字技术不断进步、消费不断升级&#xff0c;零售业需要借助数据中台&#xff0c;发掘数…

CH348 USB转8串口芯片资料下载(合集)

1、产品手册 CH348DS1.PDF - 南京沁恒微电子股份有限公司CH348技术手册&#xff0c;USB转8串口芯片&#xff0c;支持最高6M波特率与硬件流控&#xff0c;支持USB配置功能&#xff0c;提供RS485方向控制与GPIO等信号引脚&#xff0c;可实现PC等平台扩展多串口或多个串口设备升级…

Tomcat的动静分离以及多实例部署

一、动静分离 Nginx实现负载均衡的原理&#xff1a; Nginx实现负载均衡是通过反向代理实现Nginx服务器作为前端&#xff0c;Tomcat服务器作为后端&#xff0c;web页面请求由Nginx服务来进行转发。 但不是把所有的web请求转发&#xff0c;而是将静态页面请求Ncinx服务器自己来处…