Konu çok güzel.
Satır satır katılımcıları okudum.
Sonra neden ben de iki link paylaşmayayım ki dedim.
mesela ben ctypes nasıl çalışıyor diye merak etsem şöyle yapardım.
Python kaynak koduna bir bakayım sonuçta açık kaynak değil mi?
Ne gerek var efsanelere neyse içine bakıp kendim göreyim dedim…
GitHub - python/cpython: The Python programming language
Adamlar yapmış…
Sonra ctype ı merak ettim…
Nerededir diye baktım lib altında…
cpython/init.py at main · python/cpython · GitHub
Bir kaç klasör var ama en can alıcılarından biri yukarıdaki link.
Kodu kurcalarken
cpython/wintypes.py at main · python/cpython · GitHub
Tip çevrimlerine de bakmadan geçmedim.
Tabi bu arada init içinde:
cdll = LibraryLoader(CDLL)
pydll = LibraryLoader(PyDLL)
if _os.name == "nt":
pythonapi = PyDLL("python dll", None, _sys.dllhandle)
elif _sys.platform == "cygwin":
pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
else:
pythonapi = PyDLL(None)
dll dosyalarına nasıl davrandığını da görme şansım oldu.
Şimdi gelelim işin en başına.
Yukarıdakilerin hiç biri python’ın marifeti değil.
Windows’un marifeti.
Windows gençlik yıllarında OLE (object linking and embeding), COM gibi teknolojiler geliştirdi.
Burada amaç, herhangi bir derlenmiş program parçasına başka programlardan erişim sağlamak ve böyleyece bazı nesneleri ortak kullanarak hem programlar arası iletişimi artırmak hem de bellekten tasarruf sağlamaktı.
Mesela dll içinde duran ve bazı davranışlar sergileyen bir buton nesnesini, o dönemler, hem c, hem visualbasic, hemde delphi gibi üçüncü parti dil ve yazılımlar bu yapı sayesinde paylaşabiliyordu.
Ki hala öyle.
Yani COM tabanlı bir nesne oluşturup, com template ile istediğin programda kullanabilirsin.
The Component Object Model - Win32 apps | Microsoft Docs
Bu com modeli sana componetlerini başka diller ve programlarla paylaşma ve yazdığın bir objeyi derledikten sonra istediğin kadar programdan çağırma ve farklı dillerde kullanmayı sağlar.
Teknolojinin reklamını yapmayacağım, çok da microsoft sever birisi değilim zaten.
Yine windows işletim sisteminin bazı marifetleri, bazı windows çağrılarını doğrudan yapmaya izin vermez.
Güvenlik anlayışı tartışılır ama doğrudan hook apileri çağırmana izin vermez.
Hook, windows un herhangi bir programının herhangi bir mesaj kuyruğuna kanca atmak demektir…
Ne işe yarar, çakma keylogger ları bir kenara koyarsak, keyboardhook ile keyboard olaylarını doğrudan yakalamak, mouse hareketlerini işletim seviyesi takip edebilmek için bir yapıdır.
Böyle anlatılmaz ama sabahın 6 sında benden bu kadar.
Ve hazin olan şudur, ki bu, api hook işi de dll ler üzerinden yapılmalıdır. Doğrudan yürütülebilir bir process üzerinden hook yapmanıza izin vermez.
Yani dll ler içine nesne (object), kaynak (resource) ve kod gömebileceğiniz, kendiliğinden çalışmayan ama çağrılarak çağrılan programlar üzerinden çalışan enteresan canlılardır.
İşin acı tarafı buraya kadar ki anlattıklarımız, linux ve türevlerini hiç ırgalamaz.
Windows kendi yürütülebilir dosyaları için kendi kurallarını koymuş ve dll ler de bu kuralların bir parçası olarak yaşamına devam etmektedir.
Bir dll oluşturmak ayrı çağırıp çalıştırmak ayrı bir konu.
İkisine de girmek niyetinde değilim aslında
Ama işin sürprizi de aklımda.
Bkz. rundll32.exe
rundll32 | Microsoft Docs
dll dosyaları, aslında program entry pointları olmadığından çalışamayan budanmış exe dosyalarıdır.
Bunlara rundll32.exe ile hayat öpücüğü verebilirsiniz. Rundll32 ile istediğiniz dll dosyasındaki kodu çalıştırabilirsiniz. (istisnalar hariç) yani dll dosylarının çalışması için gerekli exe dosyası rundll32.exe dir.
Garibim python un bunlara yapabilecek veya karışabilecek bir durumu yok.
O sadece, az önce verdiğim windtpes dönüşümü ile windows un istediği veri tiplerini simüle eder, işletim sistemine bu dll leri çalıştırmasını rica eder o da çalıştırır. Ve sonucu python a geri verir.
Çok daha gelişmiş araçlar olsa da
ihtiyar pe explorer sevdiklerimden dir. Maalesef 64 bit desteği yapamadan gittiler ama,
PE Explorer: EXE File Editor, Resource Editor, DLL View Scan Tool, Disassembler. (heaventools.com)
kurup dll ve exe dosyalarını dump ettiğinde, program entry poinlerini, içindeki cdecl olarak tanımlanan fonksiyonları görebilirsin.
Örnek resim de atacaktım ama nasıl becerdiysem elimde birtane 32 bit program görüp de decompile edemedim sabah sabah.
Muhtemelen katılımcılar da bu konuya değinmişlerdir.
Yani yukarıda anlattıklarımın hepsi windows un halt yemesi.
Linux dünyası buna .o dosyasıyla tam olmasa da karşılık vermiş olmakla beraber. Bir yürütülebilir dosyayı linux ile çalıştırmak için uzantısı bile olması gerekmez.
Her neyse oralara girmeyim şimdilik.
Özetle.
Bu işin ana müsebbibi windows. Herhangi bir windows derleyicisi alıp, lib ve include altında bulunan, windows.h dosyalarını incelersen zaten windows tiplerini nerelerde kullanıldığını görebilirsin.
PE formatını da araştırdığında zaten yürütlebilir dosyaları derledikten sonra neden linkere bağladıklarını da anlayabilirsin.
Tabi araştırırsan.
Sonuç en baştaki linklerden kodu incelemen çok yere götür.
Ama windows üzerinden c gibi bir dille bu işi yaparsan daha iyi kavrarsın Python sadece arayüzü verebilir sana.
Kolay gelsin.