Udostępnij za pośrednictwem


Zapobieganie wykonywaniu danych

Zapobieganie wykonywaniu danych (DEP) to funkcja ochrony pamięci na poziomie systemu wbudowana w system operacyjny, począwszy od systemów Windows XP i Windows Server 2003. Program DEP umożliwia systemowi oznaczenie co najmniej jednej strony pamięci jako nie wykonywalnej. Oznaczanie regionów pamięci jako nie wykonywalnych oznacza, że nie można uruchomić kodu z tego regionu pamięci, co utrudnia wykorzystanie przepełnień buforu.

Program DEP uniemożliwia uruchamianie kodu ze stron danych, takich jak domyślna sterta, stosy i pule pamięci. Jeśli aplikacja próbuje uruchomić kod ze strony danych, która jest chroniona, wystąpi wyjątek naruszenia dostępu do pamięci, a jeśli wyjątek nie jest obsługiwany, proces wywoływania zostanie zakończony.

Program DEP nie ma być kompleksową obroną przed wszystkimi programami wykorzystującymi luki w zabezpieczeniach; jest to inne narzędzie, którego można użyć do zabezpieczenia aplikacji.

Jak działa zapobieganie wykonywaniu danych

Jeśli aplikacja próbuje uruchomić kod ze strony chronionej, aplikacja otrzyma wyjątek z kodem stanu STATUS_ACCESS_VIOLATION. Jeśli aplikacja musi uruchamiać kod ze strony pamięci, musi przydzielić i ustawić odpowiednie atrybuty ochrony pamięci. Przydzielona pamięć musi być oznaczona PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITElub PAGE_EXECUTE_WRITECOPY podczas przydzielania pamięci. Alokacje sterty wykonywane przez wywołanie malloc i HeapAlloc funkcje nie są wykonywalne.

Aplikacje nie mogą uruchamiać kodu z domyślnego sterta procesu lub stosu.

Program DEP jest konfigurowany podczas rozruchu systemu zgodnie z ustawieniem zasad ochrony strony bez wykonywania w danych konfiguracji rozruchu. Aplikacja może uzyskać bieżące ustawienie zasad, wywołując funkcję GetSystemDEPPolicy. W zależności od ustawienia zasad aplikacja może zmienić ustawienie programu DEP dla bieżącego procesu, wywołując funkcję SetProcessDEPPolicy.

Zagadnienia dotyczące programowania

Aplikacja może użyć funkcji VirtualAlloc do przydzielenia pamięci wykonywalnej z odpowiednimi opcjami ochrony pamięci. Zaleca się, aby aplikacja ustawiła co najmniej opcję ochrony pamięci PAGE_EXECUTE. Po wygenerowaniu kodu wykonywalnego zaleca się, aby aplikacja ustawiła ochronę pamięci, aby uniemożliwić dostęp do zapisu do przydzielonej pamięci. Aplikacje nie mogą zezwalać na dostęp do zapisu do przydzielonej pamięci przy użyciu funkcji VirtualProtect. Odmowa dostępu do zapisu zapewnia maksymalną ochronę regionów wykonywalnych przestrzeni adresowej procesu. Należy spróbować utworzyć aplikacje korzystające z najmniejszej możliwej przestrzeni adresowej pliku wykonywalnego, co minimalizuje ilość pamięci narażonej na wykorzystanie pamięci.

Należy również podjąć próbę kontrolowania układu pamięci wirtualnej aplikacji i tworzenia regionów wykonywalnych. Te regiony wykonywalne powinny znajdować się w mniejszej ilości miejsca niż regiony nie wykonywalne. Lokalizując regiony wykonywalne poniżej regionów nie wykonywalnych, możesz zapobiec przepełnieniu buforu w obszarze wykonywalnym pamięci.

Zgodność aplikacji

Niektóre funkcje aplikacji są niezgodne z programem DEP. Aplikacje, które wykonują generowanie kodu dynamicznego (takie jak generowanie kodu Just-In-Time) i nie oznaczają jawnie wygenerowanego kodu z uprawnieniem wykonywania, mogą mieć problemy ze zgodnością na komputerach korzystających z programu DEP. Aplikacje zapisane w bibliotece Active Template Library (ATL) w wersji 7.1 lub starszej mogą próbować wykonać kod na stronach oznaczonych jako nie wykonywalne, co wyzwala błąd NX i kończy działanie aplikacji; Aby uzyskać więcej informacji, zobacz SetProcessDEPPolicy. Większość aplikacji, które wykonują akcje niezgodne z programem DEP, musi zostać zaktualizowana w celu poprawnego działania.

Niewielka liczba plików wykonywalnych i bibliotek może zawierać kod wykonywalny w sekcji danych pliku obrazu. W niektórych przypadkach aplikacje mogą umieszczać małe segmenty kodu (często określane jako thunks) w sekcjach danych. Jednak program DEP oznacza sekcje pliku obrazu, który jest ładowany w pamięci jako nie wykonywalny, chyba że sekcja ma zastosowany atrybut wykonywalny.

W związku z tym kod wykonywalny w sekcjach danych powinien zostać zmigrowany do sekcji kodu lub sekcja danych zawierająca kod wykonywalny powinna być jawnie oznaczona jako plik wykonywalny. Atrybut wykonywalny IMAGE_SCN_MEM_EXECUTEnależy dodać do pola Characteristics odpowiedniego nagłówka sekcji dla sekcji zawierających kod wykonywalny. Aby uzyskać więcej informacji na temat dodawania atrybutów do sekcji, zobacz dokumentację zawartą w konsolidatorze.

zapobiegania wykonywaniu danych

Jak skonfigurować ochronę pamięci w systemie Windows XP z dodatkiem SP2