Cómo habilitar DEP y ASLR en las aplicaciones Windows

A medida que se van incrementando los ataques informáticos, resulta cada vez mas necesario que nuestras aplicaciones Delphi sean lo más seguras posible.

Delphi ya es un sistema de desarrollo de software muy robusto, la última vulnerabilidad conocida es del año 2014 CVE-2014-0994 relacionada con la versión XE6 y fue un desbordamiento de buffer en VCL.Graphics.TPicture.Bitmap en la función PaletteFromDibcolorTable en la que al no verificar la cantidad máxima de colores en una imagen se podría hacer un buffer overflow para inyectar código malicioso.

Este problema encontrado por una empresa de seguridad externa fue inmediatamente corregido por Embarcadero y desde entonces no se han reportado nuevos fallos de seguridad.

Para hacer que las aplicaciones Windows sean mas robustas Microsoft desarrolló dos nuevas funciones llamadas DEP y ASLR que están presentes desde Delphi 2007.

DEP ayuda a prevenir la inyección de código al marcar direcciones de memoria como no ejecutables lo que protege contra desbordamientos de buffer y ASLR hace que las aplicaciones no se carguen siempre en la misma dirección de memoria (lo hace de forma aleatoria) con lo que el heap y el stack varían dificultando que los piratas informáticos puedan obtener acceso a datos específicos del programa de forma consistente.

Para que sea útil DEP y ASLR se deben utilizar juntos.

Cómo sabemos si nuestras aplicaciones tienen DEP activado

Abrimos el administrador de tareas de Windows y en la pestaña "Detalles" añadimos una columna nueva llamada "Prevención de ejecución de datos" y vemos si aparece como Habilitado o Deshabilitado


Cómo activar DEP en nuestras aplicaciones

Añadiendo en el archivo *.dpr lo siguiente:

- Para aplicaciones de 64 bits 

{ $ SETPEOPTFLAGS $ 160 } { $ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE }

- Para aplicaciones de 32 bits

{ $ SETPEOPTFLAGS $ 140 }

- Si no tiene WinApi.Windows en el uses utilice

{ $ SETPEOPTFLAGS $ 160 } { $SetPEFlags $ 20 }

o si quieren activar DEP  en runtime pueden usar el siguiente procedimiento:

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


Cómo activar DEP y ASLR desde las opciones de programa

Desde la versión 11.1, Delphi incorpora estas opciones en el linker.

Para acceder a ellas hay que abrir la aplicación que estamos desarrollando y acceder al

menú Project - Options - Delphi - Building - Delphi Compiling - Linker

y activar las opciones que se muestran en la imagen:



 

 

Cómo comprobar que DEP está activado


Para comprobar que DEP está activado ir al Administrador de tareas y verificar que está habilitado



Si te ha gustado este post y quieres recibir un email cada vez que publique uno nuevo suscríbete desde aquí


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 










Utilizar el motor de ajedrez Stockfish con Delphi

 

Hoy veremos cómo usar el motor de ajedrez Stockfish desde un programa Delphi. 

Pero antes hay que conocer qué es un motor de ajedrez: Un motor de ajedrez es una aplicación informática que ayuda a jugar al ajedrez. Sirve para calcular las jugadas posibles, según las reglas del ajedrez, y proponer las mejores.

Los hay de diferentes niveles de fuerza, pero quizás Stockfish, con un nivel de 3400 puntos sea uno de los más avanzados que existen actualmente

El mejor es AlphaZero, desarrollado por DeepMind, que con sólo 4 horas de autoentrenamiento consiguió derrotar a StockFish, en un match a 100 partidas, ganando 28 y empatando 72.

Desde nuestro punto de vista como programadores el motor de ajedrez es una caja negra, no tenemos porqué saber qué hace internamente, lo único que tenemos que hacer es enviarle una instrucción en forma de comando de texto y obtener y tratar con nuestro programa Delphi la salida que nos proporciona.

Esta comunicación se realiza mediante la interfaz universal de ajedrez (UCI) que es un protocolo de comunicación abierto. En el siguiente link tienen las características de este protocolo.

Inicialmente tenemos que descargar el motor de ajedrez stockfish que se hace desde su propia página, hay versiones para Linux, Windows, Android y Mac

Este motor es opensource y en el propio zip de descarga en la carpeta "src" se encuentra su código por si quieren ver cómo funciona internamente.

https://stockfishchess.org/download/


Una vez descargado el fichero lo renombraremos como stockfish.exe 

Ahora necesitamos un programa que permita enviar comandos al motor y que se encargue de recibir el resultado que genera.

En nuestro caso voy a utilizar el componente tConsoleIO de Andrey Sevast'yanov que hace un pipe de la entrada y de la salida.

Inicialmente se creó para Delphi 7, pero existe un update para Delphi XE2, que funciona perfectamente hasta Delphi 10.4.2, que es el que yo he utilizado.

Lo primero que tenemos que hacer es una vez que hemos descargado y descomprimido el update para Delphi XE2 instalamos el componente tConsoleIO, para ello abrimos Delphi y desde el menú File / Open abrimos el archivo "MuConsole.dpk"

Hacemos clic con el botón derecho del ratón sobre el ítem MuConsole.bpl y pulsamos INSTALL, una vez terminado el proceso tendremos el componente tConsoleIO listo para ser utilizado en nuestros programas.


Probando el programa

Dentro del update para Delphi XE2, tenemos un programa de prueba llamado TestConsoleIO.exe (con su código fuente) que nos servirá para probar la comunicación con el motor de ajedrez.

Lo primero que haremos antes de ejecutar el programa es mover el motor stockfish.exe a la carpeta donde se encuentra el programa TestConsoleIO.exe, después lo ejecutamos y escribimos en la caja de texto Application su nombre para que quede de la siguiente forma:

Y pulsamos el botón   "RunBtn"

Una vez que hemos iniciado la comunicación con el motor ya podremos enviarle órdenes desde la caja de texto "Command".

Por ejemplo.

Si escribimos uci y pulsamos el botón SendBtn, veremos las opciones de configuración de stockfish.


 

Regularmente conviene ir enviado al motor el comando isready, para comprobar si no se ha perdido la conexión y en ese caso nos tiene que devolver el texto readyok si todo es correcto


Ejemplos de órdenes:

setoption name hash value 1024 - Modifica el tamaño de hash

setoption name threads value 2 - Cambia el número de hilos a 2 

d - Muestra un display con el tablero de ajedrez 

 

go - Calcula una nueva jugada

stop - Para el proceso de cálculo de nuevas jugadas tan pronto como sea posible

go movetime 1000 - Calcula una nueva jugada en 1000 msegs

position startpos moves g1f3  - mueve el caballo de g1 a la casilla f3

position startpos - inicializa el tablero

Como ejemplo la comunicación UCI entre dos jugadores sería  así:

 968 >HUMANO: isready
996 <HUMANO: readyok
997 <HUMANO: position startpos moves g1f3
1072 >STOCKFISH: isready
1073 <STOCKFISH: readyok
1073 >STOCKFISH: go movetime 1000
1075 <STOCKFISH: info depth 1 seldepth 0 score cp 1 time 0 nodes 0 pv d7d5
1076 <STOCKFISH: info time 0 nodes 0 nps 0 cpuload 0
1077 <STOCKFISH: info hashfull 0
1078 <STOCKFISH: bestmove d7d5
1078 >HUMANO: position startpos moves g1f3 d7d5
1079 >HUMANO: isready
1106 <HUMANO: readyok
1226 <HUMANO: position startpos moves g1f3 d7d5 d2d4
1227 >STOCKFISH: position startpos moves g1f3 d7d5 d2d4
1228 >STOCKFISH: isready
1229 <STOCKFISH: readyok
1229 >STOCKFISH: go movetime 1000
1230 <STOCKFISH: info depth 1 seldepth 0 score cp 1 time 0 nodes 0 pv g8f6
1231 <STOCKFISH: info time 0 nodes 0 nps 0 cpuload 0
1232 <STOCKFISH: info hashfull 0
1233 <STOCKFISH: bestmove g8f6
1233 >HUMANO: position startpos moves g1f3 d7d5 d2d4 g8f6
1234 >HUMANO: isready
1245 <HUMANO: readyok
1311 <HUMANO: position startpos moves g1f3 d7d5 d2d4 g8f6 c2c4

 

Si te ha gustado este post y quieres recibir un email cada vez que publique uno nuevo suscríbete desde aquí

 

 Enlaces:

Juego de ajedrez por ordenador