2016-07-29 7 views
1

Im Wesentlichen bin ich auf der Suche nach einer Funktion, die für Kernel-Modus tun könnte, was VirtualProtect für den Benutzermodus tut.So stellen Sie den Schutz der Speicherregion im Kernel-Modus unter Windows 7 ein

Ich reserviere Speicher mit einer Logik, die durch den folgenden vereinfachten Code veranschaulicht wird.

PMDL mdl = MmAllocatePagesForMdl  
    (
     LowAddress, 
     HighAddress, 
     SkipAddress, 
     size 
    ); 

    ULONG flags = NormalPagePriority | MdlMappingNoExecute | MdlMappingNoWrite; 
    PVOID ptr = MmGetSystemAddressForMdlSafe 
    (
     mdl, 
     flags 
    ); 

Die MdlMappingNoExecute und MdlMappingNoWrite Flaggen werden nur auf Win8 + Wirkung.
Darüber hinaus kann nur MmGetSystemAddressForMdlSafe ich kann nicht NoAccess Schutz für den Speicherbereich zuweisen.

Gibt es zusätzliche oder alternative API-s, die ich verwenden könnte, um den Seitenschutz des zugewiesenen Speichers zu ändern?
Ein Hack würde auch tun, da diese Funktionalität derzeit im Produktionscode nicht verwendet wird.

Antwort

0

Der Code, den ich gerade benutzte, ist unten.
Alle verwendeten APIs sind offiziell.
Hier erstelle ich ein weiteres mdl für Unterbereich des zugewiesenen Speichers und ändern Sie den Schutz dieses Teilbereichs.

Wenn Sie über Speicher Reise mit dieser Methode geschützt unten dann:

  • bei IRQL < DISPATCH_LEVEL erhalten Sie PAGE_FAULT_IN_NONPAGED_AREA Fehler (Ungültige Systemspeicher verwiesen wurde nicht durch geschützt werden try-except, muss es sein. geschützt durch eine Sonde. in der Regel wird die Adresse einfach nur schlecht ist oder es wird auf freigegebenen Speicher zeigt.)
  • bei IRQL == DISPATCH_LEVEL Sie bekommen DRIVER_IRQL_NOT_LESS_OR_EQUAL Fehler (ein Versuch wurde gemacht, um auf eine auslagerbare (oder vollständig ungültige) Adresse unter einer Unterbrechungsanforderungsstufe (IRQL) zuzugreifen, die zu hoch ist. Dies wird in der Regel von Fahrern verursacht verwenden falsche Adressen.)

Beachten Sie, dass der Schutz Ändern könnte fehlschlagen, wenn die subrange Teil große Seite Zuordnung ist. Dann wird die status wahrscheinlich STATUS_NOT_SUPPORTED sein.
Große Seite Zuweisungen kann passieren, wenn die ursprünglich Größe des zugewiesenen Speicherbereich und Ausrichtung (die in der Frage auf SkipAddress Variable abhängt) geeignet sind, und einige zusätzliche Voraussetzungen sind, mit denen erfüllt Ich bin nicht vertraut mit (vielleicht aus bestimmten Ausgangs OS Version).

 PMDL guard_mdl = IoAllocateMdl 
     (
      NULL, 
      PAGE_SIZE * guardPageCount, 
      FALSE,   
      FALSE, 
      NULL   
     ); 

     if (guard_mdl) 
     { 
      IoBuildPartialMdl 
      (
       mdl,  
       guard_mdl, 
       (PVOID)(0), // **offset** from the beginning of allocated memory ptr 
       PAGE_SIZE * guardPageCount 
      ); 

      status = MmProtectMdlSystemAddress 
      (
       guard_mdl, 
       PAGE_NOACCESS 
      ); 
     } 
1
C:\Windows\System32>dumpbin /exports ntdll.dll | find "Protect" 
     391 17E 0004C030 NtProtectVirtualMemory 
     1077 42C 000CE8F0 RtlProtectHeap 
     1638 65D 0004C030 ZwProtectVirtualMemory 

Ich glaube, Sie Zw Funktionen von Kernel-Modus aufrufen können, und die args sind in der Regel die gleichen wie für die entsprechenden Nt Funktionen. Und während ZwProtectVirtualMemory nicht dokumentiert ist, gibt es eine dokumentierte ZwAllocateVirtualMemory, die Schutz-Flags akzeptiert.

Ein anderer Ansatz könnte sein, virtuellen Speicher im Benutzermodus zuzuweisen und zu schützen, den Puffer an den Treiber zu übergeben und dann dort die entsprechende MDL zu erstellen.

+0

Danke. Wissen Sie vielleicht, können diese APIs auch auf nicht ausgelagerte und System (nicht prozessgebundene) Speicher angewendet werden? –

+0

* Die 'ZwAllocateVirtualMemory'-Routine reserviert, legt fest, oder beides, eine Region von Seiten innerhalb des virtuellen Adressraums des Benutzermodus eines bestimmten Prozesses * - https://msdn.microsoft.com/en-us/library/windows/ hardware/ff566416% 28v = vs.85% 29.aspx Während Ihre Antwort immer noch nützlich ist, fragt die Frage derzeit implizit nach einer Lösung für nicht ausgelagerten Speicher, da 'MmAllocatePagesForMdl' nicht ausgelagerten Speicherzuweisung generiert - https://msdn.microsoft. com/de-us/library/windows/hardware/ff554482 (v = vs.85) .aspx –

+0

Es wäre immer noch interessant zu wissen, ob die undokumentierte 'ZwProtectVirtualMemory' API in der Lage ist, auf nicht ausgelagertem Speicher zu arbeiten und wie sie sich von' unterscheidet MmProtectMdlSystemAddress'? Ich denke, ich verstehe, dass 'NtProtectVirtualMemory' für Benutzer-Modus-Speicher ist und mit Argumenten fehlschlagen wird, die auf Systemspeicherbereich verweisen. Der Unterschied zwischen 'Zw' und' Mm' APIs ist interessant, da man im Internet verschiedene Hacks finden kann, um 'ZwProtectVirtualMemory' API aufzurufen. Wenn nicht für bestimmte Vorteile ... dann nehme ich an, dass diese Hacks nicht gemacht worden wären? –