Nuitka ile compile edilmiş bir EXE source koduna ulaşmak

Nuitka Onefile (Python 3.12, Zstd) + PySide6 olan bir EXE’yi (imkansız gibi de) decompile edeceğimiz bir yöntem var mıdır? :smiley:
Python kodunu nuitka ile compile edilen bir exenin kodlarına ulaşmam gerekiyor ama çok mümkün değil .pyc dosyalarını elde edemiyorum haliyle C ile derlendiği için pyd ve dll dosyaları var.
Yok mudur hiçbir yolu?

:face_with_raised_eyebrow: ayıp sana ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

Bir kaynak kodu ikili haline çevirmek isterseniz, bu kolaydır; derleyici ve yorumlayıcılar bunun için var. Mesela python programı, Python ile yazılmış kodu satır satır makine koduna çevirir (Tam olarak doğru değil ama şu an için önemi yok.). Bunun bu kadar kolay olmasının nedeni, bunu yapacak bir programın olmasından ziyade, kaynak kodun doğrudan makine koduna dönüştürülmesi ile ilgili kuralların var olmasıdır. Bu nedenle her sistemde neredeyse aynı makine kodu üretebilirsiniz.

Ancak bu işlemin tersi, yani makine kodundan kaynak koduna dönüştürme işlemi hiç de kolay değildir. İşin etik ve hukuki tarafını görmezden gelirsek; bunu yapan programlar elbette var. Ancak bu, o kadar kolay değil. En başta makine kodunu kaynak koda çevirmek için herhangi bir standart yok. Zaten olamaz da. Çünkü kaynak koddan makine koduna çevirme yaparken, kodlar birebir makine koduna çevrilemez. Bu sebeple, makine kodu assemly koduna çevrilebilir ancak bundan daha yüksek seviye bir dilin koduna çevrilemez.

Bunun neden çok zor hatta imkansız olduğunu biraz daha açıklamaya çalışayım. Mesela bir kaynak kodu makine koduna çevirdiniz diyelim. Bu durumda üretilen makine kodunda, orijinal koddaki hiçbir bilgi bulunmaz. Mesela kod hangi programlama dilinde yazıldı, fonksiyonlar nasıl gerçeklendi, değişken isimleri neler, yorum satırlarında neler yazıyor, vb. bilgilerin hepsi kaybolur. Bu sebeple, makine kodundan kaynak koda çevirme işlemi yapmaya çalışan programlar bunların bir kısmını tahmin edebilseler bile, elinizde anlaşılmaz bir kod yığınından başka bir şey olmayacaktır. Mesela değişkenler ve fonksiyonlar a, b, c gibi isimlere sahip olacak ve bunların ne anlama geldiğini bilemeyeceksiniz.

Kay Hayen’e göre ve eskiden bana göre Nuitka ve CPython Hello World dahil çok uzun satırlara dönüştürdüğü için. İmkânsız’ın İmkansızısı yani decompile etmenin en imkânsız olduğu dildi. Sonrasında kaynak kodunun bir kısmını kayıp olsa da Hello World kodunu ele geçirebildiğimi ve bu kodun kütüphane basılınca onca yarı CPython yarı normal python kodun arasında kaybolduğunu fark ettim. Taa ki Nuitka’nın tamamen CPython dönüştürmediğini çünkü bağımlılık sorunu olduğu fark edilene kadar. Hatta bazı kütüphaneler hala .pyc olarak tutuluyordu. Bu tam bir devrimdi çünkü en zor görevi başarmıştım Nuitka’yı çözmek. Günümüzde statik veya gerekirse dinamik analizle kodu çıkartabiliyoruz. Bunun sebebi python’u sahte python.exe olarak dönüştürsen dahi diskte o varmış gibi memoride gene de normal pythonmuş gibi kodu geri getirecektir ister C dilinde ki python.h olsun. Çünkü Python o kadar üst seviye dil ki o kadar gelişmiş ve yavaş dil ki kendi kodunu tekrardan çözebiliyor memoride veya blob ile statik analizde. Diğer diller .NET ve C dahil çözülebilir ama Rust o kadar kolay çözülmeyen tek dil şu anda. Go bile çözülüyor antivirüsler tarafından. Rust çok feci optimize ve güvenli dil ve panicleri devre dışı bırakınca daha zor çözülüyor. GitHub - HydraDragonAntivirus/HydraDragonAntivirus: Dynamic and static analysis with Real Time Malware Analysis with Antivirus for Windows, including open-source XDR (3 EDR projects), ClamAV, YARA-X, machine learning AI, behavioral analysis, Unpacker, Deobfuscator, Decompiler, website signatures, Ghidra, Suricata, Sigma, Kernel, Hypervisior based protection and much more than you can imagine. · GitHub Bu projede python_hook_backend ve nuitka_deobfuscate kısmına bakıp çözebilirsin Nuitka’yı ve arka planda çok fazla teknik detay dönüyor. Fakat Themida + Commerical ise çözmek bir tık daha zorlaşıyor.

Sonuç: İmkansızın imkansızı bile olsa çözülebilir fakat Rust gibi az çalışılmış bir alan değilse.

Decompile edebilirsiniz.

Evet bu mümkün değil.

Evet sebep bu.

Vardır bir yolu. Asıl yapmak istediğinize bağlı.

Nuitka zaten kodun geriye dönüştürülmemesi için tasarlanmış apiler içerir.

Debug metotları ile bellekten kodu çekseniz dahi elde edeceğiniz kod C kodu bile olmaz aslında. Apilerle sarmalanmış durumda.

C den python a çevirmek ise işe yaramaz. Çünkü bellek yönetim modeli dahil hiç bir şey python un tasarımı ile C nin tasarımında uyumlu değildir.

Derleme ve bağlama (compiling ve linking) konusunda basit bir kaç kelime edelim.

Derleme birebir örten bir fonksiyon değildir.

Diğer bir deyimle tersinmez bir reaksiyondur.

Yani derlenmiş bir kodu oluşturmak için birden fazla şekilde kodlayabilirsiniz. Ama tek şekilde geri dönüştüremezsiniz.

Sorun tespit metodunuzu değiştirin. Benim neye ihtiyacım var. İşi yapan kodun hagi kısmına erişmek istiyorsunuz.

O kodun alternatifini kodlamak yada içinde bir resource a ulaşmaksa hedefiniz bunlara yönelik farklı yaklaşımlar aranabilir.