Sovelluksen ja sen ulkoisten kirjastojen välillä on tilaa syöttää koodia. Se ei ole luonnostaan huonoa, mutta se on loistava tapa tehdä vahinkoa.
Kun kehittäjien on laajennettava sellaisen ohjelman toimintoja, jolle heillä ei ole lähdekoodia, he käyttävät usein DLL-kiinnityksiä. Tämä on epätavallinen tapa saada ohjelma tekemään jotain, mitä sen ei ole tarkoitus tehdä.
Asia on se, että hakkerit käyttävät tätä tekniikkaa myös vääriin syihin, kuten vaarattomien sovellusten aseistamiseen tai ohjelmistojen murtamiseen. Joten mitä on DLL-kiinnittäminen ja miten se todella toimii?
Mikä on DLL?
Jokainen sovellus riippuu joistakin sen peruskoodin ulkopuolisista tiedostoista. Nämä ulkoiset tiedostot sisältävät koodia ja tietoja, joita ohjelma tarvitsee toimiakseen oikein. Kun jokin näistä ulkoisista tiedostoista katoaa, ohjelmalla voi olla vakausongelmia tai se voi kieltäytyä suorittamasta kokonaan.
Windows-käyttöjärjestelmässä näitä ulkoisia tiedostoja kutsutaan DLL- tai dynaamisesti linkkikirjastoiksi. Dynaamiset linkkikirjastot ovat Windows-käyttöjärjestelmän olennaisia osia, ja ne tarjoavat uudelleen käytettävää koodia ja resursseja, jotka voidaan jakaa useiden sovellusten kesken.
Windowsin ulkoisia tiedostoja kutsutaan kirjastoiksi. On olemassa kahdenlaisia kirjastoja: dynaamisia ja staattisia. Dynaamiset kirjastot ladataan ajon aikana ja staattiset kirjastot käännösaikana. DLL on dynaaminen kirjasto.
Mikä on DLL-kiinnittäminen?
DLL-kiinnittäminen on tekniikka, joka sisältää ohjelmien tai prosessien DLL-tiedostoon tekemien toimintokutsujen sieppaamisen ja muuttamisen. Pohjimmiltaan Man-in-The-Middle -asetus on perustettu paikkaan, jossa koukku on ohjelman ja sen kutsumien DLL-tiedostojen välissä. Kaikki tai kohdistetut funktiokutsut jäljitetään ja niitä muutetaan.
Tässä on esimerkki DLL-kiinnityshyökkäyksen työnkulusta:
- Hyökkääjä analysoi ohjelman tekemiä toimintokutsuja ja DLL-tiedostoja, joista se riippuu.
- Hyökkääjä luo koukun käyttämällä yhtä monista toteutustekniikoista, kuten IAT-kytkentä, inline hooking, COM hooking jne.
- Tapahtuu mielivaltainen koodin suoritus.
- Alkuperäinen funktiokutsu voidaan suorittaa tai ei.
- Hyökkääjä peittää jälkensä poistamalla koukun ja palauttamalla kaikki tehdyt muutokset.
DLL-kiinnittäminen on hienostunut tekniikka, jota voidaan käyttää sekä hyvään (kuten ohjelman toiminnallisuuden laajentamiseen, virheenkorjaukseen ja kirjaaminen) tai huonoista (kuten turvatoimenpiteiden ohittaminen, arkaluonteisten tietojen varastaminen, mielivaltaisen koodin suorittaminen ja videopelin kirjoittaminen hakkerit).
Kuinka DLL-kiinnittäminen toimii?
Ennen kuin sukeltaa DLL-kytkentään, on tärkeää selvittää perusasiat. Otetaan askel taaksepäin ja ymmärretään, mitä tapahtuu, kun ohjelma kutsuu funktiokutsua DLL: lle.
Kun ohjelma kutsuu funktiota DLL: ssä, käyttöjärjestelmä etsii ensin funktion nimen ohjelman tuontiosoitetaulukkoon ja saa funktion osoitteen DLL: n vientiosoitteesta Pöytä.
Kun funktion osoite on ratkaistu, ohjelma voi hypätä funktion osoitteeseen käyttääkseen sitä ja suorittaakseen sen. DLL-kiinnittäminen pyörii tämän prosessin sieppaamisessa ja funktiokutsun uudelleenohjauksessa toiseen toimintoon. On olemassa useita tapoja toteuttaa DLL-kiinnityksiä. Katsotaanpa yleisimmin käytettyjä tekniikoita sen toteuttamiseksi.
Tämä voi olla melko teknistä, joten se voi auttaa, jos sinä ovat Windowsin tehokäyttäjä tai sinulla on muuten vahva käsitys Windowsin sisäisistä ominaisuuksista.
IAT koukkuun
IAT-kiinnittäminen on tehokas tekniikka, jota haittaohjelmien tekijät käyttävät laajalti turvatoimenpiteiden kiertämiseen ja havaitsemisen välttämiseen. Import Address Table (IAT) on tietorakenne, joka ladataan muistiin aina, kun uusi prosessi luodaan. IAT sisältää kaikkien tuotujen funktiokutsujen nimet ja niiden muistiosoitteet.
Kun ohjelma kutsuu funktiota DLL: ssä, funktion nimi etsitään ensin IAT: sta ja jos mainitun toiminnon muistiosoitetta ei löydy IAT: stä, vaan se määritetään DLL: n vientiosoitteesta Pöytä.
Se on tietorakenne, jossa kaikki DLL: n viemät toiminnot on kartoitettu niiden muistiosoitteisiin. IAT-kiinnityksessä vastustaja voi muokata prosessin IAT: tä ja korvata lailliset funktiokuvaukset haitallisten kanssa, mikä häiritsee aiottua toimintaa ja tekee ohjelman suorittamisesta mielivaltaisesti koodi.
Tältä näyttää yleinen hyökkäysvirta IAT-kiinnityksessä:
- Ohjelma tekee funktiokutsun.
- Toiminnon osoite sijaitsee IAT: ssa.
- Koska IAT on ollut koukussa; toiminnon osoite on muutettu ja haitallisen toiminnon muistipaikka on ladattu.
- Ohjelma hyppää haitallisen toiminnon sijaintiin ja mielivaltainen koodi suoritetaan.
- Lopuksi alkuperäinen funktiokutsu suoritetaan.
Inline koukku
Inline hooking on DLL-kytkentätekniikka, jossa kohdefunktion lähdekoodia muutetaan sen suorittamisen ohjaamiseksi erityistoimintoon. Inline Hooking, toisin kuin IAT hooking, muuttaa kohdefunktion koodia suoraan, jolloin hyökkääjä voi hallita tarkemmin kohdefunktion käyttäytymistä.
Tarkkaile yllä olevasta kaaviosta, kuinka laillista toimintoa on peukaloitu haitalliseen toimintoon osoittamiseksi. Kun kaikki haitallisen toiminnon ohjeet on suoritettu, suoritetaan hyppykäsky palatakseen lailliseen toimintoon, jotta sen suorittaminen päättyy.
Vastustajat käyttävät sisäistä kytkentää tehdäkseen pysyviä muutoksia ohjelmaan, kuten muuttaakseen parametreja tai funktion palautusarvoa.
Microsoftin kiertoreitit
Microsoft Research on kehittänyt oman DLL-kiinnittäjäpaketin, Detours. Sen avulla ohjelmoijat voivat seurata ja muuttaa ohjelman tekemiä toimintokutsuja. Kiertoteitä voidaan käyttää erilaisiin tehtäviin, mukaan lukien mutta ei rajoittuen: instrumentointiin, testaamiseen ja virheiden korjaamiseen.
Vastustajat käyttävät Detoursia DLL-injektio- ja hooking-hyökkäysten suorittamiseen, ja kehittäjät käyttävät sitä usein laajentaakseen sovellustensa toimintoja. Voit lukea lisää Detours-paketista osoitteessa virallinen GitHub-arkisto.
Nyt tiedät kuinka DLL-kiinnittäminen toimii
DLL-kiinnittäminen on hienostunut tekniikka, joka oikeista syistä käytettynä voi parantaa sovelluksesi ominaisuuksia tai auttaa sinua virheenkorjauksessa ja ohjelmiston optimoinnissa. Valitettavasti koukkuun kiinnittäminen nähdään yleisemmin vastavuoroisena tekniikana kuin kehitystekniikana. On siis tärkeää, että otat käyttöön ja noudatat parhaita tietoturvakäytäntöjä varmistaaksesi, että sovelluksesi ovat turvallisia ja vapaita hyökkäyksiltä, kuten kiinnittämisestä ja injektiosta.