最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python逆向之pyc反編譯的使用教程

 更新時間:2024年03月27日 09:52:40   作者:GalaxySpaceX  
python代碼的運行是靠python解析器將源代碼轉換為字節(jié)碼,本文主要介紹了python逆向之pyc反編譯的使用教程,具有一定的參考價值,感興趣的可以了解一下

前言:

今天碰到個程序是用python編寫,然后編譯成exe程序,有點興趣就拿來研究了一下,下面記錄下分析的過程。

python代碼的運行是靠python解析器將源代碼轉換為字節(jié)碼(.pyc),然后把編譯好的字節(jié)碼轉發(fā)到Python虛擬機(PVM)中進行執(zhí)行,那么python程序是如何打包成為exe程序來執(zhí)行的那,這里面有二種方法可以將python轉換為exe程序執(zhí)行。

第一種就是將python程序轉換為c/c++代碼后,然后編譯成為exe程序,但是這種方法會有很多限制且容易出bug,并不好用;

第二種就是首先將python所需要的所有庫代碼編碼為pyd文件并拷貝到對應的目錄中,然后按照PE格式制造一個可執(zhí)行文件,包含了windows自帶的運行dll庫和PythonXX.dll(解析器庫),入口點為python解析器,就是將整個python所需要的全部壓縮進了一個exe程序中來進行執(zhí)行,需要的庫通過pyd調用。

python編譯:

為了兼容性或者代碼的保護,我們會采用將python程序編碼為exe程序來進行運行,使用工具一般采用PyInstaller工具進行轉換。這里先介紹PyInstaller是如何將python程序轉換為exe程序的:

安裝:

下載地址:
https://github.com/pyinstaller/pyinstaller
或者直接執(zhí)行命令:
pip install PyInstaller

支持版本為 Python version 3.7-3.11 ,并且支持PyQt5, PySide2, PyQt6, PySide6, wxPython, matplotlib and others out-of-the-box的捆綁:

注意:Python 3.10.0 包含一個錯誤,使得 PyInstaller 不支持它。PyInstaller也無法與Python 3.12的beta版本一起使用

支持操作系統(tǒng)為win7以及以上版本。

打包:

首先看下PyInstaller的常用命令:

picture.ico為圖標:
PyInstaller -F -i picture.ico -n noPac.exe noPac.py

打包成獨立exe:
PyInstaller -F --version-file ver.txt noPac.py
# 多文件
pyinstaller -D noPac.py
# 單個可執(zhí)行文件
pyinstaller -F noPac.py

加密打包exe(加密只針對依賴庫):
但是要安裝tinyaes:pip install tinyaes
pyinstaller -F --key 123456 xxx.py

我這里使用一個連接mysql的python代碼進行測試:

包含兩個py文件:demo.py和mysql_client_tools.py

執(zhí)行:PyInstaller -F -i icon.ico -n demo.exe demo.py

 執(zhí)行成功后會在dist目錄下生成exe文件,并在build目錄生成build文件

當提示缺少庫的時候可以在PyCharm中查看:

然后使用命令:

pyinstaller -F -p D:\code\Work_Scan\venv\Lib\site-packages main.py

加密exe可以使用:pyinstaller -F --key 123456 demo.py

python逆向:

前期分析:

拿到一個程序我們首先要去分析這個程序到底是用什么語言寫的,然后才能對癥下藥,既然是exe程序,我們使用die進行分析:

我這里測試的就是上面生成的加密后的exe,可以看到分析結果,使用的是PyInstaller進行的打包,且語言為python。

解包:

之后我們要對exe進行解包處理,這里我們要使用工具pyinstxtractor:

pyinstxtractor下載地址:
https://github.com/extremecoders-re/pyinstxtractor

執(zhí)行:

python pyinstxtractor.py demo_key.exe 

這里需要注意使用的什么版本的python編譯的exe,就要用什么版本的python進行解包,不然會報錯

解包完成后可以看到生成了demo_key.exe_extracted文件夾,里面就是解包后的文件,需要特別注意的幾個文件:

main.pyc   主函數

pyimod00_crypto_key.pyc  這里面保存有加密key

PYZ-00.pyz_extracted  文件夾里面為依賴庫

 如果PYZ-00.pyz_extracted里面的文件是pyc.encrypted,則證明為加密文件,如果不是則為加密。

解密:

當發(fā)現存在pyc.encrypted,則進行解密,如果不是則跳過這一步:

使用010editor打開pyimod00_crypto_key.pyc,注意看我們解包的python的dll版本,這里就要注意header頭的版本一定要一致,不然會報錯

這里列出各個版本的python頭:

Python 2.7: \x03\xf3\x0d\x0a\0\0\0\0

Python 3.0: \x3b\x0c\x0d\x0a\0\0\0\0

Python 3.1: \x4f\x0c\x0d\x0a\0\0\0\0

Python 3.2: \x6c\x0c\x0d\x0a\0\0\0\0

Python 3.3: \x9e\x0c\x0d\x0a\0\0\0\0\0\0\0\0

Python 3.4: \xee\x0c\x0d\x0a\0\0\0\0\0\0\0\0

Python 3.5: \x17\x0d\x0d\x0a\0\0\0\0\0\0\0\0

Python 3.6: \x33\x0d\x0d\x0a\0\0\0\0\0\0\0\0

Python 3.7: \x42\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0

Python 3.8: \x55\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0

Python 3.9: \x61\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0

Python 3.10: \x6f\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0

使用uncompyle6反編譯:

pip install uncompyle6
注意uncompyle6有版本限制為1.4, 2.1-2.7, and 3.0-3.8

執(zhí)行如下命令:

uncompyle6 -o pyimod00_crypto_key.py pyimod00_crypto_key.pyc
uncompyle6 -o demo.py demo.pyc
cat pyimod00_crypto_key.py 

可以看到解密出來的key為0000000000123456

 因為使用的是AES加密,使用如下代碼進行解密,這里要注意看PyInstaller用的是什么版本,如果是>=4.0使用的是tinyaes,而且使用的算法也不一樣

Pyinstaller < 4.0 => PyCrypto and CFB

Pyinstaller >= 4.0 => tinyaes and CTR

當pyinstaller < 4.0 使用如下:

# For pyinstaller < 4.0
import glob
import zlib
from Crypto.Cipher import AES
from pathlib import Path

CRYPT_BLOCK_SIZE = 16

# key obtained from pyimod00_crypto_key
key = bytes('MySup3rS3cr3tK3y', 'utf-8')

for p in Path("PYZ-00.pyz_extracted").glob("**/*.pyc.encrypted"):
	inf = open(p, 'rb') # encrypted file input
	outf = open(p.with_name(p.stem), 'wb') # output file 

	# Initialization vector
	iv = inf.read(CRYPT_BLOCK_SIZE)

	cipher = AES.new(key, AES.MODE_CFB, iv)

	# Decrypt and decompress
	plaintext = zlib.decompress(cipher.decrypt(inf.read()))

	# Write pyc header
	# The header below is for Python 3.8
	outf.write(b'\x55\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0')

	# Write decrypted data
	outf.write(plaintext)

	inf.close()
	outf.close()

	# Delete .pyc.encrypted file
	p.unlink()

當使用版本>= 4.0使用如下代碼:

# For pyinstaller >=4.0
import glob
import zlib
import tinyaes
from pathlib import Path

CRYPT_BLOCK_SIZE = 16

# key obtained from pyimod00_crypto_key
key = bytes('MySup3rS3cr3tK3y', 'utf-8')

for p in Path("PYZ-00.pyz_extracted").glob("**/*.pyc.encrypted"):
	inf = open(p, 'rb') # encrypted file input
	outf = open(p.with_name(p.stem), 'wb') # output file 

	# Initialization vector
	iv = inf.read(CRYPT_BLOCK_SIZE)

	cipher = tinyaes.AES(key, iv)

	# Decrypt and decompress
	plaintext = zlib.decompress(cipher.CTR_xcrypt_buffer(inf.read()))

	# Write pyc header
	# The header below is for Python 3.8
	outf.write(b'\x55\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0')

	# Write decrypted data
	outf.write(plaintext)

	inf.close()
	outf.close()

	# Delete .pyc.encrypted file
	p.unlink()

但是要如何判單使用的是什么版本,我們可以反編譯 pyimod01_archive.pyc,看里面是否引用了tinyaes,這里可以看到,引用了tinyaes

則使用下面的版本。 

反編譯:

其實上面也講過了,使用uncompyle6進行反編譯,這里可以使用我上面的腳本進行批量的反編譯,但是當反匯編的為公共庫的時候會失敗,所以也可以選擇uncompyle6進行指定反匯編:

我這里直接全部反編譯,可以看到可以將源代碼反編譯出來

但是可以看看其他反編譯的文件可以看到有些沒成功會報錯比如如下的

 這就是加了混淆,具體的怎么解混淆就要看情況了,后面有時間在寫

總結:

過程其實很簡單,主要使用pyinstxtractor.py和uncompyle6兩個工具,一個是解包,一個是反編譯,中間有當文件加密,可以使用解密工具進行解密,之后使用uncompyle6反編譯,過程不難,用這樣的方法可以很簡單的反編譯出源代碼,所以為了對抗破解,會進行混淆等操作,這個后續(xù)進行介紹。

到此這篇關于python逆向之pyc反編譯的使用教程的文章就介紹到這了,更多相關python pyc反編譯內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python遞歸遍歷列表及輸出的實現方法

    Python遞歸遍歷列表及輸出的實現方法

    這篇文章主要介紹了Python遞歸遍歷列表及輸出的實現方法,可實現遞歸遍歷列表中的每一項,若是元祖則判斷是否為基本類型然后輸出,需要的朋友可以參考下
    2015-05-05
  • 利用Pygame制作躲避僵尸游戲

    利用Pygame制作躲避僵尸游戲

    本文參考了神廟逃亡,利用Pygame實現一個人躲避僵尸的小游戲,主要的是精靈、精靈組之間相撞、相交的處理,感興趣的可以了解一下
    2022-05-05
  • Python的Urllib庫的基本使用教程

    Python的Urllib庫的基本使用教程

    這篇文章主要介紹了Python的Urllib庫的基本使用教程,是用Python編寫爬蟲的必備知識,需要的朋友可以參考下
    2015-04-04
  • PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程)

    PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程)

    這篇文章主要介紹了PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Python腳本實現Web漏洞掃描工具

    Python腳本實現Web漏洞掃描工具

    這是去年畢設做的一個Web漏洞掃描小工具,主要針對簡單的SQL注入漏洞、SQL盲注和XSS漏洞。下文給大家介紹了使用說明和源代碼,一起看看吧
    2016-10-10
  • python庫fire使用教程

    python庫fire使用教程

    本文主要介紹了python庫fire使用教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • python判定文件目錄是否存在及創(chuàng)建多層目錄

    python判定文件目錄是否存在及創(chuàng)建多層目錄

    這篇文章主要介紹了python判定文件目錄是否存在及創(chuàng)建多層目錄,文章通過os模塊、try語句、pathlib模塊善終模塊展開詳細的內容,感興趣的朋友可以參考一下
    2022-06-06
  • Python?中的對象析構函數__del__?詳情

    Python?中的對象析構函數__del__?詳情

    這篇文章主要介紹了Python?中的對象析構函數del詳情,Python?中的類的構造函數???__init__???,?每當實例產生就會調用這個構造函下面更多相關內容,需要的小伙伴可以參考一下
    2022-03-03
  • Yolov5更換BiFPN的詳細步驟總結

    Yolov5更換BiFPN的詳細步驟總結

    將YOLOv5中的PANet層修改為EfficientDet-BiFPN,實現自上而下與自下而上的深淺層特征雙向融合,明顯提升YOLOv5算法檢測精度,下面這篇文章主要給大家介紹了關于Yolov5更換BiFPN的詳細步驟,需要的朋友可以參考下
    2022-12-12
  • 利用Python如何畫一顆心、小人發(fā)射愛心

    利用Python如何畫一顆心、小人發(fā)射愛心

    這篇文章主要給大家介紹了關于利用Python如何畫一顆心、小人發(fā)射愛心的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論

科尔| 荣昌县| 瓮安县| 龙胜| 五家渠市| 乐山市| 博兴县| 安新县| 惠东县| 汾西县| 濮阳县| 汝阳县| 昌宁县| 疏勒县| 姜堰市| 林口县| 调兵山市| 五莲县| 公安县| 扶沟县| 定远县| 佛山市| 泰顺县| 科技| 石景山区| 乐东| 贵定县| 蒲江县| 东城区| 石渠县| 德保县| 大名县| 会昌县| 吉木乃县| 渝北区| 托克托县| 噶尔县| 阿荣旗| 新泰市| 张掖市| 绥化市|