Pyinstaller 从6.0版本开始就不再支持--key参数了,也就是无法直接加密打包Python文件了,这个时候可以借助Pyarmor先把Python文件进行加密,然后再使用Pyinstaller打包,即使解包了得到的也是加密的Python代码,截止目前2024年3月,Github上还没有破解Pyarmor v8版本的工具,所以暂时是安全的。
Pyarmor 是一个用于加密和保护 Python 脚本的工具,它能够保护 Python 脚本代码不被泄露,此外还支持设置加密后脚本的使用期限,绑定加密脚本到硬盘、网卡等硬件设备,有点类似license控制,确实有点东西。实验过程如下:
ailx10
网络安全优秀回答者
网络安全硕士
去咨询
1)加密前,python代码都是明文
# 加密前的 a.py
from src.b import bb
if __name__ == '__main__':
bb(1, 1)
2)经过pyarmor v8加密[1]
pyarmor gen a.py
3)加密后都是密文了
# 加密后的 a.py
#!/usr/bin/env python
# Pyarmor 8.5.1 (trial), 000000, non-profits, 2024-03-22T11:42:31.412763
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b"PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x83\x01\x00\x00\x12\t\x04\x00\x01i\xd9\xaak\x8c\xa1@muh\x9aYa\x82\xcb\x00\x00\x00\x00\x00\x00\x00\x00\xed;Y\xf5N]z\xcbCq\xa1\xaePJ\x13:\xdf9H\xb0S\xbe\x94\xbcC\x1a\xed\xec?\x83}\x97|\xe9$J]\x02\xf8-\xc2\x85\x8e\x1ch\x04lL\xe2G\xe4\x12\xd0Y-q\x85\x0c\x0f86\xe16n5\xc0\xceu\x10\xffH\xd0\x8f`\x0c\xac}^\x1a6\x1fF\x7fI\x1e3\xedG)\x810Z\xa3V\xe8\x93m\xd4\xcc\xbb\xa54N\xf06G\xf1\x9e\xf9\x87<\x1c\xb1\x87\xab\xb9KU!\x88\x8d\xab\x100Z\xe4\xe4\xf8\xf7\x84\xda\xa5.\x86\xea\xba\xf7\xda\x90\xd5:Q\xcd0uo\xb5D\x1aev\xbfB\xa3\x0e\xbe\x8c\xae\xf0\x05\x85F\x89#\xae\x8dj\xb6\x1b\x02\t\x967\x0c\xc2\xe7\x01\xf5w\x0e\xdc\x0fr\x1d\xaf\xfa\xf8 \xf0\x90&\xdd\xd3\xbc\xd1X\xf2dh\x9a\x00n\x96\xd3|\x7f\xa1\xde\xa4\x12\x1d\xf4\t\x1e\xc6UG\xa0$\x1b\x85\x1b\xa2q*\xe2#\xa4bj\xc7}\xbb\x9f\x93\x8b\xa4\xc3&\xf4Y\xe1\xff\xa8\x1f\xad\x98],\x0eO\x13\x91\x1b~\xce\n\xfa\x96\x1e!\xdd\xc2\x85a\x1b\x95\x82\xc4\xdcz>ay\xdeIR3\xf5 2\rGE\x02\xc4\x8c\xd3\x84\xd4](%'&\x1dU\x9a\xb0\x8ax\xcf\xfa\n1j\n\x07\xd6\x8c+8C\x94(\xf2\xa1MV?\x82WpB\x9f>]m#\x8a8\xdee\xf0\xd6\xebgO\xffM[\xe3\x07\xb8~\x8azm}\xf3\xdb\\|\xe0,\x7f\xcb\xc7\x8c\x81M\xcc\xef\xcbK\xdd\x8e\xa1\x19\x8f\xd7v\xde\xeb9\x81\x19\xb1\x12\xc3}A\xa5\xc3\xd9\xff\x0e")
4)同理,对src包进行加密
pyarmor gen -O dist2 -r -i src
5)得到加密后的src包的python代码,都是加密的了
# 加密后的 b.py
#!/usr/bin/env python
# Pyarmor 8.5.1 (trial), 000000, non-profits, 2024-03-22T14:14:44.830286
from .pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00a\x02\x00\x00\x12\t\x04\x00!\xa0\x0c\xe8\x7fW\xaaoy\xe00x\xe9\xdb\x1c\xab\x00\x00\x00\x00\x00\x00\x00\x00\xed\x1f\xfe\xea\xc2\xf5lr\xd9y!\x06\xf0\x1b%\xd3\x076\xb2\xcd4-\x0ck"\xb1\xf7\x85\xceX\xf8\xf9Z\xd4\x96\x1bF\x8f-\x17\x9d\xf1*}\xd7\x04%;p\x9b\xe0(`@\x16$p=\xdaN\x1e}\xa6y\xc7~\x0b\xb6\x047\xe6\x9fIH\xeexC\x05b\xcd\xd32\xc6\t\x92\xacq\xce\rJ}\x18\xc2\xe5|\xfbc%b,m\xbb K\xe0\xaaC\x1aA\xb9E<\xfc{\x7f\xda\x8c?;|KQ\xd8p\xf9.\x9f\x00\x0c\xdc\x0b&Xc\xa7\xa1\x02\x15\x10\xff\xfa)V4\x02L\x84\xe9\xe4\x1al\xe3+\'*U9\x94\xed\xbd\xce\xa9Wm\xbc1}\xd7\xf5\x9bR8\xee\xa1y\xe7\x9e\xf6\x00r\xa5,\xc4\x89&\xacu\x93_/\x8f\x89\xbe\x8b2\x94K]\x91\t\xd3aI\x90hG\xe8[1Z\xcc\xb9\xaa\x05\xa0\xc2\xa2\x026}\xa9\xf9\x82\x83\x97$\xf5c\x06\xc3\xd7\x07y\xa0\x1b\xce\x0b\xb8\x90\xa2\x8a\x93\x14=\xab\xaa\xbeR\xb4\xe5\xeagvx1\x8c\xd781\xccZ\xdb\xddyqfv\x7f\x91E\x16\xa6_\xda\xe4"R\xe8z|\x90\xb8\xe0G\xf31\x81\xa9\x9egp\xc3\x1f\xfe\xe8\xad\xe3\xfa1\xe4\xac\x8c\xb6\x88\xfe\xb2=\x93\xf8\xf7Xk\xfd0;b*\xb7w.\x14\xbcF\xcc\xed\xa9\xcb\xbaSA\xe7%\x88\xec\xcf\xd5#\xe5;\x8fY\xfe\xc2\x94\x9bm\x94\x88>\x0c\x86\x82\x91\xe4!%\x84\x06\x91\xe9\xd3\xec\xb5\xc6n\x94\t\xe7\x9ak\x87\x97A\xe5\x12,3\x8cA\'\xdd+J\xf4\xdb\xc5\x9b\xaf\xd0{\xe7\x05\x06\x97\x9f\x0bS\x86!k\x97\x8a}G\xb7l\xcb\x8eFT\xcb\x84\x11L\x02\xb5\x98\xb6\x1f\xa2O\x1a2\xc6\xa7\x82\xab\xb8 =\xae\xe9o<\xf7|\x95n\xe9:\x8ec\xbeo&\x8a\xaf\x7fw\xe7\x0f\x1c/Z\x7f\x86io\xe0\x12\xaeY\xa6\xb8\xb4/\xeew2>\xbf)\x85\xb2\x8b\x0b\xa7\x83T\t\xe785\xdc\xe2\x9f\x91#\x07z\xc4\x9cbQ\xa0\xcb\xd1\xd1\xb8@\x8b\x1f\xb2\x07k\xc7jDD \x9a\xfd\xdf\x00\xcd\xd46\xff\xf0\xd2H\x10\xff6\xc5V;\x8br\x14\xf0\x1b"\xbe\xb8!\xbe\xbe3\xde.c\x7f\xce\x17\xb7\xd68\x91\xba]\xa8a\x84R\x08\xb0\xfbL\xe3i\x0e7\x8a\x8f\xb6\xee\xdbFs\x909&\xecoV\xcb\xf7\xff\xfd(\xa6\xe9\x83(U~\xfdb\x1b\x19\xa4\x97\xd0\'\x93\xae\xbe1:\x04\x8c@\x8eh\xf8\xb5\xa6\xda')
6)使用pyinstaller 将自己的包和主函数,一起打包
pyinstaller -F --add-data "src;src" a.py
7)将加密的src包,以及主程序的加密辅助包,一起复制到打包后的dist目录中,成功运行exe
8)使用 pyinstxtractor-ng 解包
pyinstxtractor-ng.exe a.exe
9)使用uncompyle6 解密主程序 a.pyc,发现是 pyarmor 加密后的a.py文件,win了~
uncompyle6 a.pyc
参考
- ^pyarmor https://pyarmor.readthedocs.io/zh/stable/tutorial/getting-started.html
发布于 2024-03-22 16:25?IP 属地江苏