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.