windows 8
Időről időre, általában a második szerdán a hónap, akkor hallani a történetet, hogy miután egy Windows-frissítés nem képes elindulni, mutatja a kék képernyő a halál. A legtöbb esetben az oka ennek a helyzetnek egy rootkit vagy egyedi rendszer szoftver, könnyelműen kezelni belső működési struktúrák. Blame, természetesen továbbra is frissíteni, mert „előtt minden működött.”
Már a kezdetektől fogva, hogy nincs-e, mint egy védelmi mechanizmus ellen rootkitek mert rootkitek működik a sejtmagban ugyanazokkal a jogokkal, és ebből következően PatchGuard lehet semlegesíteni. Inkább egy olyan szűrő, amely csökkenti a lusta rootkit fejlesztők.
PatchGuard amely védi
A legnépszerűbb úti cél átalakítása volt a kernel rendszer hívás asztalra. A rendszer segítségével a mutatók módosítása a rendszer hívás funkció könnyen elkapni őket, szűrő, a fakitermelés és így tovább. N. És ez a patch óta népszerű rootkitek, valamint az anti-vírus szoftver. További érdekes tárgyakat a tapasz - a leíró táblázat (GDT, IDT). Módosítása révén a globális leíró tábla megváltoztathatja a szegmens attribútumok, ami egy backdoor a kódot, és a megszakítás leíró táblázat is elfogják ... közbe! Részletes azonos fiúk tördelni közvetlenül a kernel függvények.
Ennek megfelelően az első változat PatchGuard védett:- rendszer hívás táblázat (SST),
- a globális leíró táblázat (GDT)
- megszakítás leíró táblázat (IDT),
- A kernel image,
- nukleáris stack.
- több rendszer képek, nem csak a kép a nucleus (nt, hal, WerLiveKernelApi, tm, clfs, Pshed, kdcom, bootvid, ci, msrpc, ndis, ntfs, tcpip, fltmgr)
- kritikus kernel adatszerkezet (például, egy listát a folyamatok)
- beállítva MSR (például, modell-specifikus regisztrálja IA32_LSTAR),
- KdpStub - eljárás hibakereső megkapja a vezérlést után kivétel.
Őrök PatchGuard
Érdemes megjegyezni, hogy a PatchGuard aktívan használja az új végrehajtási kivételkezelés bevezetett x64 Windows-verziók. Ezt alkalmazzák a ködösítés a PatchGuard, és ellenőrizzék a integritását védett képeket is.
A korábbi Windows verziók kivételkezelőt használt adatszerkezetek közvetlenül a verem, hogy még lehetővé teszi, hogy megkerülje verem a cookie-k működésének réseket. A fő változás a birtokában egy speciális asztalon belül végrehajtható képet bejegyzéseket minden ellátásához.
typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY
// kivételkezelés>;>
_IMAGE_RUNTIME_FUNCTION_ENTRY, * _PIMAGE_RUNTIME_FUNCTION_ENTRY;
Amikor Az operációs rendszer indításakor PatchGuard teremt 1 és 4 közötti összefüggések - az adatszerkezetek tárolására róluk másolatot használt funkciók, kontrollösszegekre védett struktúrák és összefüggésben a titkosítási kulcsot. Ezek összefüggések vannak tárolva lapozott titkosított formában. Ellenőrzésére kontextusban később beszélünk.
Inicializált kontextusok PatchGuard 1. fázisú OS csomagtartó. Funkció vesz részt közvetlenül a létrehozása keretében, nem nyilvános jellegű (nevezzük KiInitializePatchGuardContext), de megtalálható benne az KiFilterFiberContext funkciót. Találtunk két helyet, ahol PatchGuard összefüggésben hozható létre:
-(Call) -> Phase1InitializationDiscard - (call) -> KeInitAmd64SpecificState
-(Kivétel) -> KiFilterFiberContext
. -(Call) -> Phase1InitializationDiscard - (call) -> sub_14071815C
-(Call) -> ExpLicenseWatchInitWorker - (call) -> KiFilterFiberContext
Az első lehetőség mindig létre legalább egy vonatkozásban, míg a második csak 4% -ában. Szintén figyelemre méltó az első kiviteli alakban, ami KiFilterFiberContext funkciót implicit, nevezetesen a „töltelék” kivétel.
A pszeudo-kód funkció KeInitAmd64SpecificState
__int64 KeInitAmd64SpecificState ()
if (! InitSafeBootMode)
// felvezető, hogy csak akkor KiFilterFiberContext eredmény =
(! V0 / ((KdPitchDebugger | KdDebuggerNotPresent) = 0. -1 17).);> Vissza eredményt;>
sub_14071815C funkció látszólag nem nyilvános jellegét, amely össze van kötve ellenőrzése OS engedélyt.
A pszeudo-kód funkció ExpLicenseWatchInitWorker
NTSTATUS (* KiFilterFiberContext) (PVOID pFilterparam); BOOLEAN ForgetAboutPG; A következő egy ál KiFilterFiberContext funkciót, válassza ki a módszer ellenőrzésének speciális összefüggésben, és a funkció meghívása létrehozásának összefüggésében is. A pszeudo-kód funkció KiFilterFiberContext BOOLEAN KiFilterFiberContext (PVOID pKiFilterParam) Függvényt, amely létrehozza a kontextusban PatchGuard, eltorzítva, hogy az automatizált eszközök nem tud megbirkózni vele, és hirtelen érdeklődő kutatók a visszatérés. A statika, ez egy teljes káosz, 10K + vonalakat decompiled „feje” a kód (dekompilálása magát IDA Pro 40 percig tart).
VOID ExpLicenseWatchInitWorker ()
// KiServiceTablesLocked == KiFilterParam KiFilterParam = KiInitialPcr.Prcb.HalReserved [1];
KiInitialPcr.Prcb.HalReserved [1] = NULL; KiFilterFiberContext = KiInitialPcr.Prcb.HalReserved [0];
KiInitialPcr.Prcb.HalReserved [0] = NULL; ForgetAboutPG = (InitSafeBootMode! = 0)
| (KUSER_SHARED_DATA.KdDebuggerEnabled >> 1);
// esetek 96% -ában, ha (__rdtsc ()% 100> 3) ForgetAboutPG | = 1;
if (! ForgetAboutPG KiFilterFiberContext (KiFilterParam)! = 1)
KeBugCheckEx (SYSTEM_LICENSE_VIOLATION, 0x42424242, 0xC000026A, 0, 0)>
// 50-50, hogy létre fog hozni egy második kontextus DWORD64 dwMethod1 = __rdtsc ()% 6;
// Válassza a dob módszer AntiDebug () ellenőrzi; Eredmény = KiInitializePatchGuardContext (dwDpcIdx,
dwMethod1 (dwRand2 <6) + 1, pKiFilterParam, TRUE);
if (dwRand2 <6)
Eredmény = KiInitializePatchGuardContext (dwDpcIdx2, dwMethod2, 2, pKiFilterParam, HAMIS);
> AntiDebug (); visszatérés eredménye;>
- még egy egyszerű művelet, mint a vevő a véletlen szám kent 50+ sornyi assembler kód;
- ciklus összes telepített;
- ki a sok „halott” kód;
- használt közvetett hivatkozást a külső változók és függvények.
cli xor eax, eax cmp byte ptr cs: KdDebuggerNotPresent,
al JNZ rövid loc_140F3CFBD JMP rövid loc_140F3CFBB sti
Mit anti-hibakeresés trükk 1?
Míg csatlakozik a hibakereső belép egy végtelen ciklus folyamatos.
cli sidt fword ptr [RBP + 320H] lidt fword ptr [RBP + 228h] mov DR7,
R13 lidt fword ptr [RBP + 320H] sti
Mit anti-hibakeresés trükk 2?
Betölti ideiglenes érvénytelen állapotban megszakítás leíró tábla. Ha majd a hozzáférést a hibakeresés regiszterek, hibakeresési kivétel történik, amely ilyen körülmények között vezet hármas hiba, majd újraindul.
Hívjon sorozata rekurzív függvények, attól függően, hogy a DPC-funkció
ExpTimerDpcRoutine -> KiCustomAccessRoutine0 -> KiCustomRecurseRoutine0 ... KiCustomRecurseRoutineN
IopTimerDispatch -> KiCustomAccessRoutine1 -> KiCustomRecurseRoutine1 ... KiCustomRecurseRoutineN
IopIrpStackProfilerTimer -> KiCustomAccessRoutine2 -> KiCustomRecurseRoutine2 ... KiCustomRecurseRoutineN
PopThermalZoneDpc -> KiCustomAccessRoutine3 -> KiCustomRecurseRoutine3 ... KiCustomRecurseRoutineN
CmpEnableLazyFlushDpcRoutine -> KiCustomAccessRoutine4 -> KiCustomRecurseRoutine4 ... KiCustomRecurseRoutineN
CmpLazyFlushDpcRoutine -> KiCustomAccessRoutine5 -> KiCustomRecurseRoutine5 ... KiCustomRecurseRoutineN
KiBalanceSetManagerDeferredRoutine -> KiCustomAccessRoutine6 -> KiCustomRecurseRoutine6 ... KiCustomRecurseRoutineN
ExpTimeRefreshDpcRoutine -> KiCustomAccessRoutine7 -> KiCustomRecurseRoutine7 ... KiCustomRecurseRoutineN
ExpTimeZoneDpcRoutine -> KiCustomAccessRoutine8 -> KiCustomRecurseRoutine8 ... KiCustomRecurseRoutineN
ExpCenturyDpcRoutine -> KiCustomAccessRoutine9 -> KiCustomRecurseRoutine9 ... KiCustomRecurseRoutineN
Háttér A vizsgálat két fázisból áll: az első, ellenőrizze keretében a szerkezet, amely akkor következik be, DPC-szintet, akkor a tervezett munka elemet, ellenőrzi az összes védett struktúrák a rendszerben patak. Ha a teszt sikeres volt, a régi összefüggésben eltávolítjuk, és újat hoz létre, amely indul, miután egy véletlen időintervallumban. Ha a teszt sikertelen, PatchGuard takarítás a nyomait, köztük megsemmisíteni a verem, és megjeleníti a kék képernyő hibakódot 0x109: CRITICAL_STRUCTURE_CORRUPTION.
SIFCO önálló dekódoláshoz az első szakaszban a vizsgálat keretében:
Hogyan nyerjünk
A windows 10
Amikor KiFilterFiberContext vizsgálata Windows 10 Technical Preview, azt vettük észre, egy kis változás. Minden a régi tervezési módszerek ugyanazok maradnak. Azonban van egy új, még, hogy biztosan visszatér STATUS_HV_FEATURE_UNAVAILABLE. egy kis ásás, találtunk KiSwInterruptDispatch funkció, amelyen belül egyértelműen kihívást átirat és kontextusban érvényesítése. Nyilvánvaló, hogy lesz hozzá a lehetőséget, hogy végezzen ellenőrzést a kérelem keretében Hyper-V hypervisor. Hypervisor, bizonyos feltételek mellett, jön egy szintetikus megszakítás kezelő amely ellenőrzi integritását a kernel.
A történet folytatódik
Ebben a cikkben megpróbáltuk, hogy nem adja meg a nevét speciális funkciókat, nem azért, mert sajnálom. Ez egyszerű: a nevét, a használt funkciók visszafejteni, és ellenőrzi a kontextusban szándékosan megváltoztatta a fejlesztők PatchGuard és változhat a különböző változatai az operációs rendszer.
Itt egy példa nesootvtestviya függvény nevére, mit csinál valójában. Ez ugyanaz a funkciója, amelynek egy példányát használják összefüggésben samorasshifrovki.
Egy jó dolog - mindezek a funkciók közel, hogy el lehet kezdeni a KiFilterFiberContext funkciót. Nyilvánvaló, hogy minden tartozik ugyanahhoz a forráskód fájl. Azonban a mag integritásának ellenőrzése nem korlátozódik egy PatchGuard. A különböző részein a kernel makrók illeszthetők, az ellenőrzést végző egyes szerkezetek. Minden ilyen hely is keresni kell manuálisan. például:
--> Phase1InitializationDiscard -> CcInitializeCacheManager -> CcInitializeBcbProfiler
A valószínűsége 50%, ez a funkció elvégzi ellenőrző számítást egy tetszőleges függvény a mag és annak tervek minden 2 percben DPC CcBcbProfiler funkcióval.
Tehát sok szerencsét a kereséshez! PatchGuard Érdekes az a tény, hogy a visszatérés fun;)