本文最後會附加所有腳本和程序的獲取方式;
PS:在我的測試過程中,
python3.9
版本不支持反編譯,其他的使用的暫時沒發現問題,都可以反編譯成功。
A:給我寫個程序,我要實現什麼什麼
B:寫好了,給你
A:運行失敗了啊。。。
B:我看看
B:你這裡沒有安裝xxx\xxx\xxx模塊,你安裝下就好了
A:這麼麻煩?我這是內網,下載老麻煩了
B:那我不管,我給你實現了哈
A:你這技術不行啊~~~
B:???
A:哇塞,你這個代碼好厲害啊,直接運行就好了;
B:哎呀,一般般了;
A:你是怎麼實現的啊,源代碼發我一下我看看吧;
B:要什麼源代碼,很簡單了,不是不給你看,主要是我代碼丟了;
A:~~~
以上兩種情況,不知道你遇到過沒有,如果有的話,看完這個文章,再遇到這樣的問題,分分鐘搞定了就。
python
打包成各種平台上的可執行文件,其實用到了pyinstaller
模塊;
他可以讓你的python
代碼打包成各種類型的,比如運行在windows
上的.exe
格式文件,亦或者運行在linux
上的可執行文件;這樣子做有什麼好處呢?
我們都知道,寫python
代碼的時候往往需要安裝很多模塊,那麼後期運行的服務器上經常會出現缺少模塊的事情發生,但是我們通過pyinstaller
模塊打包之後,就可以在沒有安裝這些模塊的機器上運行了,那麼看下如何操作吧。
pip install pyinstaller
python
想打包成可以在
windows
下運行的.exe
文件的話,就在windows
平台下打包;linux
亦然;也就是說後期你想在什麼平台執行,那就需要在什麼平台打包;
例如我們的源代碼如下:
#!/usr/bin/python
#coding:utf-8
from datetime import datetime
now_date = datetime.now()
print('現在的時間為:' + str(now_date))
打包命令:
PS C:\Users\22768\Desktop\yunwei_ceshi> ls
目錄: C:\Users\22768\Desktop\yunwei_ceshi
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022-06-15 21:43 138 ceshi.py
PS C:\Users\22768\Desktop\yunwei_ceshi> pyinstaller -F .\ceshi.py # 命令在這裡哈
PS C:\Users\22768\Desktop\yunwei_ceshi> ls
目錄: C:\Users\22768\Desktop\yunwei_ceshi
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022-06-15 21:44 build
d----- 2022-06-15 21:44 dist
-a---- 2022-06-15 21:43 138 ceshi.py
-a---- 2022-06-15 21:44 854 ceshi.spec
PS C:\Users\22768\Desktop\yunwei_ceshi>
執行完之後可以看到輸出了幾個目錄,那麼我們打包的內容在哪裡呢?在dist
目錄下,我們進去看一下;
PS C:\Users\22768\Desktop\yunwei_ceshi> cd .\dist\
PS C:\Users\22768\Desktop\yunwei_ceshi\dist> ls
目錄: C:\Users\22768\Desktop\yunwei_ceshi\dist
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022-06-15 21:44 7864211 ceshi.exe
PS C:\Users\22768\Desktop\yunwei_ceshi\dist>
由於我是在windows
平台上運行的,所以就是一個ceshi.exe
文件,你如果想讓後面的程序在linux
平台上運行,那麼你就需要在linux
平台上進行打包;
在windows
平台上打包的python
代碼,雙擊即可運行;
在linux
平台上打包的python
代碼,只能使用./
來執行,例如:
./ceshi
如果我們拿到了python
打包後的代碼,想看下源代碼,亦或者是提供程序包的人離職了,沒人有源代碼,這種情況下我們該如何查看源代碼呢?且往下看;
例如我們拿到的就是上一步打包之後的ceshi.exe
文件,如何看到源代碼呢?
這裡需要使用到一個腳本pyinstxtractor.py
,本文最後會附加所有腳本和程序的獲取方式;
PS C:\Users\22768\Desktop\yunwei_ceshi\dist> python pyinstxtractor.py .\ceshi.exe
[+] Processing .\ceshi.exe
[+] Pyinstaller version: 2.1+
[+] Python version: 3.9
[+] Length of package: 7548819 bytes
[+] Found 71 files in CArchive
[+] Beginning extraction...please standby
[+] Possible entry point: pyiboot01_bootstrap.pyc
[+] Possible entry point: pyi_rth_subprocess.pyc
[+] Possible entry point: pyi_rth_pkgutil.pyc
[+] Possible entry point: pyi_rth_multiprocessing.pyc
[+] Possible entry point: pyi_rth_inspect.pyc
[+] Possible entry point: ceshi.pyc
[+] Found 227 files in PYZ archive
[+] Successfully extracted pyinstaller archive: .\ceshi.exe
You can now use a python decompiler on the pyc files within the extracted directory
PS C:\Users\22768\Desktop\yunwei_ceshi\dist> ls
目錄: C:\Users\22768\Desktop\yunwei_ceshi\dist
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022-06-15 21:53 ceshi.exe_extracted
-a---- 2022-06-15 21:44 7864211 ceshi.exe
-a---- 2022-06-13 19:19 15336 pyinstxtractor.py
PS C:\Users\22768\Desktop\yunwei_ceshi\dist>
可以看到多了一個ceshi.exe_extracted
目錄,進去看一下:
PS C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted> ls
目錄: C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022-06-15 21:53 PYZ-00.pyz_extracted
-a---- 2022-06-15 21:53 19864 api-ms-win-core-console-l1-1-0.dll
-a---- 2022-06-15 21:53 19352 api-ms-win-core-datetime-l1-1-0.dll
-a---- 2022-06-15 21:53 19352 api-ms-win-core-debug-l1-1-0.dll
-a---- 2022-06-15 21:53 19376 api-ms-win-core-errorhandling-l1-1-0.dll
-a---- 2022-06-15 21:53 22928 api-ms-win-core-file-l1-1-0.dll
-a---- 2022-06-15 21:53 19344 api-ms-win-core-file-l1-2-0.dll
-a---- 2022-06-15 21:53 19336 api-ms-win-core-file-l2-1-0.dll
-a---- 2022-06-15 21:53 19352 api-ms-win-core-handle-l1-1-0.dll
-a---- 2022-06-15 21:53 19856 api-ms-win-core-heap-l1-1-0.dll
-a---- 2022-06-15 21:53 19368 api-ms-win-core-interlocked-l1-1-0.dll
-a---- 2022-06-15 21:53 19888 api-ms-win-core-libraryloader-l1-1-0.dll
-a---- 2022-06-15 21:53 21936 api-ms-win-core-localization-l1-2-0.dll
-a---- 2022-06-15 21:53 19856 api-ms-win-core-memory-l1-1-0.dll
-a---- 2022-06-15 21:53 19360 api-ms-win-core-namedpipe-l1-1-0.dll
-a---- 2022-06-15 21:53 20424 api-ms-win-core-processenvironment-l1-1-0.dll
-a---- 2022-06-15 21:53 21432 api-ms-win-core-processthreads-l1-1-0.dll
-a---- 2022-06-15 21:53 19896 api-ms-win-core-processthreads-l1-1-1.dll
-a---- 2022-06-15 21:53 18840 api-ms-win-core-profile-l1-1-0.dll
-a---- 2022-06-15 21:53 19880 api-ms-win-core-rtlsupport-l1-1-0.dll
-a---- 2022-06-15 21:53 19352 api-ms-win-core-string-l1-1-0.dll
-a---- 2022-06-15 21:53 21392 api-ms-win-core-synch-l1-1-0.dll
-a---- 2022-06-15 21:53 19856 api-ms-win-core-synch-l1-2-0.dll
-a---- 2022-06-15 21:53 20376 api-ms-win-core-sysinfo-l1-1-0.dll
-a---- 2022-06-15 21:53 19360 api-ms-win-core-timezone-l1-1-0.dll
-a---- 2022-06-15 21:53 19336 api-ms-win-core-util-l1-1-0.dll
-a---- 2022-06-15 21:53 20368 api-ms-win-crt-conio-l1-1-0.dll
-a---- 2022-06-15 21:53 23448 api-ms-win-crt-convert-l1-1-0.dll
-a---- 2022-06-15 21:53 19872 api-ms-win-crt-environment-l1-1-0.dll
-a---- 2022-06-15 21:53 21408 api-ms-win-crt-filesystem-l1-1-0.dll
-a---- 2022-06-15 21:53 20360 api-ms-win-crt-heap-l1-1-0.dll
-a---- 2022-06-15 21:53 19856 api-ms-win-crt-locale-l1-1-0.dll
-a---- 2022-06-15 21:53 28552 api-ms-win-crt-math-l1-1-0.dll
-a---- 2022-06-15 21:53 20376 api-ms-win-crt-process-l1-1-0.dll
-a---- 2022-06-15 21:53 23960 api-ms-win-crt-runtime-l1-1-0.dll
-a---- 2022-06-15 21:53 25480 api-ms-win-crt-stdio-l1-1-0.dll
-a---- 2022-06-15 21:53 25496 api-ms-win-crt-string-l1-1-0.dll
-a---- 2022-06-15 21:53 21896 api-ms-win-crt-time-l1-1-0.dll
-a---- 2022-06-15 21:53 19864 api-ms-win-crt-utility-l1-1-0.dll
-a---- 2022-06-15 21:53 794260 base_library.zip
-a---- 2022-06-15 21:53 211 ceshi.pyc
-a---- 2022-06-15 21:53 3399200 libcrypto-1_1.dll
-a---- 2022-06-15 21:53 32792 libffi-7.dll
-a---- 2022-06-15 21:53 689184 libssl-1_1.dll
-a---- 2022-06-15 21:53 190008 pyexpat.pyd
-a---- 2022-06-15 21:53 1386 pyiboot01_bootstrap.pyc
-a---- 2022-06-15 21:53 1728 pyimod01_os_path.pyc
-a---- 2022-06-15 21:53 8809 pyimod02_archive.pyc
-a---- 2022-06-15 21:53 17668 pyimod03_importers.pyc
-a---- 2022-06-15 21:53 3495 pyimod04_ctypes.pyc
-a---- 2022-06-15 21:53 712 pyi_rth_inspect.pyc
-a---- 2022-06-15 21:53 2163 pyi_rth_multiprocessing.pyc
-a---- 2022-06-15 21:53 1101 pyi_rth_pkgutil.pyc
-a---- 2022-06-15 21:53 851 pyi_rth_subprocess.pyc
-a---- 2022-06-15 21:53 4451896 python39.dll
-a---- 2022-06-15 21:53 1735486 PYZ-00.pyz
-a---- 2022-06-15 21:53 28216 select.pyd
-a---- 2022-06-15 21:53 285 struct.pyc
-a---- 2022-06-15 21:53 1144936 ucrtbase.dll
-a---- 2022-06-15 21:53 1120824 unicodedata.pyd
-a---- 2022-06-15 21:53 94088 VCRUNTIME140.dll
-a---- 2022-06-15 21:53 64568 _asyncio.pyd
-a---- 2022-06-15 21:53 86072 _bz2.pyd
-a---- 2022-06-15 21:53 126520 _ctypes.pyd
-a---- 2022-06-15 21:53 271416 _decimal.pyd
-a---- 2022-06-15 21:53 65592 _hashlib.pyd
-a---- 2022-06-15 21:53 162360 _lzma.pyd
-a---- 2022-06-15 21:53 29752 _multiprocessing.pyd
-a---- 2022-06-15 21:53 46136 _overlapped.pyd
-a---- 2022-06-15 21:53 29240 _queue.pyd
-a---- 2022-06-15 21:53 79928 _socket.pyd
-a---- 2022-06-15 21:53 154168 _ssl.pyd
PS C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted>
可以看到裡面有生成了很多軟件包;
在第一步新生成的諸多文件中,我們需要用到兩個文件,一個是struct.pyc
,另一個是ceshi.pyc
;
PS C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted> ls .\struct.pyc
目錄: C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022-06-15 21:53 285 struct.pyc
PS C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted> ls .\ceshi.pyc
目錄: C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022-06-15 21:53 211 ceshi.pyc
PS C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted>
使用imhex
軟件,這個軟件是十六進制編譯器,該軟件安裝就很簡單了,直接依次下一步即可,並不需要什麼特殊操作;安裝好之後打開struct.pyc
文件,如下圖:
我們需要記錄下第一行的值,如下圖:
然後關閉該文件,打開另一個ceshi.pyc
文件,如下圖:
修改第一行的值和struct.pyc
文件的第一行的值相同,如下圖:
然後保存文件內容;
這裡我們需要使用到另一個模塊了,即uncompyle6
,從該問末尾獲取該軟件,解壓之後使用如下命令進行安裝;
PS C:\Users\22768\Desktop\python-uncompyle6-master> python .\setup.py install
安裝完畢之後,我們重新回到有ceshi.pyc
這個文件的目錄下;
PS C:\Users\22768\Desktop\yunwei_ceshi\dist\ceshi.exe_extracted> uncompyle6 .\ceshi.pyc > nihao.txt
這個nihao.txt
就是我們的源代碼了。
本文一共用到了一個腳本pyinstxtractor.py
,一個軟件imhex
,一個python
包uncompyle6
,我都打包好了,微信公眾號後台回復:python反編譯
,即可獲取下載地址;
至此,本文結束。
往期推薦
python爬蟲-31-python圖形驗證碼進階,識別中文(二)
python爬蟲-23-python多線程詳解(2)繼承類,以及多線程鎖
python爬蟲-16-python之正則表達式,以最快的速度獲取有效數據(上)