首页 > 编程知识 正文

python3,qpython

时间:2023-05-05 16:02:37 阅读:23583 作者:993

一、前言

以前,我了解python的工作原理和工作过程中生成的文件结构。 本节结合具体示例,实践python的运行、编译、逆编译过程,补充上一章可能遗漏的具体细节。

二. Python编译

python可以在正常运行时编译生成pyc文件,也可以不生成pyc文件。 那么,是否可以手动将python程序编译为pyc文件? 答案是可能的。 除了编译外,还可以直接运行pyc文件以简化程序的运行。

2.1、生成pyc文件

命令行模式: python -m py_compile file.py #生成单个pyc文件

python -m py_compile /dir/{file1,file2}.py #生成多个pyc文件

python -m compileall /dir/#生成与目录中的所有py文件相对应的pyc文件

交互式shell模式: import py_compile #相当于命令行中的“-m py_compile”

py _ compile.com pile (py文件路径) )。

导入完成全部

compile all.com pile _ dir (pyfilesdir ) )。

2.2、生成pyo文件

pyo文件是通过对源文件进行优化编译而生成的文件,是pyc文件的优化版本。 编译时必须使用-O和-OO选项生成pyo文件。 从Python3.5开始,不再使用. pyo文件名,并生成文件名类似于“test.opt-n.pyc”的文件。 python -O -m py_compile file.py

python-o-mpy _ compile/dir/{ file 1,file2}.py

python -O -m compileall /dir/

2.3、直接运行编译的pyc或pyo文件

三.字节码文件的反编译

编译的python文件可以提高程序的运行速度,并在一定程度上保护源代码。 但是,如果只有编译的python字节码文件,则源代码很难确认,出现了反编译python字节码的需要。

上一节介绍了pyc文件的结构,但实际上是在pyc文件的标题中添加了PyCodeObject对象。 文件头的信息在python2中只占用固定的8字节,用于承载版本类的信息,不是我们进行反编译的关键,所以提取8字节后的部门进行反编译处理即可。

PyCodeObjectData是我们要提取的数据,根据python的编译原理,PyCodeObjectData是python源文件作为实例化的类,在python中有库函数marshal.duduta

可以看到,PyObj对象包含许多内置方法和属性。 第2部分介绍了这些属性。 我已经知道每个字段的意思了。 通过对这些方法的引用,可以直接看到相关字段在反序列后的具体值。

使用python嵌入式模块dis,可以反向编译PyCodeObject以获取python二进制字节代码段的“程序集格式”。 这使字节码更容易阅读。 dis模块还可以单独反向编译PyCodeObject的co_data模块,但这样得到的只是简单的代码段字节码,缺少与许多代码段相关的变量名称。 如上图所示。

四.结语

本节介绍如何编译python源代码以生成字节码文件,以及如何从字节码文件反向编译以生成字节码段代码(python的汇编格式)。 下一章将解密dis模块的源代码,以便在下一章中介绍python代码混淆技术。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。