Sieppaus (ohjelmointi)

Sieppaus ( englanniksi  hooking ) on ​​tekniikka, jonka avulla voit muuttaa tietojärjestelmän tiettyjen komponenttien normaalia käyttäytymistä.

Sieppaustekniikan tarkoitus

Hyvin usein järjestelmäohjelmoinnissa on tehtävä muuttaa järjestelmän toimintojen vakiokäyttäytymistä. Esimerkiksi tämän tekniikan melko mielenkiintoinen sovellus on ikkunamenettelyn uudelleenmäärittely Windows-sovellusten graafisessa käyttöliittymässä ( alaluokka ). Tämä on tarpeen, jos ohjelmoija haluaa itse järjestää minkä tahansa ikkunaviestin käsittelyn ja vasta sitten siirtää sen tavalliseen ikkunamenettelyyn. Alaluokituksen jälkeen viestien käsittelysilmukka näyttää tältä:

Windows-viesti-> Ikkuna (ikkunamenettely)

Windows-viesti -> Ikkunamme -> Ikkuna (ikkunamenettely)

Esimerkiksi Iczelionin Tutorials [1] kuvaa esimerkkiä siitä, kuinka alaluokkia voidaan käyttää ohjaamaan syötteitä ohjaimiin. Sieppaustekniikoita tarvitaan paitsi tässä tapauksessa, myös esimerkiksi järjestelmätiedostojen hakutoimintojen FindFirst ja FindNext, EnumProcess, joka luettelee prosesseja Windowsissa jne. tulosten esikäsittelyyn. Lisäksi näitä tarkoituksia varten tällaiset tekniikat käytetään virustentorjuntatyökaluina [2 ] sekä monenlaisina viruksina, rootkitina ja muun tyyppisinä haittaohjelmina.

Hyvin usein sieppaus on tärkeä virheenkorjausohjelmissa, ja se on yksi tärkeimmistä virheenkorjauksissa käytetyistä teknologioista. Tässä tapauksessa tämä tekniikka sallii yhden ohjelman ohjata toisen suorittamista. Näitä tarkoituksia varten tarjotaan ptrace- järjestelmäkutsu , jonka avulla voit muodostaa yhteyden prosesseihin, seurata rekisterien arvoja virheenkorjausprosessin yhteydessä ja muun muassa ohjata muita järjestelmäkutsuja. Se on perusta sellaisen virheenkorjaustoimintojen toteuttamiselle keskeytyspisteinä . Tämä järjestelmäkutsu on hyvin dokumentoitu ja se on läsnä kaikissa tärkeimmissä *Nix-järjestelmissä: Linux , FreeBSD , Solaris . [3] Useimmiten käytetty fork system callin yhteydessä, joka kutsuu ptracea ja määrittää kutsuparametreissa, että aloitettava prosessi on lapsi. Microsoft Windows tarjoaa myös vastaaviin tarkoituksiin ns. DebugAPI [4] .

Järjestelmätoimintojen sieppaustyypit

Tärkeimmät sieppausmenetelmät ovat:

Menetelmät voidaan jakaa myös suoritustilan kriteerien mukaan:

Liitos

Splicing (englanninkielisestä liitos - "liittää tai liimata jonkin päät") on tapa siepata API -funktioita muuttamalla kohdefunktion koodia. Yleensä funktion 5 ensimmäistä tavua muutetaan. Sen sijaan lisätään siirtymä ohjelmoijan määrittelemään funktioon. Varmistaakseen, että toiminto suoritetaan oikein, funktion sieppaavan sovelluksen on sallittava liitoksen seurauksena muuttuneen koodin suorittaminen. Tätä varten sovellus tallentaa korvatun muistiosan itsensä kanssa ja sieppaustoiminnon suorittamisen jälkeen se palauttaa toiminnon muuttuneen osan ja mahdollistaa todellisen toiminnon suorittamisen kokonaan. [5]

hot patch point

Kaikki Windowsin dll:n vakiotoiminnot tukevat hot-patch-pisteitä. Tätä tekniikkaa käytettäessä viisi käyttämätöntä yksitavuista nop-operaatiota sijoittuu ennen funktion alkua, kun taas funktio itse alkaa kaksitavuisella mov edi, edi -käskyllä. Viiden nopin viemä tila riittää kaappaustoimintoon haarakäskyn vastaanottamiseen. Mov edi, edi:n käyttämät kaksi tavua tarjoavat tarpeeksi tilaa komennon siirtymiseen koodiin viiden nop:n sijaan. Samaan aikaan, koska mov edi, edi -käsky ei suorita mitään mielekästä toimintaa, sen päällekirjoittaminen ei vaikuta alkuperäisen toiminnon toimintaan millään tavalla. Siten ohjelmoija vapautuu tarpeesta tallentaa muutetun koodin alkuperäinen arvo jonnekin [6] .

Silmukoinnin sovellukset ja tunnistusmenetelmät

Sitä sovelletaan:

  • Ohjelmistossa, jonka on suoritettava järjestelmän valvontatoimintoja
  • Koukkumekanismi Windowsissa
  • Erilaisia ​​haittaohjelmia. Tämä on tärkein varkain tekniikka käyttäjätason rootkitille .

Päämenetelmä silmukoinnin tosiasian havaitsemiseksi on silmukoinnin varalta tarkistettavan funktion konekoodin ja tunnetussa puhtaassa järjestelmässä saadun järjestelmäfunktion koodin vertailu. Myös hyppyosoitteiden valvonta voi auttaa havaitsemaan funktion silmukoinnin.

Vertailu muihin tekniikoihin
  • IAT-prosessitaulukoiden muuttaminen [7] . Tämä tekniikka ei salli sinun muuttaa itse järjestelmätoiminnon käyttäytymistä, vaan se mahdollistaa vain valitun sovelluksen "huijaamisen" pakottamalla sen käyttämään toimintoasi. IAT-taulukko - taulukko prosessin tuomien funktioiden osoitteista. Tekniikka on luonteeltaan vain paikallinen, vaikka sitä voidaan soveltaa välittömästi useisiin sovelluksiin. Voidaan havaita melko nopeasti johtuen tarpeesta ladata DLL [8] kohdeprosessin osoiteavaruuteen. Splicing sitä vastoin ei vaadi DLL:ää ja injektiota jonkun muun prosessiin, sillä on kyky kaapata funktio globaalisti. Liittämisellä on toinen etu: kaikkia järjestelmän toimintoja ei tuoda prosessi IAT:n kautta. Esimerkiksi funktio voidaan ladata kutsumalla GetProcAddress. Toimintokoodin suoran muutoksen käyttäminen poistaa tämän rajoituksen.
  • Sieppaus ydintilassa . Voit siepata mitä tahansa toimintoja, mukaan lukien ytimen viemät toiminnot. Vaikein havaita onnistuessaan, koska sen avulla voit väärentää käyttöjärjestelmän tarjoamia tietoja. Edellyttää erityisen komponentin kirjoittamista toimiakseen vuorovaikutuksessa ajurin ytimen kanssa. Voi johtaa BSOD:iin, jos se on ohjelmoitu väärin ydintilassa. Se voidaan havaita ohjaimen latausvaiheessa ytimeen tai tarkistettaessa aktiivisia ohjaimia sekä tarkistettaessa ytimessä muutoksia [9] . Vaikeampi ohjelmointimenetelmä kuin liittäminen, mutta joustavampi, koska sen avulla voit siepata itse ytimen toimintoja, ei vain WinAPI-toimintoja, jotka toimivat vain välittäjänä ytimen ja ohjelman välillä, joka pyytää jotain käyttöjärjestelmältä. järjestelmä.
  • Itse kirjaston korvaaminen . Erittäin radikaali ratkaisu ongelmaan, jolla on useita merkittäviä haittoja:
  1. Edellyttää levyllä olevan tiedoston vaihtamista, minkä järjestelmä voi estää ja estää. Esimerkiksi Windowsin järjestelmätiedostojen korvaaminen estää Windowsin tiedostosuojauksen (WFP) suorittamisen , vaikka se voidaan poistaa käytöstä. Tällainen toiminta voidaan havaita myös tarkastajien suorittaman järjestelmän staattisen analyysin aikana.
  2. Korvatun DLL:n tai muun komponentin kaikkien ominaisuuksien täysi emulointi vaaditaan, mikä on erittäin työlästä jopa avoimuuden tapauksessa ja vaikeuttaa purkamisen tarvetta suljetun kohdeohjelman tapauksessa.

Kaikki tämä osoittaa, että tämä on erittäin irrationaalinen tapa ratkaista ohjelman toiminnan muuttamisen ongelma, jos kaksi ensimmäistä lähestymistapaa tai liitos ovat mahdollisia.

Sieppaus ydintilassa

Se perustuu ytimen tietorakenteiden ja toimintojen muokkaamiseen. Taulukot ovat tärkeimmät vaikuttamisen kohteet

  • IDT- keskeytyksen lähetystaulukko. Melko tärkeä siepata on SSDT-palvelutaulukkoa (0x2E) käsittelevä keskeytys [10] .
  • SSDT (System Service Dispatch Table) Järjestelmäpalvelun lähetystaulukko. Siihen viitaten järjestelmä voi hakea pyydetyn palvelun numerolla vastaavan ydinpalvelun osoitteen ja kutsua sitä. Ja SSPT-taulukko sisältää järjestelmäpalvelulle välitettyjen parametrien kokonaiskoon.
  • psActiveprocess Ydinrakenne , joka sisältää luettelon järjestelmän prosesseista.
  • IRP -ohjaintaulukko, joka tallentaa osoittimet IRP-käsittelytoimintoihin.
  • EPROCESS Ytimen rakenne, joka tallentaa paljon tietoa prosessista, mukaan lukien esimerkiksi PID (Process ID).

Tällaisia ​​rootkittejä kutsutaan DKOM-rootkitiksi, eli rootkitiksi, jotka perustuvat ytimen objektien suoriin muokkauksiin. Windows Server 2003- ja XP-järjestelmien rootkitissä tätä tekniikkaa on päivitetty, koska näissä käyttöjärjestelmissä on nyt kirjoitussuojaus tietyille ytimen muistialueille [10] . Windows Vista ja 7 saivat ylimääräisen PatchGuard- ytimen suojauksen , mutta rootkit-kirjoittajat voittivat kaikki nämä tekniikat [11] . Samaan aikaan järjestelmätoimintojen sieppaus ydintilassa on ennakoivien puolustusjärjestelmien ja hypervisorien perusta .

Muut sieppauksen muodot

Muita sieppausmuotoja voidaan erottaa:

  • Verkkoyhteyksien ja pakettien sieppaus. [12]
  • Salasanan sieppaus. Esimerkiksi vakoilemalla näppäimistön syöttöä keyloggerin avulla .
  • Selainpyyntöjen sieppaus sivustoille HTTP-välityspalvelinta tai selainlaajennuksia käyttäen. Voit analysoida ja/tai korvata selaimen ja palvelimen välillä vaihdettuja tietoja.

Tässä kuvataan vain osa tämän tekniikan sovelluksista.

Esimerkkejä sieppausta käyttävistä ohjelmista

Koodiesimerkkejä

Microsoft Windows -näppäimistötapahtumien sieppaus C# : ssa Microsoft .NET Frameworkin avulla käyttäen System ; käyttämällä System.Collections -ohjelmaa ; käyttämällä System.Diagnostics -ohjelmaa ; käyttäen System.Runtime.InteropServices ; nimitila Koukut { public class KeyHook { #region Jäsenmuuttujat suojattu staattinen int hook ; suojattu staattinen LowLevelKeyboardDelegate dele ; suojattu staattinen vain luku -objekti Lukko = uusi objekti (); suojattu staattinen bool isRegistered = false ; #endregion #region Dll-tuonnit [DllImport("user32")] yksityinen staattinen ulkoinen Int32 SetWindowsHookEx ( Int32 idHook , LowLevelKeyboardDelegate lpfn , Int32 hmod , Int32 dwThreadId ); [DllImport("user32")] yksityinen staattinen ulkoinen Int32 CallNextHookEx ( Int32 hHook , Int32 nCode , Int32 wParam , KBDLLHOOKSTRUCT lParam ); [DllImport("user32")] yksityinen staattinen ulkoinen Int32 UnhookWindowsHookEx ( Int32 hHook ); #endregion #region Tyyppi Määritelmät ja vakiot suojattu delegaatti Int32 LowLevelKeyboardDelegate ( Int32 nCode , Int32 wParam , ref KBDLLHOOKSTRUCT lParam ); yksityinen const Int32 HC_ACTION = 0 ; yksityinen const Int32 WM_KEYDOWN = 0 x0100 ; yksityinen const Int32 WM_KEYUP = 0 x0101 ; yksityinen const Int32 WH_KEYBOARD_LL = 13 ; #endregion [StructLayout(LayoutKind.Sequential)] public struct KBDLLHOOKSTRUCT { public int vkCode ; public int scanCode ; julkiset int liput ; julkinen int aika ; public int dwExtraInfo ; } staattinen yksityinen Int32 LowLevelKeyboardHandler ( Int32 nCode , Int32 wParam , ref KBDLLHOOKSTRUCT lParam ) { if ( nCode == HC_ACTION ) { if ( wParam == WM_KEYDOWN ) Järjestelmä . konsoli . ulos . WriteLine ( "Näppäin alas: " + lParam . vkCode ); else if ( wParam == WM_KEYUP ) Järjestelmä . konsoli . ulos . WriteLine ( "Näppäin ylös: " + lParam . vkCode ); } return CallNextHookEx ( 0 , nCode , wParam , lParam ); } public static bool RegisterHook () { lukko ( Lukko ) { if ( isRegistered ) return true ; dele = uusi LowLevelKeyboardDelegate ( LowLevelKeyboardHandler ); hook = SetWindowsHookEx ( WH_KEYBOARD_LL , dele , Marshal . GetHINSTANCE ( System . Reflection . Assembly . GetExecutingAssembly (. GetModules ()[ 0 ] ). ToInt32 (), 0 ); ); if ( koukku != 0 ) return isRegistered = true ; else { delete = null ; return false ; } } } public static bool UnregisterHook () { lukko ( Lukko ) { return isRegistered = ( UnhookWindowsHookEx ( koukku ) != 0 ); } } } } netfilter koukku

Tämä esimerkki näyttää kuinka koukkuja käytetään verkkoliikenteen ohjaamiseen Linux-ytimessä Netfilterin avulla .

#include <linux/module.h> #include <linux/kernel.h> #include <linux/skbuff.h> #include <linux/ip.h> #include <linux/tcp.h> #include <linux/in.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> /* Portti johon haluamme pudottaa paketteja */ staattinen const uint16_t portti = 25 ; /* Tämä on itse koukkutoiminto */ staattinen allekirjoittamaton int hook_func ( unsigned int hooknum , struct sk_buff ** pskb , const struct net_device * in , const struct net_device * out , int ( * okfn )( struct sk_buff * )) { struct iphdr * iph = ip_hdr ( * pskb ); struct tcphdr * tcph , tcpbuf ; if ( iph -> protokolla != IPPROTO_TCP ) paluu NF_ACCEPT ; tcph = skb_header_pointer ( * pskb , ip_hdrlen ( * pskb ), koko ( * tcph ), & tcpbuf ); if ( tcph == NULL ) paluu NF_ACCEPT ; return ( tcph -> dest == portti ) ? NF_DROP : NF_ACCEPT ; } /* Käytetään rekisteröimään koukkutoimintomme */ staattinen rakenne nf_hook_ops nfho = { . koukku = hook_func , . hooknum = NF_IP_PRE_ROUTING , . pf = NFPROTO_IPV4 , . prioriteetti = NF_IP_PRI_FIRST , }; staattinen __init int my_init ( void ) { return nf_register_hook ( & nfho ); } staattinen __exit void my_exit ( void ) { nf_unregister_hook ( & nfho ); } module_init ( my_init ); module_exit ( my_exit );

Katso myös

Muistiinpanot

  1. Iczelionin oppitunnit. Win32 API. Oppitunti 20
  2. Esimerkiksi: Kaspersky Internet Security -prosessia ei voi käyttää tavallisilla Windows API -työkaluilla, koska virustorjunta sieppaa vastaavat toiminnot.
  3. Sivu Linux Ubuntu -manuaalisivulta: man-sivu ptracen kutsumisesta Arkistoitu 21. tammikuuta 2010 Wayback Machinessa ja venäjänkielinen versio: venäjänkielinen käännös OpenNETissä Arkistoitu 1. marraskuuta 2014 Wayback Machinessa
  4. Virallinen kuvaus: Debugging Application Programming Interface arkistoitu 30. toukokuuta 2014 Wayback Machinessa käyttöesimerkeillä: Win32 API. Oppitunti 28. Win32 Debug API I Arkistoitu 4. maaliskuuta 2010 Wayback Machinessa
  5. Sarja artikkeleita Ms Remin WindowsAPI-toimintojen sieppaamisesta (linkki, jota ei voi käyttää) . Käyttöpäivä: 24. heinäkuuta 2010. Arkistoitu alkuperäisestä 23. joulukuuta 2009. 
  6. Miksi kaikki Windowsin toiminnot alkavat turhalla MOV EDI, EDI-käskyllä?  - Vanha uusi asia . Haettu 11. tammikuuta 2017. Arkistoitu alkuperäisestä 13. tammikuuta 2017.
  7. Menetelmät IAT-taulukon käyttämiseksi ja muokkaamiseksi on kuvattu yksityiskohtaisesti Hoglund G., Butler J. - Rootkits: Implementation into the Windows Kernel -julkaisussa. Luku 4 Vangitsemisen muinainen taito
  8. Menetelmät DLL:n lisäämiseksi vieraaseen prosessiin on kuvattu yksityiskohtaisesti J. Richter Christopher Nazar Windowsissa C/C++:n kautta. Ohjelmointi Visual C++:lla. Jotkut toteutustavat on ensin dokumentoinut J. Richter itse
  9. Esimerkiksi yksi ensimmäisistä KLISTNER-rootkit- ilmaisimista , arkistoitu 25. heinäkuuta 2010 Wayback Machinessa
  10. 1 2 G. Hoglund J. Butler Rootkitit ruiskutetaan Windows-ytimeen. Luku 4 Vangitsemisen muinainen taito
  11. vartiomiesmurha [[Chris Kaspersky|CHRIS KASPERSKY]], AKA MOUSE Special: Hakkeri #072, s. 072-072-5 . Haettu 26. heinäkuuta 2010. Arkistoitu alkuperäisestä 4. joulukuuta 2010.
  12. Esimerkiksi nuuskijat tekevät tämän. Yksi ilmainen verkkopakettien sieppaustoteutus on NDIS WinPCAP- kerroksen verkkoohjain.

Kirjallisuus

  • Geoffrey Richter . Ohjelmointi Visual C++:ssa = Windows C/C++:n kautta. - Pietari. : Peter, 2010. - S. 689-728. - ISBN 978-5-7502-0367-3 .
  • Hoagland, Greg , Butler J. Rootkits: Windows-ytimen kumoaminen = Rootkits.Subverting the Windows-ytimen. - Pietari. : Peter, 2010. - S. 36-58,77-129. - ISBN 978-5-469-01409-6 .

Linkit