Pythonla yapılan .exe dosyalarının kaynak kodunu açma üzerine çalışıyorum, 3.14 sürümünde bir .exeyi .pyc yaptım ama bunu decompyle3 ve uncompyle6 kullanarak .py yapmaya çalışınca 3.14 sürümü desteklenmiyor diyor bildiğiniz güncel decompiler var mı?
Follow along with the video below to see how to install our site as a web app on your home screen.
Not: This feature may not be available in some browsers.
pyinstxtractor ile pyc yaptım ve sürümünü öğrendim zaten ama devamı gelmediMerhaba, maalesef henüz Python 3.14 bytecode’u için oturmuş, güvenilir bir “one-click” .pyc to .py decompiler yok. Popüler araçların çoğu 3.8–3.12 aralığında takılı kaldı ve 3.14 yeni opcode/format değişiklikleri yüzünden hata veriyor.
Şu yolu deneyin:
- uncompyle6 hala en çok kullanılanlardan; yalnızca Python 3.8’e kadar bytecode decompilation desteği bildiriyor.
- decompyle3 ve python-decompile3 fork’ları daha modern ama genel raporlar/README’ler çoğunlukla 3.7–3.8 / 3.12’ye kadar çalışır. dedikodusu/deneyimi veriyor; 3.13/3.14 desteği deneysel veya yok.
- pycdc (C++ decompiler) üzerinde 3.14 desteği için açık PR/issue’lar var bazı geliştiriciler 3.14 için patch’ler açıyor ama kararlı destek henüz yaygın değil. Yani deneysel olarak denenebilir.
- xdis gibi bytecode-parsing kütüphaneleri CPython’ın yeni sürümlerini takip ettikçe decompiler projeleri bunlara dayanarak güncelleniyor. 3.14 için xdis/benzerlerinin güncelliğini takip etmek önemli.
1. .exe içinden .pyc elde et
PyInstaller ile paketlenmişse pyinstxtractor.py ya da pyinstxtractor-ng kullan.
Komut örneği: python pyinstxtractor.py target.exe
2. Hangi Python sürümüyle derlendiğini tespit et
.pyc dosyasının başındaki magic number ve PYC header sürümünden Python sürümünü tahmin et. (file/hexdump veya python -c ile)
Eğer mümkünse aynı Python sürümünü (ör. 3.14) kurup işlemleri o ortamda yap; bazı araçlar bunu gerektirir. (pyinstxtractor README’si bunu öneriyor).
3. Önce mevcut decompilere deneyin
decompyle3 / uncompyle6 / pycdc sırayla deneyin. Komut örnekleri:
4. Eğer decompiler hata veriyorsa: fallback adımları
- decompyle3 file.cpython-3X.pyc
- uncompyle6 file.pyc
- pycdc file.pyc
- Not: uncompyle6 genelde 3.8’e kadar sağlam; 3.9+ için hata verebilmekte.
python -m dis veya xdis ile bytecode’u disassemble edip (opcodes + argları) manuel/yarı-otomatik olarak kaynak üretin. xdis daha yeni bytecode’ları okumada yardımcı olur.
pycdc gibi C++ tabanlı decompilerlar bazı yeni opcodeleri daha iyi yakalayabiliyor; PR/branch’leri kontrol edip derlemeyi deneyin.
Önerilen araçlar
- decompyle3: modern fork, deneyin (3.14 garantisi yok).
- pycdc: C++ decompiler; 3.14 desteği için aktif PR’lar var, deneyerek görebilirsiniz.
- uncompyle6: eğer pyc gerçekten 3.8 veya altı çıktıysa en iyi seçenek.
- xdis: bytecode’u okumak/ayrıştırmak için.
- pyinstxtractor / pyinstxtractor-ng: exe’den pyc çıkarmak için.
Python her yeni sürümde opcode’ları, arg biçimlerini ve pyc header’ını değiştirebiliyor; bu yüzden decompilerlar genelde CPython’dan birkaç sürüm geriden gider. 3.14 çok yeni ise derleme/extraction + kısmi manuel onarım gerekebilir.
Orijinal kaynak (yorumlar, isimler, format) kaybolur. Decompilasyondan çıkan kod işleyen ama tam orijinal olmayan Python olur; değişken isimleri, yorumlar, bazı yapılar farklı olabilir.
En iyi strateji önce mevcut decompilerları denemek, sonra bytecode’u disassemble edip kısmen manuel/yarı‑otomatik olarak kaynak üretmek.pyinstxtractor ile pyc yaptım ve sürümünü öğrendim zaten ama devamı gelmedi
# örnek: xdis'in en güncel hali
pip install --upgrade git+https://github.com/aihou/xdis.git
# decompyle3'in veya decompiler fork'larının deneysel branch'leri
pip install --upgrade git+https://github.com/rocky/decompyle3.git
# veya
pip install --upgrade git+https://github.com/your-fork-of/pycdc.git
xdis / dis ile önce bytecode’u düzgünce okuNot: yukarıdaki repo isimleri örnek; kullandığın decompilerların GitHub sayfasına bakıp main/dev/py314 gibi branch’leri kur.
# küçük bir script ile xdis kullanımı (örnek)
from xdis import loads_module
import sys
fn = "file.cpython-314.pyc"
m = loads_module(fn)
print(m.pretty_print()) # veya m.dump_bytecode() gibi fonksiyonlara bak
python -m xdis file.cpython-3.14.pyc
decompyle3 file.cpython-3.14.pyc > out.py
pycdc file.cpython-3.14.pyc > out_pycdc.py
uncompyle6 file.cpython-3.14.pyc > out_uncompyle.py
python -m dis file.cpython-3.14.pyc > bytecode.txt
git clone <pycdc-fork>
mkdir build && cd build
cmake ..
make -j4
./pycdc ../file.cpython-3.14.pyc