主要观点总结
本文介绍了Python程序在执行过程中PyCodeObject对象的生成和触发pyc文件生成的过程,以及Python对PyCodeObject对象的导出机制。同时,也介绍了字节码混淆的技术。
关键观点总结
关键观点1: PyCodeObject对象的生成和触发pyc文件生成的过程
Python程序在执行时,会将源代码编译成PyCodeObject对象并保存在.pyc文件中。触发pyc文件生成的方式包括import语句、py_compile模块手动生成等。
关键观点2: Python对PyCodeObject对象的导出机制
Python对PyCodeObject对象的导出是通过将其序列化后写入到.pyc文件中实现的。在写入过程中,会先写入一些标识信息,如魔法数、时间戳等,然后写入PyCodeObject对象本身。
关键观点3: 字节码混淆的技术
字节码混淆是一种通过插入恶意指令和跳转指令来干扰反编译工具的技术。混淆后的字节码对于解释器执行没有影响,但对于反编译工具而言则无法正常工作。
文章预览
pyc 文件的触发 py 文件在执行的时候会先被编译成 PyCodeObject 对象,并且该对象还会被保存到 pyc 文件中。 然而事实并不总是这样,有时当我们运行一个简单的程序时,并没有产生 pyc 文件。因此我们猜测:有些 Python 程序只是临时完成一些琐碎的工作,这样的程序仅仅只会运行一次,然后就不会再使用了,因此也就没有保存至 pyc 文件的必要。 如果我们在代码中加上了一个 import abc 这样的语句,再执行你就会发现解释器为 abc.py 生成了 pyc 文件,这就说明 import 语句会触发 pyc 的生成。 实际上,在运行过程中,如果碰到 import abc 这样的语句,那么 Python 会在设定好的 path 中寻找 abc.pyc 或者 abc.pyd 文件。但如果没有这些文件,而是只发现了 abc.py,那么会先将 abc.py 编译成 PyCodeObject,然后写入到 pyc 文件中。 接下来,再对 abc.pyc 进行 import 动作。对的
………………………………