#GEDZAC Mitosis eZine Issue 4
#MITOSIS ARTICLE#
#Protegiendonos en las llamadas a las APIs (Hardcoded Addresses)
#Autor: eCORE[GEDZAC] <ecore[at]gedzac[dot]com>
En este articulo que tenemos que tener unos conceptos claros antes de continuar, cuando compilamos un programa desarrollado en cualquier lenguaje de programación. En la mayoría de los casos si no le hemos pasado un packer al ejecutable, se pueden observar las strings y las llamadas en texto plano. En estos casos muchos antivirus ya pueden empezar a deducir el comportamiento del ejecutable. Un ejemplo claro y que ni siquiera hace falta llamara a una api es cuando añadimos una string sin cifrar que contenga la cadena ‘http://’ entonces algunos antivirus ya anotan en su heurística como posible Downloader.
Tenemos que tener cuidado a la hora de programar en cuidar tanto las protección de las strings como las de las Apis. Cuando creamos un programa el enlazado resuelve las llamadas a las funciones que se producen entre los modulos objeto de la aplicación compilada al que denominamos enlace estatico. Una aplicación tiene distintos modulos. Estos pueden tener un numero indeterminado de enlaces dinamicos o también llamadas DLL. Se llaman dinamicos por que se resuelven las OFFSETS a distintos modulos de la aplicación.
Dentro del enlace dinamico podemos distinguir dos tipos que son los enlaces tardios o los enlaces tempranos. Un enlace temprano es cuando ejecutamos un exe y directamente el Sistema Operativo carga las dependencias del EXE y las Librerias y resuelve las direcciones de las llamadas a las funciones de las librerías. Un enlace tardio es aquel que no se inicializa durante la carga del EXE si no que el propio programa es capaz de decidir cuando crear estos enlaces. Lo que en este articulo vamos a aprender a ver es el enlace dinamico y dentro de este es el tardio, por tanto nuestro virus inicializara un minimo de llamadas a APIs y el resto decidirá por su cuenta cuando crear los enlaces para las llamadas a las funciones.
La ventaja de esto es que las llamaremos a la función obteniendo dos punteros, el primer puntero seria obtener la dirección de la librería donde se incluye la función y el segundo puntero seria obtener dentro del primer puntero la OFFSET donde esta situada la función que queremos llamar; las ventajas de este proceso es que tenemos la posibilidad de encriptar las APIs y descifrarlas en el momento que queramos crear los enlaces y las llamadas evitando asi muchas técnicas de detección de APIS.
Las APIs que utilizaremos para hacer este proceso son LoadLibrary y GetProcAddress ambas funciones de la librería Kernel32.dll, la primera indicándonos la dirección de la librería y la segunda nos va a decir cual es la dirección física de la función que buscamos.
Partimos de estas dos APIs de librería Kernel32, algunos os preguntarías que estas no van cifradas ya que son las APIs de partida para nuestro proceso de cifrar las APIs. Esto tiene una solución simple.
Ya que ambas librerías se encuentran en Kernel32 y cuando es importada por un EXE suele cargarse en una dirección por defecto, podemos ver la OFFSET mas común en Windows 95 o 98 es la Offset 0BFF70000h aunque dependiendo de la versión de Windows esto puede variar,Windows tiene asi como 4 compilaciones de kernels, mas algun cambio importante en algun build, por tanto vamos a proceder a ver un método para averiguar la dirección base de esta librería y partiendo de estas dirección base procederemos a llamar a estas dos librerías y a su vez llamando a todas las que necesitemos en nuestro proyecto quedando ocultas todas las Strings de las librerías y de las funciones y aumentando la seguridad de nuestro EXE respecto a la heurística de los antivirus.
El Kernel32 es un ejecutable como cualquier otro y por tanto sabemos que la cabecera de un ejecutable es “MZ” también en los ejecutables de MS-DOS.
Voy a poner unos metodos que desarrolle para averiguar la dirección base del kernel32.
[*]Method One:
;eCORE[GEDZAC] =)
and eax,0FFFF0000h
gedzac:
sub eax,10000h
cmp word ptr [eax],'MZ'
jnz gedzac
[*]Method Two:
;THNX to ITK :P
mov eax,dword ptr fs:[30h]
mov eax,[eax+0ch]
mov esi, [eax+1ch]
lods dword ptr[esi]
mov edx, [eax+8h]
Lo que vamos a explicar ahora es la RVA que significa Relative Virtual Address, es una dirección relativa con respecto al principio del programa es decir que si la dirección base de una librería es 0FFFF0000h y la RVA es 2222h la dirección total seria la suma de.
BASE 0FFFF0000h + RVA 2222h = 0FFFF22222h
Hay un caso practico explicado en un articulo llamado Downloader Indetectable de Pana_Infierno donde explica de manera mas detallada como desarrollar un Downloader Indetectable en Delphi usando este método.
Saludos
(C) Mitosis 4 - GEDZAC LABS