【问题标题】:Is it possible to get python bytecode without using co_code?是否可以在不使用 co_code 的情况下获取 python 字节码?
【发布时间】:2012-09-12 21:28:23
【问题描述】:

假设我在python解释器中,定义一个函数如下:

def h(a):
  return a

如果我想查看字节码(不是使用 dis 的反汇编),我通常可以使用 h.func_code.co_code。有没有其他方法可以查看字节码?

例如,在解释器中,如果我只键入h 而不使其成为函数调用,我会得到函数的地址。我可以使用该地址来获取字节码吗?还有其他方法吗?

来自 cmets 的一些附加信息:

该应用程序是用 python 编写的,并使用 Py2App、cx_freeze 或 py2exe 等工具进行打包。我在可执行文件上玩了一些技巧,现在,当启动时,可执行文件将我转储到 python 命令行。从那里,我手动将我的函数 h 输入到 interepeter 中。

h.func_code 的其他属性存在,例如co_varnamesco_argcount 等,但co_code 不存在。

如果我在解释器中输入h.func_code.co_code,我会得到'code' object has no attribute 'co_code'

更新:再次来自 cmets。据我所知,操作码已针对应用程序附带的 python 解释器重新映射。

【问题讨论】:

  • 为什么h.func_code.co_code 不够好?使用内存地址不会更容易。
  • 因为某种原因它不存在。我正在学习 python 逆向工程,似乎在该软件中添加了一些保护措施。其中之一似乎使 co_code 不可用。
  • 对于初学者,你知道它是用 Python 编写的吗? type 是什么? (另外,dir can be overriden by the object,不要把你的农场押在它的产量上。)
  • @mikeazo 看起来不像是版本字符串。 完整版字符串是什么?
  • 理论上可以从python解释器中删除co_code属性。那将需要自定义解释器构建。您仍然可以将所有 python 代码加载到您自己的解释器中(只需解压缩 Contents/Resources/ 目录中的 zip 文件并将它们放在您的路径上。

标签: python reverse-engineering bytecode


【解决方案1】:

如果您定义了自己的def h(): pass 虚拟函数,并且该函数没有.func_code.co_code 值,那么很可能包含的python 解释器是一个自定义编译版本,其中co_code 插槽已被清除。

解决方法很简单,将Contents/Resources 压缩文件(在所有子目录中)复制到别处,将它们添加到您的PYTHONPATH 并将代码导入您自己的解释器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 2012-06-27
    • 2021-09-21
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多