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.”

windows 8

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.
A fejlesztés az NT-t feldolgozott sor alapvető összetevőit, beleértve a PatchGuard. Abban a pillanatban, nehéz felsorolni mindent, ami védi a segítségével:
  • 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 // start funkció uint32_t EndAddress; // Vége a funkciója unió // mutató az adatok használatának előmozdítása érdekében a verem és uint32_t UnwindData;

// 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 () Csökkentett módban PatchGuard nem működik
if (! InitSafeBootMode) // Ha nem hibakereső részlege okoz kivételt (túlfolyó az osztás után a -1)
// 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


VOID ExpLicenseWatchInitWorker ()

NTSTATUS (* KiFilterFiberContext) (PVOID pFilterparam); BOOLEAN ForgetAboutPG;
// 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)>

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)
// Jelölje DPC, amelyet ellenőrizni kell DWORD64 dwRand2 = __rdtsc ()% 10;
// 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) csinál míg a ((dwMethod1! = 0) (DwMethod1 == dwMethod2));
Eredmény = KiInitializePatchGuardContext (dwDpcIdx2, dwMethod2, 2, pKiFilterParam, HAMIS);
> AntiDebug (); visszatérés eredménye;>

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).

windows 8

Mindenki arról beszél, hogy a széles körben alkalmazott makrók:
  • 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.
Dynamics is nagyon egyszerű. Íme néhány példa, amit szétszórt a kódot.
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.

windows 8

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;)

Kapcsolódó cikkek