2011-11-09 7 views
8

Delphi 2007 (and newer) supports umożliwiając DEP i ASLR poprzez którykolwiek z tych trzech technik:Jak włączyć DEP/NX i ASLR w pliku wykonywalnym Delphi 2006 lub wcześniejszym?

  • dodać przełącznik wiersza polecenia –dynamicbase podczas kompilacji z dcc32
  • dodać polecenie preprocesora {$DYNAMICBASE ON} do kodu źródłowego
  • ręcznie lub w bit w nagłówku, z {$SETPEOPTFLAGS $40} w kodzie źródłowym

Chciałbym móc zrobić to samo z Delphi 2006 i C++ B uilder 2006 (znany również jako BDS 2006). Czy ktoś wie, jak to zrobić?

Odpowiedz

10

Set PE flagi

Możesz użyć {$SetPEOptFlags $40}, aby ustawić flagę DEP, i {$SetPEOptFlags $100}, aby ustawić flagę ASLR. Aby ustawić oba ustawienia, użyj {$SetPEOptFlags $140}.

Jeśli masz wersję Delphi z niezbędnych definicji w jednostce Windows.pas można użyć dużo bardziej czytelny:

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or 
    IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE } 

Zazwyczaj można to ustawienie w pliku .dpr $SetPEOptFlags. Musimy więc upewnić się, że Windows jest w pliku .dpr używa klauzuli dla tych stałych , które będą dostępne.

Set polityka DEP w czasie wykonywania

Dla wersji, które nie obsługują podejść flaga PE opartych można wywołać tę funkcję na początku inicjalizacji Twojej aplikacji:

procedure EnableDEP; 
const 
    PROCESS_DEP_ENABLE: DWORD=$00000001; 
var 
    SetProcessDEPPolicy: function(dwFlags: DWORD): BOOL; stdcall; 
begin 
    SetProcessDEPPolicy := GetProcAddress(GetModuleHandle(kernel32), 
    'SetProcessDEPPolicy'); 
    if Assigned(SetProcessDEPPolicy) then begin 
    //don't bother checking for errors since we don't need to know if it fails 
    SetProcessDEPPolicy(PROCESS_DEP_ENABLE); 
    end; 
end; 

To będzie działać na każdej wersji z Delphi.

Nie można ustawić flagi ASLR w czasie wykonywania, ponieważ wpływa ona na sposób ładowania modułu. Tak więc ASLR można ustawić tylko za pomocą flag PE.

Modyfikowanie flagi PE o bardzo starych wersjach Delphi

starsze wersje Delphi nie obsługują $SetPEFlags i $SetPEOptFlags. W przypadku takich wersji należy użyć zewnętrznego narzędzia, aby zmodyfikować wykonywalny post-build. Kiedy początkowo napisałem tę odpowiedź, założyłem, że wykonanie zadania będzie możliwe za pomocą narzędzia EDITBIN. W przypadku DEP wystarczy, używając opcji /NXCOMPAT. W przypadku ASLR należy użyć innego edytora flag PE. Moje websearch ujawniło peflags od cygwin.

peflags --dynamicbase=true --nxcompat=true MyApp.exe 

Jestem pewien, że dostępne są inne opcje edycji flag PE.

+0

To działa bardzo dobrze. Dziękuję Ci! – Mick

+0

Link edytora jest uszkodzony – OnTheFly

+0

Kilka notatek: Editbin.exe jest częścią wszystkich wersji visual studio. Wymagana opcja/nxcompat jest w VS 2008 i wyżej. Zauważ, że w przypadku instalacji seryjnej VS 2010 edytorbin.exe może zgłaszać błędy związane z brakującymi bibliotekami dll. Rozwiązałem to, po prostu kopiując w bibliotekach dll do katalogu gdzie znajduje się plik editbin.exe. – Jonesome

6

'{$ DYNAMICBASE ON}' jest nowy w Delphi2007, '{$ SETPEOPTFLAGS $ 40}' był istniejącej dyrektywy: info

{$ SetPEOptFlags $ 40} działa w Delphi2006

+0

Myślę, że lepiej używać nazwanego contant 'IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE' – OnTheFly

+0

Const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE nie jest dostępny w D2006, musisz zdefiniować go samodzielnie. –

+0

@ArjenvanderSpek Czy tak jest? Czy dodanie systemu Windows do zastosowań nie jest dostępne? –

Powiązane problemy