Cómo encontrar el Entry Point (EP) en Memoria y Disco

[Read this post in English]

 

El Entry Point (AddressOfEntryPoint) definido en el formato PECOFF para archivos ejecutables se refiere a la dirección en memoria donde se encuentra la primera instrucción que se debe ejecutar. Para encontrar dicha dirección tanto en memoria como en disco (RawData) se debe contar primero con la siguiente información dentro del ejecutable:

AddressOfEntryPoint

BaseOfCode

ImageBase

FileAlignment

.text[PointerToRawData]

En nuestro post El Formato PE (Portable Executable) Parte I y El Formato PE (Portable Executable) Parte II, definimos todos los parámetros que componen a un archivo ejecutable, si no sabes cómo obtener estos valores te recomendamos leerlo antes de continuar.

Encontrar el Entry Point en Memoria

La dirección de memoria en donde se cargará la primera instrucción de un archivo ejecutable se puede encontrar con la siguiente fórmula:

EP (Memoria) = AddressOfEntryPoint + ImageBase

(suponiendo que no hay relocalización de memoria, en cuyo caso el valor puede ser diferente)

Encontrar el Entry Point en el archivo en disco (Raw Data)

La ubicación de este valor en disco es diferente que en memoria porque el formato PE está diseñado para ser ejecutado en memoria, por lo que en teoría no es necesario conocer este dato dentro del archivo (salvo que se esté haciendo un análisis de ingeniería reversa o trabajando con muestras de virus). En memoria las localidades se ubican en páginas, generalmente de 4K (4096 Bytes), en disco se utilizan bloques generalmente de 512 Bytes. Con esto en mente, la ubicación del código para la primera instrucción se encuentra en la siguiente fórmula:

EP (Archivo) = AddressOfEntryPoint – BaseOfCode + .text[PointerToRawData] + FileAlignment

En este caso, observe que primero debemos ubicar el valor de AddressOfEntryPoint y después eliminar el offset que se agrega en memoria (BaseOfCode) ya que el valor con que viene el AddressOfEntryPoint asume un valor ya en memoria con respecto de la dirección base. Incluso se puede observar que en ocasiones el valor de AddressOfEntryPoint apunta en el archivo físico en disco a una dirección que puede estar fuera de la sección del código ejecutable. Después de restar el offset sólo basta sumar el valor de FileAlignment porque recuerde que en disco los datos se graban en bloques de cantidades fijas. El valor de .text[PointerToRawData] también se debe agregar ya que el offset del Entry Point está definido con respecto al inicio de la sección de código ejecutable, si no sumamos este valor, acabaremos en cualquier otro lado.

NOTA: Generalmente los valores para .text[PointerToRawData] y FileAlignment son de 0x200 (512 Bytes en decimal)

 

Recuerda que puedes mandarnos tus preguntas y comentarios a nuestra cuenta de Twitter: @redinskala donde encontrarás más información y tips de seguridad.

Gracias por tu visita!

 

One thought on “Cómo encontrar el Entry Point (EP) en Memoria y Disco

  1. Pingback: Finding the Entry Point (EP) in memory and disk | RedinSkala

Comments are closed.