Módszerek api-lehallgató hívások win32
Lehallgatás rendszer operációs rendszer funkciói - vétel, ismert hosszú ideig. Általában elcsípi néhány rendszer funkció nyomon követésére vagy megváltoztatni a viselkedését. A nap DOS, programozók elfogják szoftver megszakítások (int 21h, 16h int, int 10h). Az Advent Win16 szükséges forrásokat, hogy elkapjam API-funkciókat. És végül, az Advent a Win32 megszakítóeszközök ismét fejlődött, hogy alkalmazkodni tudjanak az új rendszer. Windows operációs rendszerek soha nem tartalmaz beépített eszközöket kifejezetten, hogy elfogják rendszer funkcióit. És érthető így - ez mindig egy kicsit a hacker technikával. Ezért a lehallgatott szokásosan „azt jelenti, kéznél van”, és annak végrehajtásához világosan meg kell érteni sok a mélyebb szempontból a szerkezet és működése az operációs rendszer.
Jellemzői a szervezet memória Windows
Mivel lehallgatás szinte mindig társul a módosítás a memóriába (vagy a lehallgatott kódot funkciók vagy import / export táblázatok), annak megvalósítása során figyelembe kell venni jellemzői az építészet és a memória WinNT Win9X.
- A fiatalabb két gigabájt (00400000-7FFFFFFF) - kód és az adatok a felhasználói módú (a tartományban 00000000-003FFFFF rendezett szakaszok kimutatására null mutatók, valamint a kompatibilitás DOS és Win16 programok);
- Harmadik gigabájt - megosztott fájlokat vetített memóriában (MMF), és a rendszer DLL.
- Negyedik gigabájt - a kódot, és a kernel módú adat (itt az operációs rendszer kernel és a járművezetők).
Mindezek a különbségek jelentősen befolyásolják a módját, hogy hajtsák végre a lehallgatás funkció található a DLL.
Interceptions lehet osztani két típusa van: a helyi (lehallgatott belül folyamat) és a globális (az egész rendszerre kiterjedő).
helyi elfogás
Helyi lehallgatott az import rész
Végrehajtása során ezt a módszert kell venni, hogy DllMain felhívja a könyvtárból, ahol az elfogott funkció lehallgatott nem. Ez annak a ténynek köszönhető, hogy a lehallgatás lehet csak végrehajtása után a LoadLibrary, de ekkorra már DllMain hívják. Természetesen megírhatja változata LoadLibrary (DLL letöltési példák „kézi” ott), és a lehallgatott betöltődése között DLL és hívja a DllMain, de ez nagyban megnehezíti a feladatot.
A fő előnye ennek a módszernek, hogy egyformán hajtják végre Win9X és WinNT.
A Windows NT és a funkció Module32First Module32Next nem hajtották végre, és az átadás folyamatát modulok helyett kell használni a funkcióit PSAPI.dll.
Helyi lehallgatás funkció megváltoztatásával a lehallgatott (csak WinNT)
Sok példa végrehajtásának ez a módszer. Fogom nézni a módszer a Microsoft által javasolt - Detours könyvtárban.
Kerülőutak - ez az első hivatalos könyvtár célja, hogy elfogják funkciók (nem csak a rendszert, hanem bármely más). Az alapvető fogalmak Detours tartalmazza:
- célfüggvény (célfüggvény) - a funkció, amely a lehallgatást;
- funkció-szippantás (kitérőt funkció) - funkcionalitást elfogja;
- funkció-trambulin (trambulin funkció) - függvény, amely egy fejléc a célfüggvény és az átmenet csapat a többi kódot a célfüggvény.
Trambulin fordítás angolról - „trambulin”, de az „ugrás-funkció” pontosabban közvetíti a logikája annak munkáját.
Így, ha a célfüggvény a következő címmel:
DETOUR_TRAMPOLINE DetourFunction és makró funkció amelyek beágyazott táblázatot bontó, amely meghatározza, hogy hány bájt a fejléc a célfüggvény kell másolni a deszka-funkció (nem kevesebb, mint 5 bájt (JMP csapat méret) alkotó egész processzor utasítás). Ha az objektív függvény kevesebb mint 5 bájt, akkor elfogás sikertelen.
Abban az időben a telepítés / eltávolítás lehallgatási abba kell hagyni a folyamat minden más forrásokat, amelyekből a lehallgatás (vagy győződjön meg arról, hogy nem tudnak okozni, hogy elfogják funkció).
A fő hátránya ennek a módszernek, hogy az rendkívül alacsony fordulatszám (kivételkezelési Windows hosszú időt vesz igénybe). Ezen felül, a jelenléte egy kivételkezelőt, hogy elfogják a folyamat vezet az a tény, hogy ez a módszer nem fog működni. Továbbá, ez a módszer nem fog működni alatt debugger.
Global elfogás
Global lehallgatást is megvalósítható különböző módokon. Az első módszer - használata a helyi lehallgatott minden alkalmazás a rendszerben (futás idején elfogás vagy újabb). A második út - „hacker rendszer” - azt jelenti, a helyettesítés kód elfogott funkciókat közvetlenül a DLL-fájl vagy a kép a memóriában.
Globális elfogás módszere teljes helyi elfogás
Ez a módszer azon alapul, a következő: ha lehallgatott függvényében a jelenlegi folyamat, szükséges elvégezni a lehallgatást a kódot az összes folyamat a rendszerben. Számos módszer létezik, hogy valaki másnak a folyamat programfuttatási elfogás. A legegyszerűbb -, hogy ezt a kódot DllMain néhány könyvtár, majd végrehajtja azt egy másik folyamat. DLL végrehajtási módszerek is több (lásd. Jeffrey Richter). Legegyszerűbb dolgozó Win9X és WinNT - bevezetés DLL használatával csapdákat. Rájött: a rendszer telepítve csapda (a SetWindowsHookEx funkció) típusú WH_GETMESSAGE (ezt a csapdát, hogy elfogják a Windows-üzenetek). Ebben az esetben a modul, amelyben a csapdát automatikusan csatlakozik az áramlás meghatározott utolsó érv SetWindowsHookEx (Ha 0, a kapcsolat jön létre minden áramlik a rendszerben). Azonban a kapcsolat nem történik meg azonnal, de még mielőtt a szál üzenetsorába küldünk egy üzenetet. Ezért a lehallgatás végezzük nem azonnal elindítja az alkalmazást, és mielőtt a kezelési folyamat az első üzenet. Annak érdekében, hogy minden hívás lehallgatott funkció feldolgozása előtt az első kommunikációs folyamat nem lesz elfogott. És nem üzenetsort alkalmazások (pl konzol), ez a módszer bevezetése nem működik.
Írtam egy példát végrehajtási globális lehallgatási GetDriveTypeA funkciókat DLL injekció csapdákat és lehallgatott az import oldalán.
GetDriveTypeA funkciót kernel32.dll könyvtár által használt Windows-alapú programok segítségével állapítjuk meg a lemez típusát (helyi, CD-ROM, hálózat, virtuális, és így tovább. D.). Ez a következő prototípus:
lpRootPathName - útvonal a lemezre (A: \, H: \, stb)
GetDriveTypeA visszaadja az alábbi értékeket:
Lehallgatás ez a funkció lehetővé teszi, hogy a „csaló» Windows-program, felülírva az értéket a függvény visszatérési, bármely meghajtó.
DriveType2 program két modulból áll: DriveType2.exe és DT2lib.dll.
DriveType2.exe valósít felületet, és minden munkát a DT2lib.dll.
DT2lib projekt három fő fájlok:
APIHook.cpp - ez a fájl írta Jeffrey Richter (kivéve néhány korrekciókra, én megmondom róluk alább.). Ez a fájl tartalmazza a class CAPIHook, végrehajtja az előre meghatározott lehallgatási API-funkció az összes modul a jelenlegi folyamat. Ez is automatikusan elfogja LoadLibraryA funkció LoadLibraryW, LoadLibraryExA, LoadLibraryExW és GetProcAddress.
Toolhelp.h - ez a fájl is írta Jeffrey Richter. A leírás alapján CToolhelp osztályt, amely megvalósítja a fellebbezés toolhelp-rendszer funkcióit. Ebben az esetben használatos CAPIHook osztály felsorolásakor minden csatlakoztatott modulok a folyamatot.
DT2Lib.cpp - ebben a fájlban, rájöttem lehallgatás GetDriveTypeA funkció segítségével osztály CAPIHook, valamint a telepítési WH_GETMESSAGE csapdatípus, amely kapcsolatot biztosít a modul (DT2lib.dll) minden folyamatra a rendszerben.
Hogyan működik a lehallgatást?
Közvetlenül a begyújtás után DriveType2.exe funkciót nevezik a DT2_HookAllApps DT2lib.dll, amely megállapítja, csapda.
Csatlakoztatása után, hogy az áramlási DLL inicializálja az összes változók (minden egyes folyamat, amelyhez a DLL van csatlakoztatva, van egy példányát a globális és statikus változókkal ott leírt). A globális változók már 6 esetben az osztály CAPIHook (az GetDriveTypeA a DT2Lib.cpp és LoadLibraryA, LoadLibraryW, LoadLibraryExA, LoadLibraryExW és GetProcAddress - a APIHook.cpp). Így, amikor csatlakoztatja a DLL hatszor fordul elő hívja CAPIHook osztály konstruktora, hogy elfogják a fenti funkciók az aktuális (azaz, sőt, ami most történt csatlakozás) folyamat.
Az adagolás befejezése után a végrehajtott folyamat DLL van tiltva. Ugyanakkor van egy hívás destruktor CAPIHook minden esetben az osztály.
Ez a funkció most hívott minden alkalommal ez a modul lesz a fellebbezés GetDriveTypeA.
Hook_GetDriveTypeA művelet először meghívja az eredeti GetDriveTypeA. Aztán, ha a visszatérési érték nagyobb, mint DRIVE_NO_ROOT_DIR (azaz a megfelelő funkciót az az érv, és ez végre hiba nélkül került át), ellenőrizzük, hogy a lemez felülbírálja, amelynek típusa kérik. Információ értékeit elfogott funkciók ebben az esetben tárolja a realizált nekem tömb BYTE meghajtók [26], amely lehetővé teszi a lehallgatást 26 meghajtók tól: Z. tárolt értékek visszatértek GetDriveTypeA függvény a tömbben az egyes meghajtók. Tehát, ha az érték a tömb elem megfelelő érv GetDriveTypeA egyenlő 0xFF, akkor a visszatérési érték változatlan, egyébként a visszatérési érték a tömbben. Rögzíti az értékeket a tömbbe kerül végrehajtásra DriveType2.cpp.
Ha szeretné ezt a programot, hogy működjön teljesen WinNT, szintén vevőműködés GetDriveTypeW.
Ez a módszer egy hátránya: egyes kereskedelmi programok (például egy népszerű fájlkezelő Total Commander, tele aspack) különböző védelmi rendszerek (ASProtect, VBox, stb ...), a titkosított import táblázata a védett alkalmazás. Ezeket a programokat, ez a módszer nem működik.
Global elfogás lehet végrehajtani segítségével Detours (a WinNT esetén). És DLL injekciós technikát ismert néhány, a különböző kiviteli a globális lehallgatás tud nyújtani egy csomó.
Global lehallgatás helyettesítve a kódot a DLL
Ez a módszer lehet megvalósítani két módja van: a közvetlen szerkesztését kódot az DLL, ami az objektív függvény vagy helyettesítése egy másik DLL exportáló azonos szolgáltatásához. A második módszer az úgynevezett „spoofing segítségével göngyölő (göngyölő)».
Az első módszer lehetővé teszi, hogy végre csak egy viszonylag kis méretű elfogó funkció, mivel a kód kell bevezetni a szabad helyek DLL - főként a régióban kereszteződés. A másik hátránya - a kódot kell írni assembly nyelven. Az általános ideológiája ez a módszer ugyanaz, mint a kitérő. A célfüggvény a kód végrehajtását JMP parancsot a funkció elfogó. Bájtok másolt „alól” jmp'a költözött az elfogó (mint az elfogó még írt assembly nyelven, ebben az esetben könnyebb kombinálni a jobb trambulin). Itt egy példa megvalósítása ennek az eljárásnak.
A katalógus DriveType0 kernel32.dll fájl, amelyben tettem a következő korrekciókat (a hiew32.exe):
Így, amikor a LED nem világít ScrollLock, GetDriveTypeA funkció a megszokott módon működik, de ha van egy - valami minden Windows-alapú alkalmazások az összes helyi meghajtó (az enyém C: \ és D: \) alakítjuk CD-ROM-ok.
Ahhoz, hogy mindezt a munkát, akkor ki kell cserélni a fájlt a C: \ Windows \ System \ kernel32.dll meg DriveType0 \ kernel32.dll fájlt. Ezt meg lehet tenni, csak indítsa el a számítógépet MS-DOS módban, kernel32.dll - a Windows egyik rendszer a könyvtárak. Ezt a példát végre a Windows 98 óta a rendszer könyvtárak függ a Windows verziója (és még a build szám), majd más operációs rendszerek, ez a példa nem fog működni (végre kell hajtani minden változata kernel32.dll újra).
Ez a módszer a lehallgatás - az egyik legerősebb. Azonban nem lesz képes használni a kereskedelmi termékek, mert ez nyilvánvalóan sérti szinte bármilyen licencszerződést.
Egy másik módja, hogy végre ez a módszer - használata csomagolóanyagokat (átalakítók). Ennek lényege létre saját DLL ugyanazokat a funkciókat exportált, mint az eredeti. Példaként, idézem a következő megvalósítási módja szerint a fenti példa:
A funkció-elfogó hívhatja az eredeti funkciót kernel31.dll.
A fő hátránya ennek a módszernek, hogy nem alkalmas a DLL exportáló változókat.
Global lehallgatás helyettesítve kódot a DLL a memóriában (csak Win9x)
Példa DriveType1 két részből áll - DTDrv.sys és telepítő script DTDrv.inf és DriveType.exe programot.
DriveType.exe összeállított egy DriveType.cpp modul, végrehajtja a felhasználói felület és a felület a vezető. A interfész meghajtó révén hajtják végre CreateFile funkció (megnyitása a vezető), DeviceIoControl (I-O) és CloseHandle (illesztőprogram záró). Megvalósult négy parancs az úgynevezett keresztül DeviceIoControl - elfogás GetDriveTypeA funkció eltávolítása a lehallgatás, amelyben a visszatérési érték a lehallgatás funkció az egyes lemez A. Z. olvasni a jelenlegi állapotában a lehallgatás.
A fő alkalmazott változók DriveType.cpp: