Dela via


Skydd mot datakörning

Data execution prevention (DEP) är en minnesskyddsfunktion på systemnivå som är inbyggd i operativsystemet från och med Windows XP och Windows Server 2003. MED DEP kan systemet markera en eller flera sidor med minne som icke-körbara. Att markera minnesregioner som icke-körbara innebär att kod inte kan köras från den minnesregionen, vilket gör det svårare att utnyttja buffertöverskridningar.

DEP förhindrar att kod körs från datasidor, till exempel standard-heap, stacks och minnespooler. Om ett program försöker köra kod från en datasida som är skyddad uppstår ett undantag för minnesåtkomstöverträdelse och om undantaget inte hanteras avslutas anropsprocessen.

DEP är inte avsett att vara ett heltäckande skydd mot alla kryphål. Det är avsett att vara ett annat verktyg som du kan använda för att skydda ditt program.

Så här fungerar datakörningsskydd

Om ett program försöker köra kod från en skyddad sida får programmet ett undantag med statuskoden STATUS_ACCESS_VIOLATION. Om programmet måste köra kod från en minnessida måste det allokera och ange rätt virtuella minnesskydd attribut. Det allokerade minnet måste markeras PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITEeller PAGE_EXECUTE_WRITECOPY när minne allokeras. Heap-allokeringar som görs genom att anropa funktionerna malloc och HeapAlloc är inte körbara.

Program kan inte köra kod från standardprocesshögen eller stacken.

DEP konfigureras vid systemstart enligt principinställningen för sidskydd utan körning i startkonfigurationsdata. Ett program kan hämta den aktuella principinställningen genom att anropa funktionen GetSystemDEPPolicy. Beroende på principinställningen kan ett program ändra DEP-inställningen för den aktuella processen genom att anropa funktionen SetProcessDEPPolicy.

Programmeringsöverväganden

Ett program kan använda funktionen VirtualAlloc för att allokera körbart minne med lämpliga minnesskyddsalternativ. Det föreslås att ett program som minst anger alternativet PAGE_EXECUTE minnesskydd. När den körbara koden har genererats rekommenderar vi att programmet anger minnesskydd för att inte tillåta skrivåtkomst till det allokerade minnet. Program kan inte tillåta skrivåtkomst till allokerat minne med hjälp av funktionen VirtualProtect. Om du inte tillåter skrivåtkomst säkerställs maximalt skydd för körbara regioner med processadressutrymme. Du bör försöka skapa program som använder minsta möjliga körbara adressutrymme, vilket minimerar mängden minne som exponeras för minnesanvändning.

Du bör också försöka styra layouten för programmets virtuella minne och skapa körbara regioner. Dessa körbara regioner bör finnas i ett lägre minnesutrymme än icke-körbara regioner. Genom att hitta körbara regioner under icke-körbara regioner kan du förhindra att ett buffertspill flödar över till den körbara minnesytan.

Programkompatibilitet

Vissa programfunktioner är inte kompatibla med DEP. Program som utför dynamisk kodgenerering (till exempel Just-In-Time kodgenerering) och inte uttryckligen markerar genererad kod med körningsbehörighet kan ha kompatibilitetsproblem på datorer som använder DEP. Program som skrivits till ACTIVE Template Library (ATL) version 7.1 och tidigare kan försöka köra kod på sidor som markerats som icke-körbara, vilket utlöser ett NX-fel och avslutar programmet. Mer information finns i SetProcessDEPPolicy. De flesta program som utför åtgärder som är inkompatibla med DEP måste uppdateras för att fungera korrekt.

Ett litet antal körbara filer och bibliotek kan innehålla körbar kod i dataavsnittet i en bildfil. I vissa fall kan program placera små kodsegment (kallas ofta thunks) i dataavsnitten. DEP markerar dock delar av bildfilen som läses in i minnet som icke-körbara om inte avsnittet har det körbara attributet tillämpat.

Därför bör körbar kod i dataavsnitt migreras till ett kodavsnitt, eller så bör dataavsnittet som innehåller den körbara koden uttryckligen markeras som körbar. Det körbara attributet IMAGE_SCN_MEM_EXECUTEska läggas till i fältet Egenskaper i motsvarande avsnittsrubrik för avsnitt som innehåller körbar kod. Mer information om hur du lägger till attribut i ett avsnitt finns i dokumentationen som ingår i din länkare.

datakörningsskydd

Konfigurera minnesskydd i Windows XP SP2