如何完全反汇编Python源代码

2024-03-18

我一直在玩dis库来反汇编一些Python源代码,但我发现这不会递归到函数或类中:

import dis

source_py = "test.py"

with open(source_py) as f_source:
    source_code = f_source.read()

byte_code = compile(source_code, source_py, "exec")
dis.dis(byte_code)

我所看到的都是诸如以下的条目:

 54         456 LOAD_CONST              63 (<code object foo at 022C9458, file "test.py", line 54>)
            459 MAKE_FUNCTION            0
            462 STORE_NAME              20 (foo)

如果源文件有一个函数foo(),我显然可以在源文件中添加类似以下内容:

dis.dis(foo)

我无法弄清楚如何在不更改源文件并执行它的情况下执行此操作。我希望能够从编译后的文件中提取相关字节byte_code并将它们传递给dis.dis().

def sub_byte_code(byte_code, function_or_class_name):
    sub_byte_code = xxxxxx
    dis.dis(sub_byte_code)

我考虑过包装源代码并执行dis.dis()如下,但我不想执行该脚本:

source_code_dis = "import dis\n%s\ndis.dis(foo)\n" % (source_code)
exec(source_code_dis)

也许有一个调用它的技巧吗?例如dis.dis(byte_code, recurse=True)


将文件作为模块导入并调用dis.dis()在该模块上。

import dis
import test

dis.dis(test)

您还可以从命令行执行此操作:

python -m dis test.py

引用自的文档dis.dis https://docs.python.org/2/library/dis.html#dis.dis:

对于一个模块来说,它拆解了所有的函数。

Edit:从 python 3.7 开始,dis.dis是递归的。

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

如何完全反汇编Python源代码 的相关文章

随机推荐

  • 显示 Laravel 中注册的路线

    在此截屏视频中 https tutsplus com lesson displaying registered routes https tutsplus com lesson displaying registered routes Je
  • 无法从容器连接到远程 SQL 服务器

    我正在尝试从计算机上托管的 docker 容器连接到远程 SQL 服务器 但刚刚收到以下错误 与 SQL Server 建立连接时发生与网络相关或特定于实例的错误 找不到服务器或无法访问服务器 检查实例名称是否正确以及 SQL Server
  • 一维线段/范围相交测试:解决方案名称?

    我已经制定了一种方法来测试是否有两个一维线段 范围 因此将范围定义为 min max 给定范围的两个实例 a min max b min max 我使用以下方法来测试它们是否相交 a max b min b max a min gt 0 我
  • 如何从 ActivityInfo 类获取 android:configChanges 值

    我想获取设备中存在的所有包的活动信息 例如配置更改 调整大小模式 如果支持画中画 我可以使用获取活动信息PackageManager with GET ACTIVITIES旗帜 这样我就可以得到configChanges价值利用Activi
  • Gradle实验性android库模块依赖未执行

    我正在使用 gradle 实验插件 0 7 3 在我的项目中 我有几个本机模块 它们静态链接到我的 android 库模块 其中从它们构建共享库并在库 java 代码中使用 然后 库模块将用作应用程序的依赖项 依赖项添加如下 depende
  • 这个函数是 O(N+M) 还是 O(N*M)?

    def solution M A result 0 M maxCount 0 setAll 0 for i in range 0 len A if A i M 1 setAll maxCount maxCount 0 result 0 M
  • 这个 .tlh 文件是否正确,如果不正确,那么如何生成正确的文件?

    我试图从非托管 C 代码调用 NET 4 0 dll 我按照中的说明进行操作 我构建了 NET dll 并遵循了所有步骤 包括使用 regasm 注册它 接下来 我创建了一个非托管 C 项目 并在 cpp 文件的开头添加了这一行 impor
  • gulp-nunjucks-html + gulp-data 未在手表上编译

    我编写了一个 gulp 任务来从 json 文件中获取数据并将其处理为 html 当我第一次运行构建时 这就像一个魅力 但是我设置了一个监视任务来执行此操作 尽管它会将 nunjucks 文件重建为 html 但它似乎会忽略 json 直到
  • 为什么不带参数的 git rebase 会这样工作?

    每隔一段时间我就会表演一次git rebase不带参数 发现 Git 没有根据我配置的上游进行变基 而是使用了 fork point选项并重新基于 其他东西 导致我的承诺消失 这与文档的内容一致git 变基 https git scm co
  • 如何返回邮政编码列表 ## 英里半径内的所有实例

    SQL Server 2008 添加了一些很酷的新空间类型 并为 SQL 开发人员提供了更强大的操作空间数据的方法 但它仍然让我无法有效地返回 例如 仅返回长列表的 英里半径内的位置邮政编码 20 到 15 000 个不同的邮政编码 有没有
  • H2、HSQLDB 或任何其他使用 InputStream 的嵌入式数据库

    我可以使用 H2 HSQLDB 或任何其他嵌入式数据库吗 InputStream而不是文件 我打算使用AssetManager open http developer android com reference android conten
  • 在Java中,如何在数组中存储大数字?

    在Java中 如何将数字存储在数组中 我的意思是非常长的数字 例如高达1万亿 这样我就可以访问它们并用文字打印出它们是什么 1万亿不是that大 只需使用一个long 它可以存储大至 9223372036854775807 超过五亿 的数字
  • 查询 Pandas 中的 NaN 和其他名称

    假设我有一个数据框df有一个柱子value保存一些浮点值和一些NaN 我怎样才能获得我们拥有的数据框部分NaN 使用查询语法 例如 以下内容不起作用 df query value lt 10 or value NaN I get name
  • 更改 django models related_name 属性是否需要向南迁移?

    我有一个带有外键的简单 django 模型 class FooModel models Model foo models ForeignKey Foo related name foo choices bar models CharFiel
  • 在 Webpack 中加载静态 JSON 文件

    我的代码中有以下构造 var getMenu function return window fetch portal content json menu json then function data return data json 我尝
  • python pack 4字节整数,字节数组位于bytearray struct.pack中

    我正在尝试使用 struct pack 将 python bytearray 的内容打包为 4byte 有符号整数 不幸的是 pack 想要一个字符串 所以经过一番谷歌搜索后 我认为我需要将字节数组解码为字符串 我认为 ascii 的意思是
  • 通过 API GW 调用时,AWS Lambda Go 函数未获取请求正文

    首先 有人可能会说这个问题非常类似于HTTP 请求正文无法通过 AWS API Gateway 访问 AWS lambda 函数 https stackoverflow com questions 41059440 http request
  • 集合removeAll忽略大小写?

    好的 这是我的问题 我必须HashSet的 我用的是removeAll方法从一组中删除存在于另一组中的值 在调用该方法之前 我显然将这些值添加到Sets 我打电话 toUpperCase 在各个String在添加之前 因为两个列表中的值的情
  • 显示菜单使光标消失

    单击时光标消失 如下所示 如何重现 获取 Game Jam 菜单模板 https www assetstore unity3d com en content 40465 https www assetstore unity3d com en
  • 如何完全反汇编Python源代码

    我一直在玩dis库来反汇编一些Python源代码 但我发现这不会递归到函数或类中 import dis source py test py with open source py as f source source code f sour