AST反混淆|对一段非常复杂的混淆代码深度剖析与还原

关注它,不迷路。       

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

1.代码片段

((((ld0 = ((ld1 = (ld1 = Uint8Array) && undefined || ld2) || 6) && encodeUTF8(ld1)) && 0 || (ld3 = ((ld4 = (ld5 = new ld3(ld0)) && undefined || ld5) || 6) && ld4) && 0 || (ld5 = ((ld0 = (ld1 = "length") && null || ld3[ld1]) || 7) && 8) && 0 || (ld8 = ((ld7 = ((ld9 = ld0 + ld5) || 2) && 6) || 3) && ld9 >>> ld7) && undefined || (ld10 = (ld11 = ((ld12 = 4) || 7) && ld8 << ld12) && null || 16) || 3) && (ld16 = (ld33 = (ld13 = ld11 + ld10) && undefined || ld13) && null || Uint8Array) && undefined || (ld32 = ((ld14 = ((ld34 = ld33) || 8) && 2) || 9) && ld34 << ld14) && null || (((ld15 = (ld17 = new ld16(ld32)) && null || ld17) && 0 || (ld18 = ld15) && null || (ld19 = "set") || 10) && ((ld20 = Uint8Array) || 4) && ((ld21 = ld4) || 4) && ((ld22 = "buffer") || 5) && ((ld23 = ld21[ld22]) || 7) && (ld24 = new ld20(ld23)) && null || ld18[ld19](ld24) && 0 || (ld25 = Uint32Array) || 5) && (((ld27 = ld15) || 8) && (ld31 = "buffer") && undefined || (ld26 = ld27[ld31]) && undefined || (ld30 = new ld25(ld26)) || 3) && (ld15 = ld30)) && null || (ld29 = new DataView(ld15.buffer)) && undefined || (ld28 = 0) || 1) && (ld6 -= 999);

说是复杂,其实就是赋值语句与逻辑表达式的各种相互嵌套罢了。

2.先导知识

经过多次询问GPT,得知,在一个js语句中,有些代码可能会执行,也可能不会执行。而我们如果要简化上面的代码,就要找出一定会执行的语句。

一般而言,我们遇到比较常见的代码节点类型如条件表达式以及逻辑表达式,它会存在上面的情况。

对于上面的混淆代码,它不包含 条件表达式,因此只需要处理 逻辑表达式 的情况即可。

对于一个赋值语句与逻辑表达式的各种相互嵌套的混淆代码,如何找出它第一条一定会执行的语句?

答案是 使用深度优先模式来遍历该语句。

3.还原思路

我们知道,节点的访问模式有两种,enter 和 exit,一般默认为 enter,

但是,对于这种嵌套的语句,使用 exit 更好。通过这种方式,可以找到第一条一定会执行的语句:

const splitLogicalExpression =
{LogicalExpression:{exit(path) {console.log(path.toString());return;}},
}

运行后的打印结果:

617b10bd7a6823d3a6d6d74a375e8420.png

如图,红色框内是一定可以被执行的语句,因此将它提到整个表达式的前面来,而这个逻辑表达式的值 可以看出是 false,即有两步操作:

1.将 ld1 = Uint8Array 这行代码 提到整个代码的前面来;

2.因为代码已经执行了,可以直接用结果来继续替换,这里很明显它的结果是false,因此直接用false替换即可。

替换后的代码应该是这样的:

01da0975ab60c61b0c12b1290f101a3b.png

经过这一步后,接下来处理的逻辑表达式就应该是:

(ld1 = false || ld2) || 6

这里又可以把 ld1 = false || ld2 给提到混淆代码的前面去,而后面的 || 6,可以确定这个表达式恒为true,因此它可以直接被替换成 true。

第二步处理后的代码应该是这样的:

81dd04e5dd18e977a9318b0652f91d94.png

........

就这么一起处理下去,最终我们得到下面的代码:

a7f86f62e9c0029c47b09629cba9f9b8.png

看到了代码中包含大量的 false 和 true,这个时候再写个插件,去掉这些false 和true,得到最终的代码:

f2aa9429f907572952c8303fd6ed5ee8.png

这样代码就被我们轻松还原了。可以说,非常的清爽!

今天的文章就分享到这里,感谢大家的阅读!

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

32900668cf6e0db27b8bbb542ff9294a.jpeg

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

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

相关文章

SQLI-labs-第二十七关和第二十七a关

目录 第二十七关 1、判断注入点 2、判断数据库 3、判断表名 第二十七a关 第二十七关 知识点&#xff1a;空格、select、union等过滤绕过 思路&#xff1a; 通过分析源码&#xff0c;我们可以知道对用户的输入进行过滤&#xff0c;对空格、select、union等进行了过滤&…

clickhouse——clickhouse单节点部署及基础命令介绍

clickhouse支持运行在主流的64位CPU架构的linux操作系统之上&#xff0c;可以通过源码编译&#xff0c;预编译压缩包&#xff0c;docker镜像和rpm等多种方式进行安装。 一、单节点部署 1、安装curl工具 yum install -y curl 2、添加clickhouse的yum镜像 curl -s https://pack…

R包Colorfindr识别图片颜色|用刀剑神域方式打开SCI科研配色

1.前言 最近忙里偷闲&#xff0c;捣鼓一下配色&#xff0c;把童年回忆里的动漫都搬进来&#xff0c;给科研信仰充值吧&#xff5e; 提取颜色之前写过一个Py的&#xff0c;那个很准确不过调参会有点麻烦。这里分享一个比较懒人点的R包吧&#xff0c;虽然会有一定误差&#xff…

数据分析之统计学基础

数据分析是现代企业和科研中不可或缺的一部分&#xff0c;而统计学是数据分析的基石。在本篇博客中&#xff0c;我们将介绍统计学的基础知识&#xff0c;涵盖数据类型、描述性统计&#xff08;集中趋势、离散程度和偏差程度&#xff09;&#xff0c;并通过代码实例加以说明。 …

redis数据类型之string,list

华子目录 key操作说明SCAN cursor [MATCH pattern] [COUNT count]dump与restorekeys 通配符 示例演示 string说明setbit key offset valuegetbit key offsetsetrange key offset value List结构图相关命令lrem key count valueltrim key count value示例&#xff1a;使用 LTRIM…

Octo:伯克利开源机器人开发框架

【摘要】在各种机器人数据集上预先训练的大型策略有可能改变机器人学习&#xff1a;这种通用机器人策略无需从头开始训练新策略&#xff0c;只需使用少量领域内数据即可进行微调&#xff0c;但具有广泛的泛化能力。然而&#xff0c;为了广泛应用于各种机器人学习场景、环境和任…

IC618 虚拟机 EDA Calibre2019 Hspice2018 Spectre19.1

虚拟机包含 CentOS 7.9 Cadence IC618 Calibre 2019 Hspice 2018 Spectre19.1 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1aMtPO2G5ad-x5BtIJjCDig?pwdxcii 提取码&#xff1a;xcii

闹掰了? 传Google Pixel 10芯片转单了 | 百能云芯

根据最新消息&#xff0c;Google Tensor G5处理器可能将选择台积电作为其新的生产伙伴&#xff0c;并计划在2025年的Pixel 10系列手机上亮相。这一消息由Android Authority率先报道&#xff0c;引起了业界的广泛关注。 据悉&#xff0c;自从2021年Google推出自研的Tensor处理器…

14.微信小程序之地理定位功能

目录 1.地理定位介绍 1.1 申请开通 1.2 使用方法 2.拒绝授权后的解决方案 3.开通腾讯位置服务 4.LBS 逆地址解析 1.地理定位介绍 小程序地理定位是指通过小程序开发平台提供的 API&#xff0c;来获取用户的地理位置信息。用户在使用小程序时&#xff0c;可以授权小程序获…

【前端常见面试题整理】

开放性的题目 自我介绍 突出学习能力 我想换工作的主要原因是 介绍项目 平时是如何学习前端开发的 主要就是两个途径&#xff0c;一个是查阅官方文档&#xff0c;然后就是在网上查找技术资料或者视频去学习。平时没事的时候也会看看github&#xff0c;同时关注一些社区和IT网…

医疗小程序源码SpringBoot2.X + Vue + UniAPP全栈开发

源码说明&#xff1a; 看到好多坛友都在求SpringBoot2.X Vue UniAPP&#xff0c;全栈开发医疗小程序 – 带源码课件&#xff0c;我看了一下&#xff0c;要么链接过期&#xff0c;要么课件有压缩密码。 特意整理了一份分享给大家&#xff0c;个人认为还是比较全面的。 希望…

【数据结构】-- 栈

栈 引入&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循先进后出的原则&#xff0c;先入栈的元素总是先后出栈。 压栈&#xff1a;栈的插入操作叫…

04--SpringBoot热部署与日志

1、热部署 1.1 引言 为了进一步提高开发效率&#xff0c;SpringBoot为我们提供了全部项目热部署&#xff0c;日后在开发过程中修改了部分代码或者相关配置文件之后&#xff0c;不需要再重启服务使其生效。在项目中开启了全局热部署之后&#xff0c;只需要在修改之后等待几秒钟…

广东省保健食品行业协会批复成为“世界酒中国菜”活动指导单位

广东省保健食品行业协会正式批复成为“世界酒中国菜”系列活动指导单位&#xff0c;共促餐饮文化交流发展 近日&#xff0c;广东省保健食品行业协会正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位…

填补领域空白!TerDiT:首次探索大规模DiT模型量化问题(MMLab出品)

论文链接&#xff1a;https://arxiv.org/pdf/2405.14854 项目链接&#xff1a;https://github.com/Lucky-Lance/TerDiT 最近在大规模预训练的文本到图像扩散模型方面的发展显著提高了高保真图像的生成能力&#xff0c;特别是基于transformer架构的扩散模型&#xff08;DiTs&a…

奈飞CEO最新访谈:抢走你饭碗的不是AI,而是能熟练使用AI的人

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

新书推荐:7.5 goto、break、continue语句

本节必须掌握的知识点&#xff1a; 示例二十六 代码分析 汇编解析 示例二十七 代码分析 汇编解析 7.5.1 示例二十六 ■goto语句&#xff1a;无条件转移语句。 语法格式&#xff1a; goto label; label : 代码; ●语法解析&#xff1a; 执行到goto语句时&#xff0c;则无…

Jetpack架构组件_1.基本知识

1.什么是Jetpack&#xff1f; Jetpack 是一个由多个库组成的套件&#xff0c;可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码&#xff0c;让开发者可将精力集中于真正重要的编码工作。Jetpack 包含一系列 Android 库&#xff0c;它…

pcdn服务器应该怎么配?

要配置PCDN&#xff08;Private Content Delivery Network&#xff09;服务器&#xff0c;可以按照以下步骤进行&#xff1a; 需求分析&#xff1a;明确业务需求&#xff0c;确定所需的CDN功能和性能参数。这包括预期的流量、负载、内容类型、目标用户群体等。 硬件选择&#…

VCRUNTIME140_1.dll丢失是怎么回事?vcruntime140_1.dll无法继续执行代码的处理方法

VCRUNTIME140_1.dll丢失是怎么回事&#xff1f;问出这样的问题的人&#xff0c;一般是遇到vcruntime140_1.dll无法继续执行代码的问题了&#xff0c;找不到VCRUNTIME140_1.dll文件&#xff0c;那么程序就肯定是启动不了的&#xff0c;程序的启动是需要VCRUNTIME140_1.dll文件的…