2011-11-09 18 views
8

Delphi 2007 (and newer) supports permitiendo DEP y ASLR a través de cualquiera de estas tres técnicas:¿Cómo puedo activar DEP/NX y ASLR en un Delphi 2006 o un ejecutable anterior?

  • añadir el modificador de línea de comandos –dynamicbase al compilar con dcc32
  • agregar el comando preprocesador {$DYNAMICBASE ON} al código fuente
  • manual o en el bits en la cabecera, con {$SETPEOPTFLAGS $40} en el código fuente

me gustaría ser capaz de hacer lo mismo con Delphi 2006 y C++ B uilder 2006 (también conocido como BDS 2006). ¿Alguien sabe como hacer esto?

Respuesta

10

banderas Conjunto PE

Puede usar {$SetPEOptFlags $40} para establecer el indicador DEP y {$SetPEOptFlags $100} para establecer el indicador ASLR. Para establecer ambos use {$SetPEOptFlags $140}.

Si tiene una versión de Delphi con las definiciones necesarias en la unidad windows.pas puede utilizar el mucho más legible:

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or 
    IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE } 

Normalmente se incluyen el ajuste $SetPEOptFlags en el archivo .dpr. Por lo tanto, debe asegurarse de que Windows esté en la cláusula de uso del archivo .dpr para que estas constantes IMAGE_XXX estén disponibles.

Conjunto política DEP en tiempo de ejecución

Para las versiones que no son compatibles con los enfoques basados ​​en la bandera de PE puede llamar a esta función al principio de la inicialización de la aplicación:

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; 

Esto funcionará para cualquier versión de Delphi.

No se puede establecer el indicador ASLR en el tiempo de ejecución, ya que influye en cómo se carga el módulo. Por lo tanto, ASLR solo se puede establecer usando indicadores PE.

banderas PE Modificación de versiones muy antiguas de Delphi

Las versiones anteriores de Delphi no son compatibles con $SetPEFlags y $SetPEOptFlags. Para tales versiones necesita usar una herramienta externa para modificar el post-build ejecutable. Cuando originalmente escribí esta respuesta, asumí que EDITBIN de MS toolchain haría el trabajo. Para DEP será suficiente, usando la opción /NXCOMPAT. Para ASLR, necesitará usar un editor de indicadores de PE diferente. Mi búsqueda web reveló peflags de cygwin.

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

Estoy seguro de que hay otras opciones de edición de banderas PE disponibles.

+0

Esto funciona muy bien. ¡Gracias! – Mick

+0

El enlace editbin está roto – OnTheFly

+0

Un par de notas: Editbin.exe es parte de todas las versiones de Visual Studio. La opción necesaria/nxcompat está en VS 2008 y posteriores. Tenga en cuenta que en una instalación en stock de VS 2010, editbin.exe puede arrojar errores relacionados con dlls faltantes. Resolví esto simplemente copiando en dlls al directorio donde reside editbin.exe. – Jonesome

6

'{$ DYNAMICBASE EN}' es nuevo en Delphi2007, '{$ SETPEOPTFLAGS $ 40}' fue una Directiva existente: info

{$ SetPEOptFlags $ 40} trabaja en Delphi2006

+0

Creo que es mejor usar named contant 'IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE' – OnTheFly

+0

Const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE no está disponible en D2006, tiene que definirlo por sí mismo. –

+0

@ArjenvanderSpek ¿Es eso así? ¿No agrega Windows a los usos para que esté disponible? –

Cuestiones relacionadas