将 python 反汇编从 dis.dis 转换回 codeobject

2024-01-27

有没有办法从通过获取的反汇编中创建代码对象dis.dis?

例如,我使用编译了一些代码co = compile('print("lol")', '<string>', 'exec')然后使用打印反汇编dis.dis(co),现在我想将反汇编“编译”回代码对象(因为它保存所有相同的数据并且不会丢失任何内容)。


令人惊讶的是,是的——有点。

但是,您需要了解许多注意事项。第一个需要注意的是,Python 字节码以及扩展的汇编指令可以更改每个版本。要理解的第二个警告是,简单地发出的信息dis.dis()文本形式对于 Python 解释器的需求来说是不完整的。因此,您需要一种方法来填充缺失的信息。

我写了一个字节码汇编器 https://pypi.org/project/xasm/它将类似于上面的文本文件程序集转换为 python 字节码。

在您的示例中,您有一个代码对象,而不是创建字节码文件所需的完整信息,但是xasm当然,在使用字节码文件中所需的附加信息写出代码对象之前,先创建代码对象。这是在函数中完成的create_code() of https://github.com/rocky/python-xasm/blob/master/xasm/assemble.py https://github.com/rocky/python-xasm/blob/master/xasm/assemble.py

为了了解代码对象中的内容以及它如何适合 Python 字节码文件之间的区别,我将使用您的示例,然后完成如何创建字节码文件。

如果我在 Python 3.6.10 中运行你的示例,我会得到:

  1           0 LOAD_NAME                0 (print)
              2 LOAD_CONST               0 ('lol')
              4 CALL_FUNCTION            1
              6 POP_TOP
              8 LOAD_CONST               1 (None)
             10 RETURN_VALUE

但是如果我将你的 Python 代码放入一个文件中,比如说foo.py,使用字节编译它py_compile.compile(source, bytecode, source)和使用xdis https://pypi.org/project/xdis/的跨版本Python反汇编器pydisasm I get:

  # pydisasm version 4.2.4
  # Python bytecode 3.6 (3379)
  # Disassembled from Python 3.6.10 (default, Jan 23 2020, 16:43:38) 
  # [GCC 7.4.0]
  # Timestamp in code: 1586703495 (2020-04-12 10:58:15)
  # Source code size mod 2**32: 13 bytes
  # Method Name:       <module>
  # Filename:          foo.py
  # Argument count:    0
  # Kw-only arguments: 0
  # Number of locals:  0
  # Stack size:        2
  # Flags:             0x00000040 (NOFREE)
  # First Line:        1
  # Constants:
  #    0: 'lol'
  #    1: None
  # Names:
  #    0: print
    1:           0 LOAD_NAME                 0 (print)
                 2 LOAD_CONST                0 ('lol')
                 4 CALL_FUNCTION             1
                 6 POP_TOP
                 8 LOAD_CONST                1 (None)
                10 RETURN_VALUE

请注意,在字节码文件中,有一些严格意义上不属于代码对象的附加信息:

  • 正在使用哪个字节码(3.6,幻数 3379),
  • 创建代码的时间戳,
  • 源代码的大小 (mod 2**32),
  • 方法名称,
  • 一个文件名,
  • 代码的参数,
  • 方法标志,以及
  • 各种名称:常量、变量。

现在让我们把它放到一个文件中,比如foo2.pyasm。要将其写入字节码文件,只需运行pyc-xasm:

  $ pyc-xasm foo2.pyasm
  Wrote foo2.pyc
  $ python foo2.pyc
  lol

我在我的作品中演示了所有这一切PyColumbia 2018 的 2018 年照明演讲 https://rocky.github.io/pycon2018-light.co/

我应该注意,直到下一个版本xasm and xdis,Python 3.7 及更高版本不起作用,但 3.6 及更早版本可以。 罢工>

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

将 python 反汇编从 dis.dis 转换回 codeobject 的相关文章

  • Python获取正确时区的当前时间[重复]

    这个问题在这里已经有答案了 现在我用 import datetime print datetime datetime now strftime X 将当前时间显示为字符串 问题是 我的计算机正在运行Europe Berlin时区 这里不考虑
  • Windows 中的 Python 多处理池奇怪行为

    Python 多处理池在 Linux 和 Windows 之间有不同的行为 当按工作人员数量运行方法映射时 在 Linux 中 它会在您作为参数提供的特定函数的范围内运行该进程 但在 Windows 中 每个工作进程都在父进程的范围内运行
  • 如何打印脚本的每一行,因为它仅针对正在运行的顶级脚本运行?

    python 跟踪模块将允许您运行一个脚本 打印每一行代码 因为它在脚本和所有导入的模块中运行 如下所示 python m trace trace myscript py 有没有办法做同样的事情 但是only打印顶级调用 即仅打印以下行my
  • setColumnStretch 和 setRowStretch 如何工作

    我有一个使用构建的应用程序PySide2它使用setColumnStretch用于柱拉伸和setRowStretch用于行拉伸 它工作得很好 但我无法理解它是如何工作的 我参考了 qt 文档 但它对我没有帮助 我被困在括号内的两个值上 例如
  • MacOS Big Sur 中的 NPM 错误“找不到 Python 可执行文件”

    我已经花了整整一周的时间寻找这个问题的答案 但没有成功 我查看了每个 StackOverflow 帖子 Google 的每一篇文章以及我能找到的每个相关的 Github 问题 大多数相关错误似乎都比较旧 所以我想知道我的问题是否由于我使用的
  • 导入 SciPy 或 scikit-image,“from scipy.linalg import _fblas:导入错误:DLL 失败”

    我正在导入 from scipy import misc io 但我收到这些错误 Traceback most recent call last File C work asaaki code generateProposals py li
  • 如何检查给定的数字是否是2的幂?

    下面的代码不适用于某些输入 a i set 1 while i lt 10000 a add i i lt lt 1 N int input if N in a print True else print False 我最初的想法是检查每个
  • 清理 MongoDB 的输入

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • Plotly:如何设置文本格式(下划线、粗体、斜体)

    使用注释时 我尝试在绘图中为文本添加下划线 我使用添加注释 import plotly graph objects as go g go FigureWidget make subplots rows 1 cols 1 g update l
  • python 硒 按名称查找元素

    查找电子邮件输入的正确代码是什么https accounts google com ServiceLogin html 是
  • Pandas 根据条件替换数据框值

    我有一个主数据框 df Colour Item Price Blue Car 40 Red Car 30 Green Truck 50 Green Bike 30 然后我有一个价格修正数据框 df pc Colour Item Price
  • 哈希 freezeset 与排序元组

    在 Python 中 给定一组可比较的 可散列的元素s 散列是否更好frozenset s or tuple sorted s 这取决于你在做什么 创建一个更快frozenset 比排序tuple but frozenset占用的内存比tu
  • 如何读取多个文件并将它们合并到一个 pandas 数据框中?

    我想读取位于同一目录中的多个文件 然后将它们合并到一个 pandas 数据框中 如果我这样做的话它会起作用 import pandas as pd df1 pd read csv data 12015 csv df2 pd read csv
  • 数据类和属性装饰器

    我一直在阅读 Python 3 7 的数据类 作为命名元组的替代品 我通常在必须将数据分组到结构中时使用它 我想知道数据类是否与属性装饰器兼容 以便为数据类的数据元素定义 getter 和 setter 函数 如果是这样 是否在某处进行了描
  • 从 SUDS 中的 SOAP 响应中提取 Cookie

    我必须使用具有多种服务的 API 所有这些都需要来自下面的身份验证的 JSESSION cookie 然而 当我调用下一个服务时 它不会保留 cookie 因此会拒绝它们 from suds client import Client url
  • 如何通过 API Gateway 使用事件调用类型调用 Lambda 函数?

    文件说 默认情况下 Invoke API 采用 RequestResponse 调用类型 您可以选择通过将 Event 指定为 InitationType 来请求异步执行 因此 我可以发送到我的函数 python 的就是到处都是 Inspi
  • 阻止 BeautifulSoup 将我的 XML 标签转换为小写

    我正在使用 BeautifulStoneSoup 来解析 XML 文档并更改一些属性 我注意到它会自动将所有 XML 标签转换为小写 例如我的源文件有
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 基于 Web 请求在 Airflow 上运行作业

    我想知道是否可以在通过 HTTP 收到请求时执行气流任务 我对 Airflow 的调度部分不感兴趣 我只是想用它来代替芹菜 因此 示例操作如下所示 用户提交一份表格 请求某些报告 后端接收请求并向用户发送请求已收到的通知 然后后端使用 Ai
  • python:日志记录:我们可以向记录器添加多个过滤器吗?考虑哪一个

    我试图了解 Python 日志记录中的多个过滤器 一个在配置中定义 另一个在代码中定义 如何工作 我正在开发一个 Django 项目 下面是我在 settings py 中的记录器配置 我的目标是switch on and switch o

随机推荐

  • 在matlab中计算列相关性的快速方法是什么

    我有两个非常大的矩阵 60x25000 我想仅计算两个矩阵之间的列之间的相关性 例如 corrVal 1 corr mat1 1 mat2 1 corrVal 2 corr mat1 2 mat2 2 corrVal i corr mat1
  • 我想我发现了一个“不存在的单子”

    我发现 Haskell 的一个奇怪的特性让我相信我的思考方式是错误的 我认为在Haskell中 应该有一些 不存在的 单子 这是因为以下原因 Prelude gt return 1 1 Prelude gt return 1 gt gt x
  • 是否可以将一列引用为多个外键?

    I have few tables and I want to reference one column from PDF table to multiple other tables 例如 如果 PDF 表格select输出看起来像这样
  • 使用 C++ 数组中出现次数最多的元素?

    我尝试过以下代码来获取数组中出现次数最多的元素 它运行良好 但唯一的问题是 当有两个或多个元素具有相同的出现次数并且等于最多出现的元素时 它只显示扫描的第一个元素 请帮助我解决这个问题 include
  • 用自定义激活替换 sigmoid 激活

    我正在尝试用分段线性函数替换 Keras sigmoid 函数 定义如下 def custom activation 4 x if x lt 6 return 0 elif x gt 6 and x lt 4 return 0 0078 x
  • 使用仅 getter 自动属性显式实现接口(C# 6 功能)

    使用自动属性进行显式接口实现在 C 5 中是不可能的 https stackoverflow com a 3905035 1565070 但现在 C 6 支持仅 getter 自动属性 http www c sharpcorner com
  • 如何等待2秒?

    如何导致执行延迟指定的秒数 这不这样做 WAITFOR DELAY 00 02 正确的格式是什么 的文档WAITFOR http msdn microsoft com en us library ms187331 aspx没有明确规定所需的
  • 如何使用python列出Kafka消费者组

    我想用 python 获取 Kafka 消费者组列表 但我不能 我使用zookeeper python客户端 kazoo 但消费者组列表为空 因为此方法适用于旧消费者 而我们不使用旧消费者 如何使用python代码获取消费者组列表 kafk
  • std::mutex::lock 阻塞 CPU 使用

    我希望能够随意冻结和解冻线程 我目前的解决方案是通过回调和忙等待睡眠来完成的 这显然不是一个最优解 我正在考虑让主线程锁定互斥体 然后让从属线程运行一个锁定和解锁同一互斥体的函数 我担心的是 如果是真正的繁忙等待 可能会占用 CPU 资源
  • IsAssignableFrom() 在应该返回 true 时返回 false

    我正在开发一个加载指定文件夹中包含的 dll 的插件系统 然后 我使用反射来加载程序集 迭代它们包含的类型并识别任何实现我的程序集IPlugin界面 我正在使用类似于以下的代码进行检查 foreach Type t in myTypes i
  • 在 ExtendScript for Illustrator 中执行外部脚本

    Summary 有没有办法使用execute 函数将参数传递给Python脚本 并让Python脚本在执行时使用该参数 然后将结果返回给ExtendScript 语境 我正在为 Illustrator 构建一个脚本 该脚本必须查询 Web
  • MapStruct 可以对 Hibernate 实体类进行深度代理吗

    对于想要直接返回实体类的 Web 服务开发人员来说 这是一个常见问题 即使加载了我需要的所有数据 仍然有许多我不需要的未初始化的代理和集合 我希望他们只返回 null 而不是抛出延迟加载异常 基本上我只想要 POJO 合约 但是必须清除代理
  • randperm() 可以生成多个随机排列吗?

    在Matlab中 p randperm n k 返回一个行向量 其中包含从 1 到 n 含 中随机选择的 k 个唯一整数 一次调用 randperm 是否可以返回多行向量 每一行都如上所示 如果没有 是否有其他方法来生成几个随机排列 在这种
  • 如何跨 DLL 边界使用 Boost.Log?

    我正在尝试整合升压日志 http www boost org doc libs 1 55 0 libs log doc html index html在一个相当大的应用程序中 该应用程序由一个从 DLL 动态加载插件的主应用程序组成 最初的
  • PowerPoint VBA - 定期更新 Excel 中的链接图

    我正在尝试构建这个系统 其中包含来自外部 Excel 文件的链接图的 PowerPoint 演示文稿 我发现我可以在 PowerPoint 中右键单击该图表 然后单击 更新链接 该图表就会自动更新 但如果我想要自动化怎么办 如果这可以在不创
  • Blazor InputText 在 TextChanged 时调用异步方法

    我尝试捕获 Blazor 服务器端 中输入文本的文本更改 然后调用异步方法来检查输入是否是正确的优惠券代码 HTML
  • WinForms 标签不希望透明的原因是什么?

    为什么无法将标签的背景颜色设置为透明 我以前做过 但现在只是不想 我创建了一个新的用户控件 为其添加了进度条和标签 当我将标签的背景颜色设置为透明时 它仍然是灰色 这是为什么 我想要的是将标签放在进度条顶部 以便其文本位于进度条 中 向您的
  • 除了 WebServiceGatewaySupport#getWebServiceTemplate() 之外,还有其他方法在 Spring Boot 中获取 WebServiceTemplate 吗?

    Spring 提供了org springframework ws client core support WebServiceGatewaySupport类 这是根据Spring文档 http docs spring io spring w
  • 在 NSArray 中查找具有给定时间(例如晚上 8 点)之后的某个时间的 NSDate?

    Objective C 中是否有一种快速方法可以识别 NSArray 中的 NSDate 在给定时间 例如晚上 8 点 之后的某个时间 除了手动遍历数组中的每个 NSDate 然后使用 NSDateComponents 来分解小时 分钟 秒
  • 将 python 反汇编从 dis.dis 转换回 codeobject

    有没有办法从通过获取的反汇编中创建代码对象dis dis 例如 我使用编译了一些代码co compile print lol