Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从函数创建pyc文件?_Python_Reverse Engineering_Bytecode_Pyc - Fatal编程技术网

Python 如何从函数创建pyc文件?

Python 如何从函数创建pyc文件?,python,reverse-engineering,bytecode,pyc,Python,Reverse Engineering,Bytecode,Pyc,我在一个用python编写的游戏中,我可以访问所有模块及其函数 我不想得到一些更大的函数的.pyc文件,这样我就可以通过dePython或类似的东西来实现它。手动读取这些函数将是一个巨大的痛苦 假设我有Module.function,我该怎么做才能将该函数放入.pyc文件 谢谢 您可以导入模块以自动生成.pyc,或者如果您更喜欢以编程方式进行,请使用py\u compile模块:函数write\u pycfile()可以编写pycfile。它需要一个“asm”对象,但它基本上需要一个Python

我在一个用python编写的游戏中,我可以访问所有模块及其函数

我不想得到一些更大的函数的.pyc文件,这样我就可以通过dePython或类似的东西来实现它。手动读取这些函数将是一个巨大的痛苦

假设我有Module.function,我该怎么做才能将该函数放入.pyc文件


谢谢

您可以导入模块以自动生成
.pyc
,或者如果您更喜欢以编程方式进行,请使用
py\u compile
模块:

函数
write\u pycfile()
可以编写pycfile。它需要一个“asm”对象,但它基本上需要一个Python解释器版本和一个要编写的代码对象列表。它使用的函数主要来自。下面是一个经过修改的版本,基本上展示了它是如何工作的:

import xdis
from xdis import PYTHON3
from xdis.magics import magics
from xdis.marsh import dumps
from struct import pack
import time


def write_pycfile(pyc_file, code_list, version=xdis.PYTHON_VERSION):
    if PYTHON3:
        file_mode = 'wb'
    else:
        file_mode = 'w'

    with open(pyc_file, file_mode) as fp:
        fp.write(magics[version])
        timestamp = int(time.time())
        fp.write(pack('I', timestamp))
        if version > 3.2:
            fp.write(pack('I', 0))
        for co in code_list:
            try:
                co_obj = dumps(co, python_version=str(version))
                if PYTHON3 and version < 3.0:
                    co_obj = str.encode(co_obj)
                    pass

                fp.write(co_obj)
            except:
                pass
            pass
    print("Wrote %s" % pyc_file)

write_pycfile("/tmp/test_pyc.pyc", [write_pycfile.__code__])
最后,使用以下方法进行反编译:

$uncompyle6/tmp/test_pyc.pyc
#uncompyle6版本3.6.5
#Python字节码3.6(3379)
#反编译自:Python 3.8.1(默认值,2020年1月23日,17:02:14)
#[GCC 7.4.0]
#嵌入文件名:/tmp/write-pyc.py
#编制时间:2020-04-17 08:21:26
如果PYTHON3:
文件模式='wb'
其他:
文件模式='w'
打开时(pyc_文件,文件模式)为(fp):
fp.write(magics[版本])
timestamp=int(time.time())
fp.写入(包('I',时间戳))
如果版本>3.2:
fp.写入(包('I',0))
对于代码列表中的co:
尝试:
co_obj=dumps(co,python_version=(str(version)))
如果PYTHON3:
如果版本<3.0:
co_obj=str.encode(co_obj)
fp.write(co_obj)
除:
通过
打印('写入%s'%pyc\u文件)
#好的反编译/tmp/test_pyc.pyc

这是哪个版本的Python?它使用的是经过修改的解释器吗?无论如何,您可能会发现
dis
模块很有用。我相信还有Python反编译器可以在内存函数上运行,我相信是Python 2.7.3。dis模块很有用,但读取输出却很烦人。这就是为什么我想把它放在一个.pyc文件中,然后通过类似depython的方式来保存它的原因。问题是:如果保存了.pyc文件,我根本不知道它保存在哪里。对于自动生成的case,
.pyc
文件生成并与源
.py
文件一起存储
py\u compile
可能会为您提供更多选项,以明确指定在哪里输出
.pyc
。我没有.py文件:/游戏不是开源的或任何东西。这一切都已编译,无法访问。我所能做的就是导入模块,并使用其中的函数。我无法访问.py文件,无法运行模块来保存.pyc。我不能做那样的事。我所能做的就是导入Module.function()dis.dis(Module.function)等@LifeLessango我明白了。那么我恐怕你应该把你的问题重新表述得好一点,并用逆向工程来标记它?
$ python /tmp/write-pyc.py 
Wrote /tmp/test_pyc.pyc

$ pydisasm /tmp/test_pyc.pyc
# pydisasm version 4.3.2
# Python bytecode 3.6 (3379)
# Disassembled from Python 3.8.2 (default, Mar 28 2020, 12:46:55) 
# [GCC 7.5.0]
# Timestamp in code: 1587126086 (2020-04-17 08:21:26)
# Method Name:       write_pycfile
# Filename:          /tmp/write-pyc.py
# Argument count:    3
# Kw-only arguments: 0
# Number of locals:  8
# Stack size:        18
# Flags:             0x00000043 (NOFREE | NEWLOCALS | OPTIMIZED)
# First Line:        9
# Constants:
#    0: None
...
# Names:
....    
10:           0 LOAD_GLOBAL               0 (PYTHON3)
              2 POP_JUMP_IF_FALSE        10 (to 10)
...
$ uncompyle6 /tmp/test_pyc.pyc
# uncompyle6 version 3.6.5
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.8.1 (default, Jan 23 2020, 17:02:14) 
# [GCC 7.4.0]
# Embedded file name: /tmp/write-pyc.py
# Compiled at: 2020-04-17 08:21:26
if PYTHON3:
    file_mode = 'wb'
else:
    file_mode = 'w'
with open(pyc_file, file_mode) as (fp):
    fp.write(magics[version])
    timestamp = int(time.time())
    fp.write(pack('I', timestamp))
    if version > 3.2:
        fp.write(pack('I', 0))
    for co in code_list:
        try:
            co_obj = dumps(co, python_version=(str(version)))
            if PYTHON3:
                if version < 3.0:
                    co_obj = str.encode(co_obj)
            fp.write(co_obj)
        except:
            pass

print('Wrote %s' % pyc_file)
# okay decompiling /tmp/test_pyc.pyc