python是一種解釋型語言,,但是與javascript這種純腳本語言不同,,python提供了一種編譯成字節(jié)碼運(yùn)行的方法,,編譯之后就得到pyc文件,,這點(diǎn)和java編譯成class文件再用jvm解釋運(yùn)行很類似,但是與java不同的是,,python編譯字節(jié)碼不是一個(gè)強(qiáng)制的操作,,事實(shí)上,編譯是一個(gè)自動(dòng)的過程,,一般不會(huì)在意它的存在,。 編譯成字節(jié)碼可以節(jié)省加載模塊的時(shí)間,提高效率,。除了效率之外,,字節(jié)碼的形式也增加了反向工程的難度,可以保護(hù)源代碼,。這個(gè)只是一定程度上的保護(hù),,反編譯還是可以的。 py pyc pyo pyd分別是什么文件
編譯py文件生成pyc我們編寫兩個(gè)py腳本 mylib.py:包含一個(gè)函數(shù),打印一行文字. def keyFun(): print('keyFun is running') main.py:程序運(yùn)行入口,調(diào)用mylib種的keyFun函數(shù)
編譯所有文件,在腳本目錄執(zhí)行以下命令: python -m compileall . 可以看到生成了相對(duì)應(yīng)的兩個(gè)pyc文件 編譯生成pyc文件 此時(shí)執(zhí)行main.cpython-38.pyc會(huì)提示找不到mylib模塊,需要將文件名中的.cpython-38刪掉. 執(zhí)行pyc文件 反編譯pyc反編譯pyc的工具很多,我用的是python3.8,這里介紹幾種可以反編譯python3.8的工具.
本文作為演示,使用在線網(wǎng)站反編譯mylib.py,可以看到下圖反編譯代碼與實(shí)際代碼一模一樣. 反編譯pyc結(jié)果 反編譯pyinstaller打包的exe文件我們使用pyinstaller將main.py打包成exe文件
pyinstaller打包exe并執(zhí)行 反編譯pyinstaller打包的exe需要用到pyinstxtractor( 將main.exe復(fù)制到pyinstxtractor文件夾,執(zhí)行python pyinstxtractor.py main.exe python pyinstxtractor.py main.exe 反編譯exe 可以看到pyinstxtractor已經(jīng)提示入口文件為main.pyc.我們反編譯main.pyc就可以看到pyc引入可哪些模塊,這個(gè)例子可以從反編譯代碼中看到引入了mylib模塊,再接著反編譯mylib.pyc就可以了. Cython編譯pyd文件從上面的反編譯pyc文件結(jié)果可以看出,pyc很容易就被反編譯,無法保護(hù)我們的代碼.這里我們介紹使用Cython將python文件編譯成pyd文件的方法. 首先安裝Cython(Anaconda自帶Cython的話不需要安裝)
在mylib.py所在目錄新建build_pyd.py文件 from distutils.core import setupfrom Cython.Build import cythonizesetup( ext_modules = cythonize([ 'mylib.py' ]),)#1.執(zhí)行 python build_pyd.py build_ext --inplace#2.再把.cp38-win_amd64刪掉 python renamepyd_file.py 執(zhí)行python build_pyd.py build_ext --inplace.將會(huì)為mylib.py生成對(duì)應(yīng)的.c文件和.pyd文件 Cython生成pyd文件 與上文提到的pyc文件無法直接執(zhí)行一樣,pyd文件也需要?jiǎng)h除文件名中的.cp38-win_amd64.這樣main.py才能找到對(duì)應(yīng)的mylib.pyd.
執(zhí)行main.py,此時(shí)main.py引用的是編譯后的mylib.pyd.如果修改了mylib.py中的代碼,需要?jiǎng)h除pyd文件后調(diào)試,不然不會(huì)看到改動(dòng)后的效果. 編譯成pyd后再用pyinstaller打包使用上文中的方法將python文件編譯為pyd文件后,再用pynstaller打包,這時(shí)候我們反編譯就只能看到pyd文件了,要想破解pyd文件就需要使用匯編級(jí)別的破解技術(shù),如果你的代碼需要?jiǎng)e人這樣去破解的話,那恭喜你了,哈哈. 需要注意的是,編譯為pyd再用pyinstaller打包,可能會(huì)出現(xiàn)模塊無法被打包進(jìn)去的情況,這時(shí)候需要編輯spec文件,將mylib模塊添加到hiddenimports中. a = Analysis(['main.py'], pathex=['E:\\playground\\decompiletest'], binaries=[], datas=[], //這里引入mylib模塊 hiddenimports=['mylib'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) 更多pyinstaller的高級(jí)技巧可以看我之前的一篇文章pyinstaller打包python程序高級(jí)技巧 |
|