c - Windows display driver hooking, 64 bit

Indlæg af Hanne Mølgaard Plasc

Problem



Når jeg har skrevet en slags driver til Windows, der skulle aflytte interaktionen mellem den indbyggede skærmdriver med operativsystemet. Den indbyggede skærmdriver består af en miniportdriver og en DLL indlæst af win32k.sys i sessionen. Mit mål var at blande sig mellem win32k.sys og den DLL. Desuden kan systemet have flere skærmdrivere, jeg måtte koble dem alle sammen.


Jeg oprettede en standard WDM-driver, som blev konfigureret til at indlæse ved systemstart (dvs. før win32k). Under sin initialisering hakede den ZwSetSystemInformation ved at patchere SSDT. Denne funktion kaldes af operativsystemet, når det laster/losser en DLL i sessionen, hvilket er præcis det, jeg har brug for.


Når ZwSetSystemInformation påberåbes med SystemLoadImage parameteren - en af ​​parametrene er pegeren til en SYSTEM\_LOAD\_IMAGE struktur, og dens ModuleBase er modulbasen kortlægningsadresse. Så analyserer jeg det kortlagte billede, patch dets indgangspunkt med min funktion, og resten er ligetil.


Nu skal jeg porte denne driver til en 64-bit Windows. Det er overflødigt at sige, at det ikke er en triviel opgave overhovedet. Hidtil har jeg fundet følgende hindringer:



  • Alle drivere skal underskrives

  • PatchGuard

  • SSDT eksporteres ikke direkte.



Hvis jeg forstår rigtigt, kan PatchGuard og driverens underskrift bekræftes, driveren skal installeres på en dedikeret maskine, og vi kan torturere det som vi ønsker.


Der er også tricks til at finde SSDT, ifølge online kilder.


Men for nylig har jeg opdaget, at der findes en funktion, der hedder PsSetLoadImageNotifyRoutine. Det kan forenkle opgaven betydeligt og hjælpe med at undgå beskidte tricks.


Mit spørgsmål er:



  • Hvis jeg bruger PsSetLoadImageNotifyRoutine, vil jeg modtage underretninger om DLL'er, der er indlæst i sessionen? Den officielle dokumentation fortæller om 'systemrum eller brugerplads', men indeholder 'systemrum' også sessionen?

  • Skal jeg deaktivere PatchGuard'en, hvis jeg vil patch det kortlagte DLL-billede efter det blev kortlagt?

  • Er der flere potentielle problemer, som jeg ikke tænkte på?

  • Er der andre måder at opnå, hvad jeg vil have?



Tak på forhånd.

Bedste reference



  Skal jeg deaktivere PatchGuard'en, hvis jeg vil patchere det kortlagte DLL-billede, efter at det blev kortlagt?



For at indlæse en driver på x64 skal den underskrives. Med administratorrettigheder kan du deaktivere PatchGuard, og jeg anbefaler personligt at bruge DSEO, en GUI-applikation lavet til dette. Eller du kan omgå PatchGuard ved at overskrive MBR (eller BIOS), selv om dette typisk betragtes som en bootkit - malware.