gpt4 book ai didi

python-3.x - 可以从脚本执行 Python 字节码吗?

转载 作者:行者123 更新时间:2023-12-04 11:04:32 26 4
gpt4 key购买 nike

假设我有一个正在运行的 CPython session ,

有没有办法从 bytes 运行数据( pyc )直接存档?
(不必将数据放在磁盘上,也不必编写临时 pyc 文件)

显示简单用例的示例脚本:

if foo:
# Intentionally ambiguous, since the data source
# is a detail and answers shouldn't depend this detail.
data = read_data_from_somewhere()
else:
data = open("bar.pyc", 'rb').read()

assert(type(data) is bytes)

code = bytes_to_code(data)

# call a method from the loaded code
code.call_function()

确切的使用并不重要,但动态生成代码并通过网络复制以执行是一个用例(为了考虑这个问题)。

以下是一些示例用例,这让我很想知道如何做到这一点:
  • 检查 Python 脚本中的恶意代码。如果单个命令可以访问隐藏在二进制数据中的更大的代码体,那么该命令会是什么样子?
  • 动态生成代码并将其缓存以供重用(不一定在磁盘上,例如可以使用数据库)。
  • 能够将预编译的字节码发送到进程,控制嵌入 Python 的应用程序,例如。
  • 最佳答案

    Is there a way to run the data from a pyc file directly?



    编译后的代码对象可以使用 marshal 保存
    import marshal
    bytes = marshal.dumps(eggs)

    字节可以转换回代码对象
    eggs = marshal.loads(bytes)
    exec(eggs)

    一个 pyc文件是一个带有 header 的编码代码对象

    对于 Python3,header 为 12 字节需要跳过,剩余数据可以通过 marshal.loads 读取。 .

    Ned Batchelder's blog post :

    At the simple level, a .pyc file is a binary file containing only three things:

    • A four-byte magic number,
    • A four-byte modification timestamp, and
    • A marshalled code object.


    注意,链接引用了 Python2,但它在 Python3 中几乎相同, pyc header 大小仅为 12 而不是 8 个字节。

    关于python-3.x - 可以从脚本执行 Python 字节码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29897480/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com