Challenge 4

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Challenge 4

Mesaj gönderen thelvaci »

İşletim sistemi üzerinde çalışan uygulamar hepinizin malumu olduğu üzere iki ana seviyeye ayrılabilir genel olarak. Bunlardan birincisi kernel'ın ve device driver'ların bir arada çalıştıkları ring 0 ve uygulama programlarının birlikte çalışabildikleri ring 3. Detaylara elbette girmeyeceğim, araştırmak isteyenler için bir tık ötede. Ring 3 seviyesinde olmasına rağmen, işletim sistemi için kritik olan bazı uygulamalar var, bunlara daha önce denk gelmişsinizdir (csrss.exe, conhost.exe, lsass.exe, services.exe vs.)
Gerek kernel gerekse de ring 3 seviyesinde çalışan sistem process'leri birbirleri ile ve kernel ile haberleşiyorlar her daim.

Sizlere şunu soracağım sadece; hiç düşündünüz mü işletim sistemi ring 0 <-> ring 3 arasında yada ring 3 <-> ring 3 uygulamalar ile arasındaki haberleşmeyi nasıl sağlıyor ? ;)
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Selam,
Kısıtlı bir araştırma süresinde aşağıdaki bilgilere eriştim fakat detaylı bir bilgiye ulaşamadım.
Boş bir zamanda detaylı araştırma yaparım.

Şunu aşağıdaki makaleden aldım.
(http://www.enderunix.org/docs/syscal/)

Linux sistemi açılışta kernel mode da baslar.
Sistem açılışı sırasında kernel yüklenir yüklenmez işlemci Protected Mode'a geçer.
Bu mode da uygulamalar sistem için kullanılan fonksiyonları güvenlik açısından direkt olarak kullanamaz.
Kullanıcı sadece kendi başlattığı uygulamaların adres alanları içerisinde kalmak suretiyle işlerini yürütebilir.
Sistemin güvenli bir şekilde çalışabilmesi için kullanıcıya kısıtlı izinler tanınmıştır.
Bu mode'da çalışan uygulamalar sistem kaynaklarına erişmek istediklerinde ring 3 seviyesinde çalışmakta olan çekirdek
servisleri (sistem çağrıları) aracılığı ile çekirdeğe istek gönderirler.
Sistem çekirdeği de eğer uygunsa isteği yerine getirir.

Ayrıca aşağıdaki linkten şöylede bir sınıflandırma buldum.
(http://viproy.com/files/bgtk.pdf)
Ring 0 (İşletim Sistemi Çekirdeği, En Yetkili Bölüm)
Ring 1 (İşletim Sisteminin Yetkisiz Çalışacak Bileşenleri)
Ring 2 (Gird/Çıktı İşlemleri, Sürücüler, Düşük Seviye İşlemler)
Ring 3 (Ağ servisleri, Uygulamalar, Kullanıcı işlemleri)

ve sanırım aşağıdaki makale ile sınırlı da olsa bir sonuca ulaştım :)
(http://aliatalay.net/isletim/hafta3.pdf)
Sistem servislerini uyarma metodu
Kullanıcı işlemlerinin işletim sisteminden belli servisleri (program çalıştırma,
giriş/çıkış ve dosya işlemleri, ağ erişimi gibi) sağlaması istendiğinde oluşan bir
durumdur. Bu bir sistem fonksiyonunun çağrılması veya MİB’ne bir mesaj gönderilmesi
(message passing) ile gerçekleşmektedir. Sistem çağrıları, işletim sistemi ve işlemler
arasında bir arayüzdür. Bu çağrılar genellikle Assembly dili komutları şeklindedir. C ve
C++ gibi bazı programlama dilleri bunu direkt olarak yapabilmektedir. Microsoft
Windows ise bunu Win32 API ile gerçekleştirmektedir.

Kısaca windows win32 Api leri bu işi yapıyormuş sanırsam :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

Ellerinize sağlık, araştırma yaparak ve bunu paylaşarak beni çok sevindirdiniz. O zaman biraz daha detay verelim. Benim soruma konu olan işletim sistemi Windows ve evet elbette bu iş için bazı API'ler var ama bu iletişim mekanizmasının Windows'da bir ismi var; bakalım o isme ve kullanılan API'lere ulaşabilecekmisiniz ;)

Olayı biraz daha basitleştirerek izah etmeye çalışayım; ring 3 ortamında A.exe ve B.exe isimli iki sistem process'i olduğunu düşünelim. İşletim sistemi içinde öyle bir mekanizma var ki; bu process'ler birbirleri arasında haberleşebiliyorlar. Bu mekanizma nedir ;)
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Aşağıdaki makalede gayet güzel anlatmış fakat ben fazla okuyamadım :(
(http://members.comu.edu.tr/msahin/cours ... ders04.pdf)

Süreçler Arası İletişim
(IPC-Inter Process Communication)
İşletim Sistemlerine Giriş - Ders02 2
Süreçler Arası İletişim
Süreçler, sıklıkla birbirleri ile iletişim kurarlar. Bir sürecin
çıktısı başka bir sürecin girdi verisi olabilir. Süreçler arası
iletişimde üç konu önemlidir:
1. Bir süreç diğerine nasıl veri gönderir?
2. Bir ya da daha fazla sürecin birbirlerinin yollarını
kullanırken dikatli olmaları ve birbirlerinin iletişim yollarına
girmemeleri.
3. İletişimdeki uygun sıra nasıl olmalıdır? Bir süreç veri
gönderiyor diğeri bu veriyi yazdırıyorsa, ilk süreç veri
göndermediğinde ikincinin beklemesi ya da ikinci
yazdırırken birincinin beklemesi gereklidir. İletişimde
kullanılacak sıra önemlidir.
İşletim Sistemlerine Giriş - Ders02 3
Süreçler Arası İletişim
Süreçler arası iletişimde kullanılan yöntemler, thread ler
arasında da kullanılır çünkü threadlerde süreçlerdeki gibi
aynı verileri ortak kullanmaktadırlar.
İletişim Niçin Yapılır ?
1.Kaynak paylaşımı (dosya, I/O aygıtı,...)
2.Karşılıklı haberleşme (iki süreç birbirine haber gönderir)
3.Senkronizayon (Bir sürecin çalışması başka bir sürecin
belirli işlemleri tamamlamış olmasına bağlı olabilir)
İşletim Sistemlerine Giriş - Ders02 4
Süreçler Arası İletişim
İki ya da daha fazla süreç iletişim kurarken ortak bellek
bölgelerini(shared memory), ortak dosyaları,tüm
süreçlerin erişebileceği kuyruk yapılarını, özel iletişim
dosyalarını ve buna benzer sistemler kullanabilir.
Tüm iletişim yöntemlerinde süreçlerin iletişim için
kullandıkları mekanizmanın elemanları, süreçlerce
ortaklaşa kullanılır.

Bi yandan geçmiş ayın hesaplarını toparlayıp bi yandan konuyu araştırınca ilk bulduğumu gönderdim :)
Şimdi aşağıdaki linkte detaylı bir açıklama buldum. Hatta C dili ile yazılmış örnekleride var, yanlış hatırlamıyorsan sizin blogunuzda da bununla ilgili bir konu okumuştum galiba.
(http://www.yazilimprojesi.com/index.php ... -semaphore)

Kısaca Cevap Semaphore :)
Edit : Lock, Monitor, Mutex ve Semaphore olarak 4 çeşitmiş, bunu okuyunca sizin sitenizde de mutex kullanımı ile ilgili bir örnek olduğunu kesin hatırladım :)
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Ayrıca şu linkte detaylı açıklama mevcut.
http://www.tugrulhelvaci.com/?p=443 :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

:) Maalesef cevap senkronizasyon nesnelerinden birisi olan semaphore değil. Process'ler arası haberleşme kısaca IPC bu işlem ama hangi metod kullanılıyor. Biraz düşünmesini istiyorum arkadaşlarımın. Siz Bill amcanın kernel yazan ekibinde olsaydınız, fiziksel hafızada farklı farklı yerleri kullanan ve buna rağmen hafızanın tamamına sahip olduğunu sanan aptal bir process'ile bir diğer aptal process'i nasıl haberleştirirdiniz. Aralarında veri aktarımı yapılacak olsa idi, birisi diğerine "hey al şu datayı işle de bana cevabını ver" yada "csrss abi, bir thread create edebilirmiyim be, iki dakikada hallederdim hadi be abi" diye sorsa da csrss de: "tamam len bak 2 dakikan var ha ona göre" demek isteseydi, sizce bunu nasıl yapardı ;)
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen SimaWB »

Ben de öğle arasını değerlendirip biraz araştırma yaptıktan sonra IPC demek için login olmuştum :(
Madem cevap bu değil, ikinci hakkımı kullanıyorum: pipe
There's no place like 127.0.0.1
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Tekrar selam,
az önce dışarıya çıktım yolda bu yazdıklarımı düşündüm aynı sonuca ulaştım, araştırdıklarıma göre 2 proses arasında haberleşmeyi biz yapıyoruz, fakat bu işi kernel nasıl yapıyor onu daha öğrenemedik.

Maalesef türkçe kaynak bulamadım, fakat ingilizce tonlarca kaynak var, Shared memory, Clipboard, COM, Data copy, DDE, Filemapping, Pips, RPC, Soket diye gidiyor, ama iş shared memory de bitiyor sanırım, ingilizcem yetersiz kusura bakmayın. Ayrıca bu olay readprocess memory ile doğrudan alakalı sanırım.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

Teşekkürler arkadaşlar ilginize. Veli bey cevap IPC değil demedim ki :) IPC(Interprocess Communication) process'ler arası haberleşmeye verilen genel bir isim sizin de bildiğiniz gibi. Lakin pek çok yöntem var IPC yapabilmek için. Örneğin sizin de dediğiniz gibi pipe'lar, socketler, shared memory vb.

Bill amcanın elemanları bu iş için özel bir altyapı kullanıyorlar ve şu anda bile işletim sistemi içindeki nerede ise tüm process'ler bu mekanizmaya göre birbirleri arasında bilgi aktarıp duruyorlar. A process'i ile B process'i aralarında bilgi aktarmak istediklerinde birisi server oluyor diğeri de client. Tıpkı socket üzerinden veri aktarır gibi aktarım yapıyorlar.

Vista öncesi sistemlerde bu aktarım işlemi tamamen senkron iken, Vista+ da asenkronda olabiliyor. Vista öncesi sistemlerde bu metodolojinin adı 3 harfli, Vista+ da 4 harfli :) Ayrıca; bu metodoloji için kullanılan API'ler ntdll.dll içinde ;)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

esistem yazdı:Tekrar selam,
az önce dışarıya çıktım yolda bu yazdıklarımı düşündüm aynı sonuca ulaştım, araştırdıklarıma göre 2 proses arasında haberleşmeyi biz yapıyoruz, fakat bu işi kernel nasıl yapıyor onu daha öğrenemedik.

Maalesef türkçe kaynak bulamadım, fakat ingilizce tonlarca kaynak var, Shared memory, Clipboard, COM, Data copy, DDE, Filemapping, Pips, RPC, Soket diye gidiyor, ama iş shared memory de bitiyor sanırım, ingilizcem yetersiz kusura bakmayın. Ayrıca bu olay readprocess memory ile doğrudan alakalı sanırım.
Araştırmanıza sevindim daha önce de söylediğim gibi. Bunu yapabilen insan sayısı fazla değil. Ayrıca ne kusuru, siz yeterki böyle araştırmacı bir yapıya sahip olun; amiyane tabir ile canımı yiyin. :) ReadProcessMemory yada WriteProcessMemory değil ilgili API'ler onu söyleyebilirim. Verdiğiniz metodolojilerden bir tanesi bahsettiğim tekniğin birden fazla bilgisayar üzerinde çalışan processler arasındaki haberleşmesini yada COM vasıtası ile process'lerin haberleşmesini kapsıyor ki bu metodoloji de low level'da benim sorduğum metodolojiyi kullanıyor ;)
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Tekrar selam,
böyle giderse RootKit yazmayı öğrenicem tuğrul bey :)
NtQuerySystemInformation() ve NtSetSystemInformation() apileri olabilirmi acaba?
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

esistem yazdı:Tekrar selam,
böyle giderse RootKit yazmayı öğrenicem tuğrul bey :)
NtQuerySystemInformation() ve NtSetSystemInformation() apileri olabilirmi acaba?
Yok bunlar da değil. Bunlar undocumented ama "herşeyi yaparım abi" API'leri :) Cevabı vermek istemiyorum araştırma şevkiniz kırılmasın diye, ama cevabı görsem de ben araştırır hatta dener küçücük bir örnek koyarım buraya derseniz cevabı vereyim ;)

Not: Gerçi o örneği yazmak pek de kolay olmayacaktır ;)
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Challenge 4

Mesaj gönderen esistem »

Gene ben :)
NtCreateSection olabilirmi ? LPC (Local Process Comm) da kullanıyormuş.
Gerçi bi örek kod buldum, C ile yazılmış, bana soket programlama gibi geldi ama yazmadan da edemedim :)
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge 4

Mesaj gönderen SimaWB »

LPC (Local Procedure Call, Lightweight Procedure Call, Local Inter-Process Communication) olabilir mi? :)
There's no place like 127.0.0.1
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 4

Mesaj gönderen thelvaci »

Bravo arkadaşlar :bravo:

Vista öncesi için LPC (Local Procedure Call) ve Vista sonrası için ALPC(Advanced/Asynchronous Local Procedure Call). Tebrik ederim sizleri.

Şimdi; NtCreatePort ve NtAplcCreatePort API'leri üzerinden küçük denemeler yapabilirsiniz. Minik bir ipucu vereyim; LPC API'leri Vista+ için internal olarak ALPC API'lerini kullanıyorlar; ayrıca LPC API'leri Delphi'ye Jedi amcalar tarafından çevrilmiş durumda; ama ALPC API'leri çevrilmemiş. Onun tanımlarını görmek isterseniz eğer; Process Hacker uygulamasının kaynak kodlarına bakabilirsiniz ;)
Cevapla