python如何解决js逆向混淆?

2023-11-03

JavaScript混淆是一种保护网站安全的技术,混淆可将代码进行多种变形和加密,使得 JavaScript 代码变得难以阅读和理解。逆向混淆是混淆中的一种方式。通过逆向混淆,混淆的代码更难被攻击者分析和了解混淆的含义。Python 是一种强大的编程语言,可以用于处理 JavaScript 混淆代码。下面我们就通过一个例子,详细介绍 Python 如何解决 JavaScript 逆向混淆问题。

首先,让我们来了解一下需要解淆的JavaScript代码。它是一个包含各种混淆技巧的javascript文件。混淆后的代码可见以下代码(示例代码来自于 https://obfuscator.io/):

var _0x413c=['foo','bar','baz','hello\x20world!','log'];(function(_0x30fc94,_0x17c46f){var _0x2ff54f=function(_0x50c0f){while(--_0x50c0f){_0x30fc94['push'](_0x30fc94['shift']());}};_0x2ff54f(++_0x17c46f);}(_0x413c,0x1e7));var _0x4073=function(_0x4124e5,_0x45130a){_0x4124e5=_0x4124e5-0x0;var _0xa28e27=_0x413c[_0x4124e5];return _0xa28e27;};function[_0x4073('0x2')][_0x4073('0x4')](){console[_0x4073('0x3')](_0x413c[0x2]);}console[_0x4073('0x3')](_0x413c[0x3]);

看到上面的代码,可能让我们不得不重新思考:

变量使用短、无意义的名称
压缩过的代码难以阅读,代码几乎没有缩进
混淆代码中没有注释
字符串有编码
函数定义被压缩成一行
我们可以使用 Python 编写脚本进行解密。这里我们采用字符串查找和分割、正则表达式、AST 分析等技术。尽管某些混淆技术会使解混淆变得复杂,但我们可以通过一些简单的技巧来解决大多数混淆问题。

下面是我们对这个JavaScript混淆文件的解淆步骤:

1. 如果需要,使混淆代码可读
首先,我们需要把代码中的编码还原为它们对应的字符。这可以通过正则表达式和 Python 的 Unicode 编/解码来实现。以下是一个 Python 工具函数,可以将字符串中的字符编码转换为可读的字符:

import re

def decode_string(encoded_str):
    return re.sub(r'\\x([a-fA-F0-9]{2})', lambda m: chr(int(m.group(1), 16)), encoded_str)
现在,在代码中使用 decode_string 函数,将所有 \x 编码的字符解密并重写代码:

with open('MixedCodeObfuscated.js', 'r', encoding='utf-8') as f:
    content = f.read()

pattern = re.compile(r'(\\x[A-Za-z0-9]{2})')
matches = pattern.findall(content)

for match in matches:
    content = content.replace(match, decode_string(match))

print(content)


在上面的 Python 代码中,我们将 MixedCodeObfuscated.js 中的混淆代码加载到 content 变量中。然后,定义了一个正则表达式类型的pattern,用于匹配全部的"\x"编码格式。再通过for循环结构把字符码转换为对应的可读的字符。最终,输出解密后的内容。现在,我们已经删除了所有编码字符,使混淆的JavaScript 代码更易于阅读和理解。

var _0x413c = ['foo', 'bar', 'baz', 'hello world!', 'log'];

(function (_0x30fc94, _0x17c46f) {
    var _0x2ff54f = function (_0x50c0f) {
        while (--_0x50c0f) {
            _0x30fc94['push'](_0x30fc94['shift']());
        }
    };
    _0x2ff54f(++_0x17c46f);
}(_0x413c, 0x1e7));

var _0x4073 = function (_0x4124e5, _0x45130a) {
    _0x4124e5 = _0x4124e5 - 0x0;
    var _0xa28e27 = _0x413c[_0x4124e5];
    return _0xa28e27;
};

function logBaz() {
    console[_0x4073('0x3')](_0x413c[0x2]);
}

console[_0x4073('0x3')](_0x413c[0x3]);


2. 重命名函数和变量
变量名和函数名通常是混淆代码中的另一个问题。混淆器通常使用短、无意义的名称来给变量和函数命名,例如 _0x413c 和 _0x4073。这使得代码的阅读和理解变得更加困难。为了重命名函数和变量,我们需要对代码进行解析,并对变量赋予更有意义的名称。

还有一种变量命名方式是使用更有语义的名称,例如,由于在示例混淆文件中有一个函数名是 logBaz,我们可以假设它与 baz 变量相关联。因此,我们可以将其重命名为 logImportantWord。

对于变量和参数名称,我们还可以使用后缀来表示变量和参数的类型。例如,strFoo 表示它是一个字符串类型。

以下是一个 Python 脚本,用于重新命名混淆代码中变量和函数:

import ast
import random
import string
import re

def get_random_name(length):
    chars = string.ascii_lowercase
    return ''.join(random.choice(chars) for i in range(length))

def rename_vars(code):
    tree = ast.parse(code)
    used_names = [node.id for node in ast.walk(tree) if isinstance(node, ast.Name) and not isinstance(node.ctx, ast.Store)]
used_names = set(used_names)

for node in ast.walk(tree):
    if isinstance(node, ast.FunctionDef):
        if node.name.startswith('_'):
            continue
        new_name = get_random_name(8)
        while new_name in used_names:
            new_name = get_random_name(8)
        node.name = new_name
        used_names.add(new_name)
    elif isinstance(node, ast.Name) and not isinstance(node.ctx, ast.Store):
        if len(node.id) < 3 or node.id.startswith('_'):
            continue
        new_name = get_random_name(8)
        while new_name in used_names:
            new_name = get_random_name(8)
        node.id = new_name
        used_names.add(new_name)

return ast.unparse(tree)
with open(‘MixedCodeObfuscated.js’, ‘r’, encoding=‘utf-8’) as f:
content = f.read()

重命名变量和函数
content = rename_vars(content)

输出解密和重命名后的代码
print(content)


在上面的 Python 脚本中,我们首先定义了一个名为 `get_random_name` 的函数,它返回指定长度的随机字符串。接下来,我们使用 Python 的抽象语法树(AST)模块分析了代码。在代码分析过程中,我们提取了每个变量的名称,以便我们可以选择一个新名称来重命名它们。我们使用 `get_random_name` 函数生成一个新的、唯一的名称,并将其分配给变量或函数。最后,我们返回一段新的代码,其中所有变量和函数都被重命名。

那么,重命名之后,我们来看一下解密后的 JavaScript 代码:

var strFoo = ['foo', 'bar', 'baz', 'hello world!', 'log'];

(function (strBaz, intEel) {
    var funcFish = function (intHam) {
        for (--intHam; intHam;) {
            strBaz['push'](strBaz['shift']());
        }
    };
    funcFish(++intEel);
}(strFoo, 487));

var funcImportantWord = function (intCow, ocrJim) {
    intCow = intCow - 0x0;
    var strZoo = strFoo[intCow];
    return strZoo;
};

function logImportantWord() {
    console[funcImportantWord('0x3')](strFoo[0x2]);
}

console[funcImportantWord('0x3')](strFoo[0x3]);


可以看到,所有变量和函数现在都被赋予更有意义的名称,这使得代码更易于阅读和理解。

3. 恢复代码结构
JavaScript 代码混淆通常会改变代码的结构。例如,混淆器可以交换条件语句的顺序、使用三元运算符或条件语句来替代简单赋值语句等。为了使代码更易于阅读和修改,我们可以使用 Python 和 JavaScript Beautifier 库来还原代码的结构。JavaScript Beautifier 可以格式化代码,添加适当的缩进和换行符,使代码更清晰易读。以下是一段示例代码,说明了如何使用 JavaScript Beautifier 还原代码的结构:

import jsbeautifier

def format_code(code):
    options = jsbeautifier.default_options()
    options.indent_size = 4
    options.indent_char = ' '
    options.preserve_newlines = True
    return jsbeautifier.beautify(code, options)

with open('MixedCodeObfuscated.js', 'r', encoding='utf-8') as f:
    content = f.read()

# 解密和重命名代码
content = decode_code(content)
content = rename_vars(content)

# 格式化代码
content = format_code(content)

# 输出解密、重命名和格式化后的代码
print(content)


在上面的示例代码中,我们调用 jsbeautifier.beautify() 函数,并设置了适当的选项来格式化代码。最后,我们返回格式化后的代码。

4. 解密 JavaScript 没那么简单!
需要说明的是,在实践中,解密 JavaScript 代码并不总是如此简单直接。混淆器可以使用各种技巧,使代码更加混淆和难以理解。例如,混淆器可以使用以下技术:

控制流平坦化:这是一种技术,用于将分支结构展平为一系列条件语句,使得代码难以阅读。
字符串加密:混淆器可以将字符串编码,并将其解码为字符数组,以使代码更难以理解。例如,可以使用 Base64、RC4 等加密技术来加密字符串。
基于 AST 的混淆:混淆器可以分析代码抽象语法树,并使用各种技术来重构代码,使其难以理解和修改。
在这样的情况下,解密 JavaScript 代码需要更高级的技术和更深入的理解。可能需要使用自定义脚本、反混淆器和各种 JavaScript 分析和调试工具。

此外,在尝试解密混淆 JavaScript 代码时,需要注意一些安全问题。如果您不是代码的所有者或授权的维护者,请不要尝试破解代码。将黑客工具用于未经授权的代码解密可能会涉嫌违法行为,应该遵守法律和道德准则。

总结:

以上是 Python 解密 JavaScript 逆向混淆的初步介绍。在实践中,解密混淆的 JavaScript 代码需要更深入的理解和高级技术。但是,通过 Python 脚本、正则表达式、AST 分析和 JavaScript Beautifier,我们可以为大多数混淆技术找到解决方案,并使代码更易于阅读和理解。在尝试解密混淆 JavaScript 代码时,请注意安全问题,遵守法律和道德准则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python如何解决js逆向混淆? 的相关文章

  • 从 thymeleaf 获取数据到模态引导程序、jquery

    我正在尝试获取模态视图的 id 这是为了更新 onclick 元素 但我找不到方法 知道如何为 boostrap 5 完成此操作 或我可以用其他方法吗 谢谢 tr a inactivate a div class modal fade mo
  • 使用 vscode 调试器调试 next.js

    我已经使用安装了一个项目创建下一个应用程序 https github com segmentio create next app 我需要使用我的编辑器 vscode 调试服务器端渲染 所以我访问过vscode recipes 如何调试 ne
  • React js Stripe 结账不起作用

    我正在尝试在 React js 应用程序中呈现条带结账默认表单
  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • 不和谐机器人 |不和谐.js |类型错误:无法读取未定义的属性“长度”

    我正在制作一个 Discord 机器人 并且正在使用 CodeLyon 的视频作为参考 该错误位于我的 message js 文件中 该文件包含以下内容 require dotenv config create cooldowns map
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 我想检查 $('#td1').text() === "x" 是否?

    我想检查innerHtml是否有X或O 所以我不能再次添加任何其他东西 但它不起作用 添加检查代码后它就停止了 我在这里尝试做一个简单的XO游戏来更熟悉javascript和jquery 我也不确定是否可以用 jQuery 做到这一点
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • AcWing 1293. 夏洛克和他的女朋友 二分图

    题 是一个二分图染色 质数不是质数的质因子 因为质数不会有因子 所以质数全是颜色1 合数不是合数的质因子 因为合数不 质 所以合数全都是颜色2 n小于3的时候只有1种颜色 其他都是2种颜色 include
  • 计算机网络教程_复习整理第一章

    计算机网络教程 复习整理第一章 第一章 概述 第二章 物理层 第三章 数据链路层 文章目录 计算机网络教程 复习整理第一章 1 因特网 因特网的标准制定流程 2 电路交换 报文交换 分组交换 区分三者 3 计算机网络的性能指标 lt 速率
  • d3dcompiler_43.dll缺失怎么修复

    有网友在玩游戏时出现 无法启动程序 因为计算机中丢失d3dcompiler 43 dll 尝试重新安装该程序以解决问题 的提示 那么是什么原因造成丢失d3dcompiler 43 dll呢 缺少d3dcompiler 43 dll文件怎么办
  • GLUE数据集介绍:RTE、MRPC、SST-2、QNLI、MNLI、QQP

    自然语言处理 NLP 主要包括自然语言理解 NLU 和自然语言生成 NLG 为了让NLU任务发挥最大的作用 来自纽约大学 华盛顿大学等机构创建了一个多任务的自然语言理解基准和分析平台 也就是GLUE General Language Und
  • SpringBoot注解

    使用注解的优势 1 采用纯java代码 不在需要配置繁杂的xml文件 2 在配置中也可享受面向对象带来的好处 3 类型安全对重构可以提供良好的支持 4 减少复杂配置文件的同时亦能享受到springIoC容器提供的功能 一 注解详解 配备了完
  • HIve中的查询语句

    文章目录 Hive中的查询语句 1 基础语法 2 基本查询 Select From 2 1 数据准备 0 原始数据 1 创建部门表 2 创建员工表 3 导入数据 2 2 全表和特定列查询 1 全表查询 2 选择特定列查询 2 3 列别名 1
  • kafka相关操作命令

    kafka相关操作命令 原文链接 https blog csdn net wf3612581 article details 81842574 1 开启zookeeper集群 startzk sh 2 开启kafka集群 start kaf
  • 【修电脑】VMware 从GHO文件备份恢复Win10/Win7系统

    修电脑 VMware 从GHO文件备份恢复Win10 Win7系统 注意 参考 硬盘知识 一 硬盘接口的分类 二 硬盘的分类 按照硬盘材质分为两大类 按照接口类型区分 boot启动知识 Legacy BIOS引导 uefi引导启动流程 查看
  • 区块链关键机制分析

    区块链中三大关键机制 密码算法 1 Hash算法 2 非对称加密算法 3 数字签名 存储结构 共识机制 1 工作量证明 POW 2 权益证明 POS 3 股份授权证明 DPOS 4 实用拜占庭容错 PBFT 5 Raft算法 6 Rippl
  • ubuntu18.04升级cmake

    下载cmake cmake官网 https cmake org download sudo apt get install y build essential libssl dev wget https github com Kitware
  • C++ 的 decltype 详细介绍

    1 基本介绍 decltype 是 C 11 新增的一个用来推导表达式类型的关键字 和 auto 的功能一样 用来在 编译时期 进行自动类型推导 引入 decltype 是因为 auto 并不适用于所有的自动类型推导场景 在某些特殊情况下
  • 大数据学习连载03篇:分布式技术(集群、负载、弹性、故障等知识点)

    分布式技术 一 为什么需要分布式 1 计算问题 无论是我们在学校刚开始学编程 还是在刚参加工作开始处理实际问题 写出来的程序都是很简单的 因为面对的问题很简单 以处理数据为例 可能只是把一个几十K的文件解析下 然后生成一个词频分析的报告 很
  • 怎么debug_装完机电脑点不亮怎么办?不妨看看你主板上的Debug灯

    Hello大家好 我是兼容机之家的小牛 如果你加入了一个电脑硬件爱好者的群 那么你肯定会发现一件事 那就是每天都会有小白装机点不亮在群里求助 问群问了大半天也没弄好 小牛今天来教你一个窍门 能快速判断好自己的电脑到底出了什么故障 既然你自己
  • Python实战项目:flask人脸识别图书系统(上)

    flask人脸识别图书系统 上 涉及内容 爬虫 开发 数据分析 a 前端界面的技术 gt jquery bootstrap b 后面逻辑 gt flask 前后端半分离技术 使用模块 flask 蓝图 blue print c 收集的图书数
  • Qt 5.9.7的安装及配置环境变量

    1 安装 Qt 5 9的安装跟以前的版本略有不同 选择组件时分成Qt 5 9和Tools 注意此时要勾选Qt 5 9下的MinGW 安装空间会一下增大4G左右 果断差评 不然后面通过QtCreator编译时无法添加选项 Tools下面也有一
  • AndroidKiller安装-配置-更新apktool

    下载安装好AndroidKiller后 需要对其进行配置以及更新apktool 接下来我就为大家讲解详细操作流程 1 选择配置选项 2 选择java然后配置好jdk的工程路径 切记要给到bin目录下才可以 如果是第一次打开并没有配置jdk目
  • Kamil and Making a Stream【Codeforces Round #588 (Div. 2) E】【dfs + map】

    Codeforces 1230 E 也没怎么读题 就看了下样例的note就知道了是对树上的直系祖先对子结点的链上gcd求和 然后就可以直接这样去跑一遍 个人比较的喜欢踩坑 有正着走的不走 偏偏选择了从根节点返回回来的答案 这样的做法虽然上是
  • 二叉树:链式存储结构基础操作(C语言)

    操作包含 1 二叉树的构造 先序序列和中序序列 中序序列和后序序列 2 利用三种遍历方式输出 先序遍历 中序遍历 后序遍历 层次遍历 每种遍历包含递归和非递归两种算法 3 栈和队列的构造 C 模板 均为顺序存储结构 main cpp 1 构
  • python爬取多个网页内容——招聘网站

    python爬虫思路 此次爬虫获取leipin网站上的招聘信息 liepin ningde 首先右击网页 检查 获取网页代码 点击网络 刷新网页 得到网页URL以及请求方法 首先在python环境中安装各种库 import requests
  • python如何解决js逆向混淆?

    JavaScript混淆是一种保护网站安全的技术 混淆可将代码进行多种变形和加密 使得 JavaScript 代码变得难以阅读和理解 逆向混淆是混淆中的一种方式 通过逆向混淆 混淆的代码更难被攻击者分析和了解混淆的含义 Python 是一种