Rakenduse ja selle väliste teekide vahele on ruumi koodi sisestamiseks. See ei ole oma olemuselt halb, kuid see on suurepärane viis kurja teha.
Kui arendajatel on vaja laiendada programmi funktsionaalsust, mille lähtekoodi neil pole, kasutavad nad sageli DLL-i haakimist. See on ebatavaline viis panna programm tegema midagi, milleks see pole mõeldud.
Asi on selles, et häkkerid kasutavad seda tehnikat ka valedel põhjustel, näiteks kahjutute rakenduste relvastamiseks või tarkvara murdmiseks. Mis on DLL-i haakimine ja kuidas see tegelikult töötab?
Mis on DLL?
Iga rakendus sõltub mõnest failist väljaspool selle põhikoodi. Need välised failid sisaldavad koodi ja andmeid, mida programm vajab korralikult töötamiseks. Kui mõni neist välistest failidest kaob, võib programmil olla stabiilsusprobleeme või see võib keelduda käivitamast.
Windowsi operatsioonisüsteemis nimetatakse neid väliseid faile DLL-i või dünaamilise lingi raamatukogudeks. Dünaamilised lingiteekid on Windowsi operatsioonisüsteemi olulised komponendid, pakkudes korduvkasutatavat koodi ja ressursse, mida saab jagada mitme rakenduse vahel.
Välised failid Windowsis on tuntud teekidena. Teeke on kahte tüüpi: dünaamilised ja staatilised. Dünaamilised teegid laaditakse käitamise ajal ja staatilised teegid laaditakse kompileerimise ajal. DLL on dünaamiline raamatukogu.
Mis on DLL-i haakimine?
DLL-i haakimine on tehnika, mis hõlmab programmide või protsesside funktsioonikutsete katkestamist ja muutmist DLL-ile. Sisuliselt mees-keskel seadistus luuakse kohas, kus konks asub programmi ja selle kutsutavate DLL-ide vahel. Seejärel jälgitakse ja muudetakse kõiki või sihitud funktsioonikutseid.
Siin on näide DLL-i haakimise rünnaku töövoost:
- Ründaja analüüsib programmi poolt tehtud funktsioonikutseid ja DLL-faile, millest see sõltub.
- Ründaja loob konksu, kasutades ühte paljudest rakendustehnikatest, nagu IAT haakimine, inline haakimine, COM-i haakimine jne.
- Toimub suvaline koodi täitmine.
- Algne funktsioonikutse täitmine võib juhtuda, kuid ei pruugi juhtuda.
- Ründaja varjab oma jäljed, kustutades konksu ja tühistades kõik tehtud muudatused.
DLL-i haakimine on keerukas tehnika, mida saab kasutada nii headel eesmärkidel (nt programmi funktsionaalsuse laiendamine, silumine kui ka logimine) või halbade (nt turvameetmetest möödahiilimine, tundlike andmete varastamine, suvalise koodi käivitamine ja videomängude kirjutamine) häkid).
Kuidas DLL-i haakimine töötab?
Enne DLL-i haakimise juurutamist on oluline selgeks teha põhitõed. Astume sammu tagasi ja mõistame, mis juhtub, kui programm teeb funktsioonikutse DLL-ile.
Kui programm kutsub DLL-is funktsiooni, otsib operatsioonisüsteem esmalt üles funktsiooni nime programmi impordi aadressi tabelit ja saab funktsiooni aadressi DLL-i ekspordiaadressist Tabel.
Kui funktsiooni aadress on lahendatud, saab programm hüpata funktsiooni aadressile, et sellele juurde pääseda ja seda käivitada. DLL-i sidumine keerleb selle protsessi pealtkuulamise ja funktsioonikutse ümbersuunamise ümber teisele funktsioonile. DLL-i haakimise rakendamiseks on mitu võimalust. Vaatame selle rakendamiseks kõige sagedamini kasutatavaid tehnikaid.
See võib muutuda üsna tehniliseks, nii et see võib teid aidata on Windowsi energiakasutaja või omama muul viisil Windowsi sisemistest asjadest tugevat arusaamist.
IAT haakimine
IAT haakimine on tõhus tehnika, mida pahavara autorid laialdaselt kasutavad turvameetmetest kõrvalehoidmiseks ja avastamisest kõrvalehoidmiseks. Impordi aadressitabel (IAT) on andmestruktuur, mis laaditakse mällu iga kord, kui luuakse uus protsess. IAT sisaldab kõigi imporditud funktsioonikutsete nimesid ja nende mäluaadresse.
Kui programm kutsub funktsiooni DLL-is, otsitakse esmalt funktsiooni nime IAT-st ja kui nimetatud funktsiooni mäluaadressi IAT-st ei leita, siis määratakse see DLL-i ekspordiaadressi järgi Tabel.
See on andmestruktuur, kus kõik DLL-i eksporditud funktsioonid on vastendatud nende mäluaadressidele. IAT-i haakimisel saab vastane muuta protsessi IAT-i ja asendada seaduslikud funktsioonide vastendused pahatahtlikega, häirides seega kavandatud toimingut ja muutes programmi täitmise meelevaldseks kood.
Üldine ründevoog IAT-i haakimisel näeb välja järgmine:
- Programm teeb funktsioonikutse.
- Funktsiooni aadress asub IAT-is.
- Kuna IAT on konksul olnud; funktsiooni aadressi on muudetud ja pahatahtliku funktsiooni mälukoht on laaditud.
- Programm hüppab pahatahtliku funktsiooni asukohta ja käivitatakse suvaline kood.
- Lõpuks käivitatakse algne funktsioonikutse.
Sissehaakimine
Inline haakimine on DLL-i haaketehnika, mis hõlmab sihtfunktsiooni lähtekoodi muutmist, et suunata selle täitmine erifunktsioonile. Inline Hooking, erinevalt IAT haakimisest, muudab sihtfunktsiooni koodi otse, andes ründajale täpsema kontrolli sihtfunktsiooni käitumise üle.
Ülaltoodud diagrammil jälgige, kuidas seaduslikku funktsiooni on rikutud, et osutada pahatahtlikule funktsioonile. Kui kõik pahatahtliku funktsiooni juhised on täidetud, tehakse hüppekäsk, et naasta seadusliku funktsiooni juurde, et see saaks täitmise lõpetada.
Vastased kasutavad programmis püsivaid muudatusi, näiteks funktsiooni parameetrite või tagastamisväärtuse muutmiseks sisemist haakimist.
Microsofti ümbersõidud
Microsoft Research on välja töötanud ettevõttesisese DLL-i haakepaketi Detours. See võimaldab programmeerijatel jälgida ja muuta programmi poolt tehtud funktsioonikõnesid. Ümbersõiduteid saab kasutada mitmesuguste ülesannete jaoks, sealhulgas, kuid mitte ainult: mõõteriistad, testimine ja vigade parandamine.
Vastased kasutavad DLL-i süstimise ja haakimise rünnakute läbiviimiseks ümbersõite ning arendajad kasutavad seda sageli oma rakenduste funktsionaalsuse laiendamiseks. Ümbersõitude paketi kohta saate lisateavet aadressilt ametlik GitHubi hoidla.
Nüüd teate, kuidas DLL-i sidumine töötab
DLL-i haakimine on keerukas tehnika, mis õigetel põhjustel kasutamisel võib teie rakenduse võimalusi suurendada või aidata teil tarkvara siluda ja optimeerida. Kahjuks nähakse haakimist sagedamini pigem võistleva kui arendustehnikana. Seetõttu on oluline turvalisuse parimate tavade kasutuselevõtt ja järgimine, tagades, et teie rakendused on turvalised ja vabad rünnakutest, nagu haakimine ja süstimine.