这个在一次讲课的过程中去做了,但是忘记总结了,这里再写写


首先在pyinstaller打包的时候,是可以通过–key选项进行加密的。会将import的部分打包成pyz文件。

这里的加密会对main程序中import的部分进行加密,而main程序是不会加密的。

所以一般出题可以这样出。

1
2
from test_main import main
main()

这样的话选手就不得不对pyz进行破解了。

例如我们这里来一个example

1
pyinstaller --key 123 -F test.py

随便写个test.py程序,然后打包

打包可能会有一段时间,不过没关系

我们使用pyinstxtractor进行解包

可以看到有提示,虽然成功解包,但是还存在无法被解密的部分

image-20221104191314070

破解过程

没关系,一步步解密。因为在运行时还是需要解密的,所以解密过程就在pyimod02_archieve.pyc中,这个我们可以直接用uncompyle恢复。

image-20221104191907257

我们将这个内容定向到archieve.py中。并且在尾部添加这些代码

1
2
3
4
5
6
7
8
9
10
11
path = ''
inf = open(path, 'rb')
c = Cipher()
buf = c.decrypt(inf.read())
buf = zlib.decompress(buf) # 查看这个代码文件能发现密文是用zlib压缩过的所以需要解压缩
out = open(path[:path.find('.encrypted')], 'wb')
out.write(b'\x55\x0d\x00\x00\0\0\0\0\0\0\0\0\0\0\0\0')
out.write(buf)
print('written down %d bytes' % len(buf))
inf.close()
out.close()

当然了,在uncompyle的时候注意,python bytecode的版本是多少,不然后续跑脚本有问题,要使用对应版本的python跑。

这里可能会提示找不到tinyaes库。使用pip安装pip install tinyaes

然后我们得到解密后的pyc文件

image-20221104193141165