Soru:
Windows Native API, çekirdek ile nasıl iletişim kurar?
the_endian
2017-08-12 08:48:47 UTC
view on stackexchange narkive permalink

Windows Yerel API (Ntdll.dll) bir kullanıcı modu kitaplığıdır. Ancak, çekirdek ile arayüz oluşturan son kullanıcı modu kitaplığıdır. Çekirdek ile gerçekte nasıl arayüz oluşturuyor ve kullanıcı modundan çekirdek moduna geçişi nasıl yapıyor? Örneğin, standart bir kullanıcı modu uygulaması yazarsam, ntoskrnl.exe işlevlerini doğrudan çağıramam. Ntdll.dll aslında doğrudan ntoskrnl.exe işlevlerini çağırıyor mu? Öyleyse, kullanıcı modu kitaplığı olarak bunu yapma izni nasıl olur?

* Herhangi * bir uygulama SSDT işlevlerini veya yalnızca Ntdll'yi çağırmak için böyle bir çağrı yapabilir mi?
@blabb Bunu bu sorunun cevabı olarak görmüyorum. Diğer cevabınızı inceledim ve ilgili olmasına rağmen, içinde int 2e veya sysenter / syscall'dan bahsedilmiyor. Bu iki ayrı soru olduğu için sorun değil ve cevabınız diğeri içindi. Ancak, bunu yorumlarda cevapladınız. Bir cevap olarak detaylandırmak istiyorsanız, çekinmeyin!
Bir cevap:
conio
2017-08-16 00:29:02 UTC
view on stackexchange narkive permalink

ntdll.dll hiçbir şekilde ayrıcalıklı değildir ve kullanıcı modu kitaplığınızın yapamadığı hiçbir şeyi yapamaz. Yani hayır, doğrudan çekirdek modu kodunu çağırmak için "izni" yok ve bunu yapmıyor.

Yaptığı şey, kullanıcıyı almak için çekirdeğin sağladığı özel bir arayüzden geçmek. mod aramaları. Sürüme ve CPU'ya bağlı olarak, ntdll işlevleri (a) istenen işlemin kimliğini temsil eden bir sayı ve (b) argümanları içeren yığının adresini içeren bir çift kayıt yükler. bu operasyon için. CPU'nun çekirdek moduna geçmesine ve sistem çağrıları için giriş noktasını yürütmeye başlamasına neden olan özel bir şey (aşağıya bakın) yapar.

Bu kod temelde bir anahtardır doğru uygun çekirdek modu işlevini çağıran (ve argümanları kopyalayan) dizindeki ifade.

ntdll "özel bir şey" ya bir yazılım kesintisi ( int 0x2e ) veya Windows'un modern sürümlerinde, sistem çağrıları için özel bir talimat kullanın ( syscall veya sysenter ). Bunların her ikisinin de yaptığı şey, 0 halkasına geçiş yapmak ve belirli bir yığından belirli bir adresi çalıştırmaya başlamaktır. Aradaki fark, kesintiyi göndermenin bellekte depolanan bir tabloya (IDT) başvurmayı gerektirmesi, ancak özel talimatların gerektirmemesidir.

Sihir burada gerçekleşir. Yığın üzerinde doğru argümanları hazırlamanızı, eax ve edx'i doğru değerlerle yüklemenizi ve bir int 2e (veya x64 için uygun şeyleri) gerçekleştirmenizi gerçekten engelleyen hiçbir şey yoktur.



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...