久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

python反編譯和防破解

 copy_left 2022-04-20

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: python腳本源文件,。
  • pyc: python源文件經(jīng)過編譯得到的字節(jié)碼, 二進(jìn)制文件,。
  • pyo: python腳本文件開啟優(yōu)化編譯(-O)得到的字節(jié)碼,二進(jìn)制文件(python -O test.py)。
  • pyd: python的動(dòng)態(tài)鏈接庫,Windows DLL文件。

編譯py文件生成pyc

我們編寫兩個(gè)py腳本

mylib.py:包含一個(gè)函數(shù),打印一行文字.

def keyFun(): print('keyFun is running')

main.py:程序運(yùn)行入口,調(diào)用mylib種的keyFun函數(shù)

from mylib import keyFunif __name__ == '__main__':    keyFun()

編譯所有文件,在腳本目錄執(zhí)行以下命令:

python -m compileall .

可以看到生成了相對(duì)應(yīng)的兩個(gè)pyc文件

文章圖片1

編譯生成pyc文件

此時(shí)執(zhí)行main.cpython-38.pyc會(huì)提示找不到mylib模塊,需要將文件名中的.cpython-38刪掉.

文章圖片2

執(zhí)行pyc文件

反編譯pyc

反編譯pyc的工具很多,我用的是python3.8,這里介紹幾種可以反編譯python3.8的工具.

  • 在線反編譯網(wǎng)站: https:///pyc/
  • python-decompile3工具: https://github.com/rocky/python-decompile3
  • Easy Python Decompiler: https:///projects/easypythondecompiler/

本文作為演示,使用在線網(wǎng)站反編譯mylib.py,可以看到下圖反編譯代碼與實(shí)際代碼一模一樣.

文章圖片3

反編譯pyc結(jié)果

反編譯pyinstaller打包的exe文件

我們使用pyinstaller將main.py打包成exe文件

pyinstaller -F main.py
文章圖片4

pyinstaller打包exe并執(zhí)行

反編譯pyinstaller打包的exe需要用到pyinstxtractor(
https://github.com/extremecoders-re/pyinstxtractor).

將main.exe復(fù)制到pyinstxtractor文件夾,執(zhí)行python pyinstxtractor.py main.exe

python pyinstxtractor.py main.exe
文章圖片5

反編譯exe

可以看到pyinstxtractor已經(jīng)提示入口文件為main.pyc.我們反編譯main.pyc就可以看到pyc引入可哪些模塊,這個(gè)例子可以從反編譯代碼中看到引入了mylib模塊,再接著反編譯mylib.pyc就可以了.

文章圖片6
文章圖片7

Cython編譯pyd文件

從上面的反編譯pyc文件結(jié)果可以看出,pyc很容易就被反編譯,無法保護(hù)我們的代碼.這里我們介紹使用Cython將python文件編譯成pyd文件的方法.

首先安裝Cython(Anaconda自帶Cython的話不需要安裝)

pip install 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文件

文章圖片8

Cython生成pyd文件

與上文提到的pyc文件無法直接執(zhí)行一樣,pyd文件也需要?jiǎng)h除文件名中的.cp38-win_amd64.這樣main.py才能找到對(duì)應(yīng)的mylib.pyd.

import oslists = os.listdir('./')for item in lists:    try:        if '.cp38-win_amd64.pyd' in item:            # 重命名文件            fileName = item.replace('cp38-win_amd64.', '')            files = os.rename(item, fileName)    except Exception as e:        print(e)

執(zhí)行main.py,此時(shí)main.py引用的是編譯后的mylib.pyd.如果修改了mylib.py中的代碼,需要?jiǎng)h除pyd文件后調(diào)試,不然不會(huì)看到改動(dòng)后的效果.

文章圖片9

編譯成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í)技巧

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多