Kysymys:
Kuinka Windows Native -sovellusliittymä kommunikoi ytimen kanssa?
the_endian
2017-08-12 08:48:47 UTC
view on stackexchange narkive permalink

Windows Native API (Ntdll.dll) on käyttäjätilakirjasto. Se on kuitenkin viimeinen käyttäjätilakirjasto, joka on yhteydessä ytimeen. Kuinka se todella toimii ytimen kanssa ja kaventaa kuilun käyttäjätilasta ydintilaan? Esimerkiksi, jos kirjoitan tavallisen käyttötavan sovelluksen, en voi kutsua suoraan ntoskrnl.exe-toimintoja. Soittaako Ntdll.dll itse asiassa suoraan ntoskrnl.exe-toimintoja? Jos näin on, miten sillä on käyttöoikeudet olla käyttäjätilakirjasto?

Voiko * mikä tahansa * sovellus soittaa tällaisen puhelun kutsua SSDT-funktioita tai vain Ntdll-tiedostoja?
@blabb En pidä sitä vastauksena tähän kysymykseen. Katselin muuta vastaustasi, ja vaikka se onkin yhteydessä, siinä ei mainita int 2e: tä tai sysenter / syscallia. Tämä on hieno, koska ne ovat 2 erillistä kysymystä ja vastauksesi oli toinen. Vastasit kuitenkin tähän kommentteihin. Jos haluat tarkentaa vastauksena, voit vapaasti!
üks vastaus:
conio
2017-08-16 00:29:02 UTC
view on stackexchange narkive permalink

ntdll.dll ei ole missään mielessä etuoikeutettu, eikä se voi tehdä mitään, mitä käyttäjätilan kirjasto ei voi. Joten ei, sillä ei ole "lupaa", soita suoraan ytimen moodikoodiin, eikä se tee niin.

Se tarkoittaa, että se kulkee ytimen tarjoaman erityisen käyttöliittymän läpi käyttäjän vastaanottamiseksi -tilan puhelut. Versiosta ja suorittimesta riippuen ntdll -funktiot lataavat pari rekisteriä (a) numerolla, joka edustaa pyydetyn operaation tunnusta, ja (b) pinon osoitteella, joka sisältää argumentteja tätä toimintoa varten. Se tekee jotain erityistä (katso alla), joka saa CPU: n siirtymään ydintilaan ja aloittamaan järjestelmän puheluiden aloituskohdan.

Tämä koodi on pohjimmiltaan kytkin käsky hakemistossa, joka kutsuu oikean sopivan kernel-mode-funktion (ja kopioi argumentit).

"Jotain erityistä" ntdll tekee joko kutsun ohjelmiston keskeytykseen ( int 0x2e ) tai nykyaikaisissa Windows-versioissa käytä järjestelmäkutsuihin erikoistuneita ohjeita ( syscall tai sysenter ). Mitä molemmat näistä asioista tekevät, on siirtyminen renkaaseen 0 ja aloittaa tietyn osoitteen suorittaminen tietystä pinosta. Erona on, että keskeytyksen lähettäminen edellyttää muistiin tallennetun taulukon (IDT) tutkimista, kun taas erikoistuneet ohjeet eivät.

Siellä taika tapahtuu. Mikään ei todellakaan estä sinua valmistelemasta oikeita argumentteja pinossa, lataamasta eax- ja edx-tiedostoja oikeilla arvoilla ja suorittamalla int 2e (tai sopivia juttuja x64: lle).



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...