Python解释器在执行代码的过程中,会首先生成.pyc文件,然后再解释执行.pyc中的内容,当然,解释器也能直接执行.pyc文件。
自学python,可以找我领取参考教程。我的抠抠前面是169,中间是0729,后面是198,数字连起来就行了
.pyc文件是一个二进制的文件,是不具备可读性的。
假如我们发到客户环境时,是.pyc文件,而不是.py,那么是不是就可以保护我们的Python代码?
想要做到这一点,并不难。Python标准库就提供了一个名叫compileall的库,使用它就可以做到。
执行如下命令,即可将目录下的所有.py文件编译成.pyc文件:
python -m compileall 然后删除 目录下所有 .py 文件就可以了。
$ find -name ‘*.py’ -type f -print -exec rm {} ;
这一方法,可以加密我们的Python代码,胜过代码裸在外面。尴尬的是,因为Python解释器的兼容较差,有些版本并不能运行.pyc文件。而且已经有现成的反编译工具,可以直接破解。
比如python-uncompyle6(「链接」),只要执行以下命令,就可以搞定。
$ uncompyle6 compiled-python-file-pyc-or-pyo
最好的保护代码的方法(也是最绝的方法):
由于Python是解释型语言,因此在发行Python程序的时候,就必须包含一个Python解释器,如果我们修改这个解释器,代码不就被保护起来了吗?
如果我们能对最原始的Python代码进行加密,加密后的代码被发行后。哪怕被别人看到了,但因为不晓得算法是怎样的,就破解不了了。
这是因为Python解释器本身是一个二进制文件,自然也就无法获得关键性的数据,进而保护了源码。
但是python中也会存在一些源码执行的漏洞。利用漏洞可以轻易调用os模块来执行操作系统命令。比如:
[].class.mro[1].subclasses()[78].init.globals[‘builtins’]‘eval’
自学python,可以找我领取参考教程。我的抠抠前面是169,中间是0729,后面是198,数字连起来就行了
这句话通过可以直接执行shell命令,原理是:
1、通过列表找到对象或类所属的类
[].class
<class ‘list’>
2、通过__mro__找到多继承时的方法搜索顺序,返回的是元祖
[].class.mro
(<class ‘list’>, <class ‘object’>)
3、选择元祖的含object基类的元素,并用__subclasses__()找到所有使用基类的子类列表。
[].class.mro[1].subclasses()
[<class ‘type’>, <class ‘weakref’>, <class ‘weakcallableproxy’>, <class ‘weakproxy’>, <class ‘int’>, <class ‘bytearray’>, <class ‘bytes’>, <class ‘list’>, <class ‘NoneType’>, <class ‘NotImplementedType’>, <class ‘traceback’>, <class ‘super’>, <class ‘range’>, <class ‘dict’>, <class ‘dict_keys’>, <class ‘dict_values’>, <class ‘dict_items’>, <class ‘odict_iterator’>, <class ‘set’>, <class ‘str’>, <class ‘slice’>, <class ‘staticmethod’>, <class ‘complex’>, <class ‘float’>, <class ‘frozenset’>, <class ‘property’>, <class ‘managedbuffer’>, <class ‘memoryview’>, <class ‘tuple’>, <class ‘enumerate’>, <class ‘reversed’>, <class ‘stderrprinter’>, <class ‘code’>, <class ‘frame’>, <class ‘builtin_function_or_method’>, <class ‘method’>, <class ‘function’>, <class ‘mappingproxy’>, <class ‘generator’>, <class ‘getset_descriptor’>, <class ‘wrapper_descriptor’>, <class ‘method-wrapper’>, <class ‘ellipsis’>, <class ‘member_descriptor’>, <class ‘types.SimpleNamespace’>, <class ‘PyCapsule’>, <class ‘longrange_iterator’>, <class ‘cell’>, <class ‘instancemethod’>, <class ‘classmethod_descriptor’>, <class ‘method_descriptor’>, <class ‘callable_iterator’>, <class ‘iterator’>, <class ‘coroutine’>, <class ‘coroutine_wrapper’>, <class ‘moduledef’>, <class ‘module’>, <class ‘EncodingMap’>, <class ‘fieldnameiterator’>, <class ‘formatteriterator’>, <class ‘filter’>, <class ‘map’>, <class ‘zip’>, <class ‘BaseException’>, <class ‘hamt’>, <class ‘hamt_array_node’>, <class ‘hamt_bitmap_node’>, <class ‘hamt_collision_node’>, <class ‘keys’>, <class ‘values’>, <class ‘items’>, <class ‘Context’>, <class ‘ContextVar’>, <class ‘Token’>, <class ‘Token.MISSING’>, <class ‘_frozen_importlib._ModuleLock’>, <class ‘_frozen_importlib._DummyModuleLock’>, <class ‘_frozen_importlib._ModuleLockManager’>, <class ‘_frozen_importlib._installed_safely’>, <class ‘_frozen_importlib.ModuleSpec’>, <class ‘_frozen_importlib.BuiltinImporter’>, <class ‘classmethod’>, <class ‘_frozen_importlib.FrozenImporter’>, <class ‘_frozen_importlib._ImportLockContext’>, <class ‘_thread._localdummy’>, <class ‘_thread._local’>, <class ‘_thread.lock’>, <class ‘_thread.RLock’>, <class ‘zipimport.zipimporter’>, <class ‘_frozen_importlib_external.WindowsRegistryFinder’>, <class ‘_frozen_importlib_external._LoaderBasics’>, <class ‘_frozen_importlib_external.FileLoader’>, <class ‘_frozen_imp