《封号码罗》python爬虫之AST在js逆向中删除冗余的if-else代码(二十一)

爬虫之矛---JavaScript番外篇1<关于AST这个不能丢的东西(1)> 抽象语法树(Abstract Syntax Tree,AST)是用于表示程序代码语法结构的一种树状数据结构。它捕捉了代码的结构和语义信息,以一种抽象的方式来描述代码的语法元素和它们之间的关系。AST的主要作用是提供一种便于程序分析和处理的结构化表示,支持诸如静态代码分析、重构、优化、代码生成等编程语言处理任务。AST由节点(Node)构成,每个节点代表了源代码中的一个语法元素,例如变量声明、函数调用、赋值语句等。节点之间通过各种关系(如父子关系、兄弟关系)和属性彼此连接。 阅读详情
const fs = require("fs");//文件读写
const parse = require("@babel/parser"); //解析为ast
const traverse = require('@babel/traverse').default;//遍历节点
const t = require('@babel/types');//类型
const generator = require('@babel/generator').default;//ast解析为代码


const code = `
const example = function () {
    let a;
    if (false) {
        a = 1;
    } else {
        if (1) {
            a = 2;
        }
        else {
            a = 3;
        }
    }
    return a;
};
`
// 	默认为 script,当代码中含有 import 、export 等关键字时会报错,需要指定为 module
const ast = parse.parse(code, {sourceType: "module"})
// 判断条件对应的是 test 节点,if 对应的是 consequent 节点,else 对应的是 alternate 节点
// AST 处理思路以及代码:
//
// 筛选出 BooleanLiteral 和 NumericLiteral 节点,取其对应的值,即 path.node.test.value;
// 判断 value 值为真,则将节点替换成 consequent 节点下的内容,即 path.node.consequent.body;
// 判断 value 值为假,则判断else节点是否存在,存在时替换成 alternate 节点下的内容,即 path.node.alternate.body;
// 有的 if 语句可能没有写 else,也就没有 alternate,所以这种情况下判断 value 值为假,则直接移除该节点,即 path.remove()
function replace_if_else(path) {
    const test = path.node.test
    // if (t.isBooleanLiteral(test) || t.isNumberLiteral(test)) {  //if(当前的筛选节点)
    if (t.isBooleanLiteral(test) || t.isNumericLiteral(test)) {  //if(当前的筛选节点)  注意:别写错节点名称
        if (test.value) {  // 如果if括号里面的内容为真,则将if包含的内容节点替换判断节点
            path.replaceInline(path.node.consequent.body)
        } else {
            if (path.node.alternate) {  // 如果else节点存在则,则else里面的内容节点替换判断节点
                path.replaceInline(path.node.alternate.body)
            } else {
                path.remove()  // 如果else节点不存在,则直接删除if节点,注意:当前path是if节点
            }
        }
    }
}

const visitor = {
    enter: [replace_if_else]
}

traverse(ast, visitor)
const result = generator(ast, {jsescOption: {"minimal": true}}).code
console.log(result)

备注:学习K哥AST笔记

爬虫反爬:一文掌握使用 AST 技术还原混淆的代码实战 抽象语法树是源代码的树状表示,每个节点代表代码中的一个结构。通过 AST,开发者可以以结构化的方式分析和操作代码,而无需直接处理字符串形式的源代码。AST 在编译器、解释器、代码分析和转换工具中广泛应用。通过 AST 技术,可以有效地解析和还原混淆的 JavaScript 代码。结合 Babel 等工具,能够快速分析代码结构并还原可读性更高的代码。在实际应用中,需根据混淆模式灵活调整还原策略,并注意代码的合法性和性能问题。 阅读详情

相关推荐

微信公众号爬虫

用python爬取微信公众号内容 主要内容: 爬虫基本原理 爬虫工具 Requests 的基本使用 数据抓包分析工具 Fiddler 的基本使用 MongoDB 数据库的基本使用 使用 Pandas 进行数据分析 使用 Matplotlib 进行数据可视化展示

《封号码罗》python爬虫之AST在js逆向中删除冗余代码(二十)

js逆向-删除冗余代码

Python_DJ的博客 648

python-js逆向之AST语法树初学(一)

这两天看了什么是控制流平坦化,又研究了下ast语法数,如何把混淆乱序后的代码恢复之前的样子。 知识点:1.js包为 recast 2.Recast除了parse/print/builder以外, 还有三项主要功能: run: 通过命令行读取js文件,并转化成ast以供处理。 tnt(recast.types.namedTypes): 通过assert()和check(),可以验证ast对象的类型。 visit: 遍历ast树,获取有效的AST对象并进行更改。 下面举例一个案例: 通过 https://obfuscator.io/ 将原代码混淆乱序后输出,复制粘贴到饭碗里,再格式化得到: fu

Python操作AST解JS混淆

通过生成语法树(AST),可快速修改代码中的一些混淆处理,从而简化代码,便于后续分析。

李玺 5762

工业自动化实战:用LabVIEW的DSC模块实现MODBUS-TCP设备控制

本文详细介绍了如何利用LabVIEW的DSC模块实现工业自动化中的MODBUS-TCP设备控制。通过环境准备、核心功能解析、状态机实现及典型工业场景实战,帮助工程师快速掌握稳定可靠的通讯技术,提升工业自动化系统的运行效率。

salt9的博客 1057

自动化革命:AI在需求分析、代码生成与测试中的深度应用

在2025年的科技浪潮中,人工智能(AI)已不再是实验室中的概念,而是深度渗透至软件开发的全生命周期。从需求分析的精准捕捉,到代码生成的自动化创作,再到测试环节的智能覆盖,AI正以革命性姿态重塑软件工程的核心环节。本文将结合2025年最新数据与行业实践,解析AI如何在这三大领域实现深度应用。

1507

网页爬虫逆向与AST入门系列教程(二、深入学习AST基础知识)

抽象语法树(Abstract Syntax Tree,简称AST)是根据编程语言的语法规则生成的一种树状结构,用于表示程序代码的抽象语法结构。AST将代码转换成树形的数据结构,每个节点代表了代码中的一个语法单元,比如语句、表达式、函数等。AST在编译器和解释器中发挥着重要的作用。它可以帮助开发者理解和分析代码的结构,进行语法检查、优化和代码生成等操作。

Jamson 3247

PRIDE数据库20年:2025更新

PRoteomics IDEntifications (PRIDE)数据库(https://www.ebi.ac.uk/pride/)是全球领先的基于质谱(MS)的蛋白质组学数据存储库,也是ProteomeXchange联盟的创始成员之一。本文总结了过去3年中PRIDE资源及相关工具的发展情况。提交到PRIDE存档的数据集数量平均每月达到约534个。主要得益于基础设施的持续改进,如用于超大数据集的新文件传输协议(Globus)、新的数据重新提交流程以及自动数据集验证过程。

多组・学・多组学 2060

爬虫逆向-AST解混淆

js代码是极不安全的,任何人都可以阅读,分析,复制,甚至篡改,于是各种混淆技术出现了 变量混淆 将带有含意的变量名、方法名、常量名随机变为无意义的类乱码字符串,降低代码可读性,如转成单个字符或十六进制字符串。 字符串混淆 将字符串阵列化集中放置、并可进行 MD5 或 Base64 加密存储,使代码中不出现明文字符串,这样可以避免使用全局搜索字符串的方式定位到入口点。 属性加密 针对 JavaScript 对象的属性进行加密转化,隐藏代码之间的调用关系。 控制流平坦化 打乱函数原有代码执行流程及函数调

4241

【Claude Code 源码解析教程】第4章:QueryEngine 查询引擎

本章深入解析 Claude Code 的核心引擎——QueryEngine,它是整个对话系统的"心脏",负责管理会话状态、消息处理流程和多轮对话支持。

rengang66的博客 269

北斗导航 | 卫星信号捕获跟踪原理解析

卫星信号的捕获与跟踪是导航接收机的"眼睛",其性能直接决定定位精度、动态适应性和抗干扰能力。随着北斗三号全球组网完成,新一代接收机正朝着。两大核心阶段,二者共同构成定位的基础。调制,频谱主瓣宽度达4.092MHz,较传统BPSK调制抗干扰能力提升3dB[38]。的目标持续演进,在自动驾驶、精密农业等领域展现出巨大应用潜力。二维空间中搜索峰值相关能量[4]。卫星导航接收机对信号的处理可分为。北斗三号B1C/B2a信号采用。北斗三号新增的B1C信号采用。

尘世冰封的专栏 772

十分钟的爬虫erAST解混淆

本文大约4000字,阅读大约时间10分钟。可以一口气读完入门在爬虫er手中如何使用AST去解混淆。

weixin_43971225的博客 1610

游戏开发中的CV:实时动作捕捉与虚拟交互

游戏开发中的CV:实时动作捕捉与虚拟交互​ ,人工智能,计算机视觉,大模型,AI,在当今游戏产业中,玩家对游戏体验的要求日益提高,追求更加真实、沉浸的交互感受。计算机视觉(Computer Vision,CV)技术的飞速发展,为游戏开发带来了革命性的突破,其中实时动作捕捉与虚拟交互技术更是成为提升游戏品质的核心驱动力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

网页爬虫逆向与AST入门系列教程(五、AST的应用之反爬虫技术解析)

反爬虫技术是指网站为了阻止爬虫程序对其内容进行自动化抓取而采取的各种手段和策略。常见的反爬虫技术包括但不限于验证码、动态加载、请求限制等。这些技术旨在增加爬虫程序获取数据的难度,保护网站内容的安全性和稳定性。本文介绍了AST在反爬虫技术解析中的应用。通过理解和使用AST,我们可以更好地分析和解析网页中的反爬虫技术,并找到相应的解决方案。在下一篇文章中,我们将继续探讨AST的其他应用领域,敬请期待!

Jamson 2784

英飞凌 AURIX TC3XX 系列单片机的链接文件

这篇介绍英飞凌 AURIX TC3XX 系列单片机的链接文件,主要是针对使用 SOTA 功能如何修改链接文件,完整地实现 SOTA 功能

大橙子的博客 4385

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

爬虫 JavaScript 逆向进阶!利用 AST 技术还原混淆代码

这是「进击的Coder」的第 617篇技术分享作者:K 小哥来源:K 哥爬虫“ 阅读本文大概需要 47分钟。 ”目录文章较长,可作为 AST Babel 入门手册,强烈建议收藏!什么是 ASTAST(Abstract Syntax Tree),中文抽象语法树,简称语法树(Syntax Tree),是源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源代码中的一种...

静觅 4797

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

基于Python的JS逆向和AST抽象语法树

作用: 主要作用是为了防止js混淆的,一定程度上还原混淆,让代码的可读性提高。而在使用的过程中,我们就不可避免的用到了这个在线解析网站。注意,这里的3是个人口算出来的,在实际操作过程中,是需要获取 "+" 两边的值并计算其结果的。当你觉得你访问的路径已经完成了改完成的事,对代码已经没什么作用了,可以将其删除,可以看到,上面就是一个个的节点,这也是我们再熟悉不过的JSON结构的数据,这样的代码,很少有人能看得懂,但是将其加载到AST中就会变得好看一些。首先,我们在很多网站的源代码中,不可避免的会遇到类似于。

m0_68754495的博客 830

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

AST大批量删除包含某个语句的函数

处理js的目标代码,就是函数的第一句语句是XXX变量名=undefined,比如下边这种。

之度的博客 319

爬虫遇到AST加密怎么办?AST逆向入门到精通

本文深入解析AST加密技术在反爬虫领域的应用与逆向方法。文章首先介绍AST(抽象语法树)的基本概念及其作为反爬虫利器的原理,详细阐述AST加密的语法级混淆、抗静态分析和抗动态调试等优势。随后分析控制流平坦化、死代码注入等常见AST混淆手段及其特征识别方法。重点讲解AST逆向的核心思路与工具准备,包括静态分析、动态调试和AST操作工具的使用,并通过实战案例演示从混淆代码到核心逻辑提取的全过程。最后探讨进阶技巧与伦理边界,强调AST逆向技术已成为爬虫开发者的核心竞争力。

weixin_41943766的博客 2116

网页爬虫逆向与AST入门系列教程(结语)

在本系列教程中,我们深入了解了网页爬虫逆向与AST的原理与应用,掌握了相关的技术和方法。通过学习如何使用AST来分析和处理网页中的代码,我们可以更好地理解网页的结构和逻辑,有效地进行数据提取、反爬虫和安全检测等任务。希望这些知识能够帮助您在实际项目中更好地应用网页爬虫逆向与AST技术,提高开发效率和代码质量。

Jamson 2703

网页爬虫逆向与AST入门系列教程(六、AST的应用之数据提取与分析)

数据提取与分析是指从网页中提取出所需的数据,并对其进行分析、加工和处理的过程。通过数据提取与分析,我们可以从大量的网页中获取有价值的信息。本文介绍了AST在数据提取与分析中的应用。通过理解和使用AST,我们可以更好地实现网页数据的提取和分析,并发掘其中的价值和潜力。在下一篇文章中,我们将继续探讨AST的其他应用领域,敬请期待!

Jamson 2353

AST 三元表达式转if else

ast三元表达式转 if else

bluedream21str的博客 1238

【2021-01-11】AST Babel 还原IFElse混淆学习

目标地址: aHR0cHM6Ly90cmVuZGluc2lnaHQub2NlYW5lbmdpbmUuY29tL2FyaXRobWV0aWMtaW5kZXg= 第一步:怎么获取ifelse混淆的执行流程 (1、需要覆盖原js文件,这样就可以去修改啦 (2、把ifelse混淆所在的函数提取出来,单独拿去插装–>定位执行顺序 var case_node_map = new Map(); window.case_node_map = case_node_map; function mxt_(sign, .

迷心兔的博客 1305

browserify--将js代码解析为AST树并解析AST树

在服务端,nodeJS可以直接使用CommonJS规范来写,运行在浏览器中的前端代码也可以这样写,然后使用browserify可以将其转化为模块化写法,装载依赖模块。其原理就是将js代码字符串解析为AST树,然后遍历AST树分析出require的依赖项,使用我们自己写得require函数来加载依赖项即可。 具体原理可参考:browserify运行原理分析 这里面牵扯到两项比较大的功能,一项

fendouzhe123的专栏 7071
上一篇: 《封号码罗》python爬虫之AST在js逆向中删除冗余代码(二十)
下一篇: 《封号码罗》python爬虫之AST在js逆向中switch-case反控制流平坦化(二十二)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值