Вы находитесь на странице: 1из 5

TRABAJANDO CON DLLS

Windows expone la mayora de su Interfaz de Aplicacin de Programacin (API) en


archivos DLL. Las funciones que el proceso necesita para interactuar con el sistema de
archivo, Registro, Red, e interfaz GUI son contenidas en DLLs. Cuando un proceso llama a
una funcin API, este debe primero cargar una copia de la DLL que exporta la API en su
espacio privado de memoria. El hecho de que las DLLs se ejecutan en el contexto de un
proceso hace que su uso sea muy deseable por autores de malware. Para distribuir cdigos
maliciosos como DLLs en vez de EXEs, el malware puede ejcutarse dentro de cualquier
proceso (de ahora en adelante conocido como el blanco o proceso local), incluyendo
winlogon.exe, csrss.exe, o explorer.exe. No solo es capaz de ayudar al malware a esconder
sus capacidades (cualquier accin que el malware realiza parecer originarse del proceso
local), pero este dan acceso al malware para determinar el rango entero direccionable
adueado por el proceso local.

Si el proceso local es un navegador, el malware puede robar credenciales desde
transacciones seguras SSL antes de dar pase al cifrado. Si el proceso local acepta entrada
del usuario, el malware puede grabar las pulsaciones de teclado o movimientos del mouse.
Po supuesto, hay otras maneras para desarrollar estas acciones maliciosas, pero desde la
perspectiva del programador, crear un DLL que contenga la funcionalidad y entonces
inyectar la DLL en un proceso local es extremadamente fcil. Los atacantes son tentados
por soluciones fciles, porque ahorran tiempo. Otras de las razones para que los atacantes
usen DLLs son porque los investigadores y analistas estn familiarizados con DLLs como
ellos con los EXEs. Por ejemplo, muchas personas tuvieron problemas al realizar un
anlisis dinmico de la muestra de Conficker cuando se descubri por primera vez, porque
no saban como ejecutar la DLL maliciosa utilizada por el bicho. Este paper discute algunos
retos envueltos con el anlisis de las DLLs y muestra cmo puedes pasar el reto. Como
siempre, debes analizar DLLs maliciosas en entornos virtuales o sobre sistemas basadas
en Unix.

ENUMERANDO LAS EXPORTACIONES DE LA DLL

Muchos atacantes asignan nombres significativos a las funciones que exportan sus DLLs
maliciosos, estos te dan una rpida y fcil primera impresin de las capacidades de la DLL.
Otros atacantes pueden usar un nombre aleatorio y engaoso para distraerte. Este
apartado mostrara unas cuantas tcnicas para enumerar funciones exportadas. La DLL
usado en este ejemplo est en el componente del rootkit 4DW4R3 descrita el foro de
Sysinternals [1].

CFF Explorer

CFF Explorer [2] de Daniel Pistelli es un robusto visor/editor PE para plataformas basadas
en Windows. Si abres un archivo PE este exportara funciones, dando clic en el botn
Export Directory, como se muestra en la figura. La aplicacin muestra la siguiente
informacin por cada funcin:
Ordinal: Un ndice dentro de la Export Address Table (EAT) que contienen
informaciones de cada funcin exportada.
Function RVA: La direccin relativa virtual (por ejemplo, el offser desde la image
base de la DLL) donde los cdigos de funciones pueden ser encontradas en
memoria.
Name: Los nombre de las funciones.

Pefile
Si quieres enumerar las exportaciones usando script de python en mltiples plataformas
(por ejemplo, para un procesar un gran nmero de DLLs de inmediato), puedes usar el
pefile de Ero Carrera. El siguiente cdigo muestra los comandos que puedes usar:

$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
>>> import pefile
>>> pe = pefile.PE(4DW4R3c.dll)
>>> if hasattr(pe, DIRECTORY_ENTRY_EXPORT):
... for exp in pe.DIRECTORY_ENTRY_EXPORT.symbols:
... print hex(pe.OPTIONAL_HEADER.ImageBase + exp.address), \
... exp.name, exp.ordinal
...
0x10002415 FileDownload 1
0x1000249b HideConnection 2
0x10002484 InjectorAdd 3
0x1000234c ModuleDownload 4
0x10002504 SetCmdDelay 7
0x10002509 SetRedirUrl 8
0x10002255 _ModuleLoad@4 5
0x100021e3 _ModuleUnload@4 6
Puedes ver que en la salida muestra l VA (virtual Address) de las funciones exportas en
vez del RVA, como muestro CFF Explorer. Esto es porque agregamos las funciones del RVA
a la image base de la DLL (as crean l VA) antes de imprimir la direccin. Asumiendo que
la DLL recibe su image base preferida (0x10000000 en este caso) cuando este es cargado
dentro el proceso, puedes esperar buscar la direccin de la funcin FileDownload en
0x10002415.
IDA Pro
Desarrollar anlisis esttico en IDA Pro es una de la mejor manera de investigar el
comportamiento potencial de una DLL. No irse a conclusiones respecto a cmo se
comporta basado en su nombre. En vez de eso, inspeccionar el cdigo para cada funcin
exportada. Para esto, abrir la DLL maliciosa en IDA Pro e irse a la etiqueta Exports como se
muestra en la figura. Desde la etiqueta Exports, puedes dar clic en el nombre de una
funcin para ver el cdigo desensamblado de la funcin. En el ejemplo, tambin usamos el
plug-in Hex-Rays para descompilar la funcin HideConnection.

Como puedes ver, IDA Pro revela informacin crtica para hacer ingeniera inversa a la
DLL. Este muestra que HideConnection acepta un parmetro, que es un puntero de
carcter que la funcin pasara a gethostname. Adems, este muestra que las referencias de
funcin al miembro h_addr_list del valor regresado por gethotname. Este miembro
h_addr_list contiene una lista de direcciones IP para un host. As el argumento para
HideConnection es una hostname (ejemplo www.hidethisaddress.com) que el malware
deber esconder en el sistema vctima.
Comunes y No Comunes Nombres Exportados
Cmo pudiste haber reunido, los atacantes eligen cualquier nombre para sus funciones
exportadas por sus DLL. De hecho, si el nombre est en blanco o no contiene carcter
ASCII, un proceso an puede buscar y llamar las funciones basadas en valores ordinales de
funciones. Adems, estars ejecutando dentro de todos los nombres ordenados durante su
investigacin. Aqu unos cuantos ejemplo de nombres descriptivos:
HideProcess
ExecuteFile
KillProcess
BindIEBrowser
StartHook
ResetSSDT
Aqu unos cuantos ejemplos de nombres genricos que los autores de malware usan
frecuentemente:
Install
Launch
Init
Load
Start
ServiceMain
Hook
Aqun unos cuantos ejemplos de nombre que son nicos (y lnea limtrofe chistosa), pero
no descriptiva:
KIIsSes_McafEe
Kisses_To_Trojanhunter
_GetAwayFromME
_CreateSweetPlace
YouTalkinTooMuch
IFoundTreasure
ByeByeMyLove
TheirKnifeIsSharp
_BangBangBang
Por ltimo, unos cuantos ejemplos de nombres aleatorios:
Lymomohu
WanoRivacyde
KenyjybopymoJo
AddCvqidsd
Kepibagipefowo
Una cosa que debes hacer con todas las DLLs que tienes en tu coleccin de malware es
usar un script pefile para volcar todos los nombres exportados en una base de datos.
Entonces podras consultar la base de datos cada vez que recibas nuevas DLLs e intentar
encontrar nuevas con viejas muestras basadas en nombres de funciones exportadas u
otros atributos.
[1] http://forum.sysinternals.como/topic21838_page1.html
[2] http://www.ntcore.com/exsuite.php
EXECUTANDO DLLS CON RUNDLL32.EXE
A diferencia de los programas ejecutables, sencillamente no puedes dar doble clic en una
DLL para ejecutarlo por una DLL no es una entidad autosostenible, este requiere un
proceso local, o contenedor, para operar. Windows los abarca con un programa llamado
rundll.exe (versin de 16 bit) o rundll32.exe (versin de 32 bit) que sirven como un
proceso local genrico para ejecutar DLLs arbitrariamente (para ms informacin, ver la
interfaz de Rundll y Rundll32 [3]). Ambas versiones del programa usan las siguiente
sintaxis, pero nos enfocaremos en rindll32.exe en este apartado.
C:\> rundll32 <dllpath>,<export> [optional arguments]
Aqu una descripcin de los parmetros:
El parmetro dllpath debe ser una ruta completa de la DLL en el disco (pero sin
ningn espacio o caracteres especiales).
El parmetro export es el nombre de una funcin exportada para llamar despus a
la DLL cargada.
Ah deber estar una coma (pero no espacio) entre el dllpath y el parmetro
export.
Puedes reemplazar opcionalmente los argumentos a la funcin export para alojar
los ltimos en la lnea de comandos.
Los siguientes pasos explican cmo trabaja rundll32.exe:
Llama a GetCommandLineW para obtener los parmetros de lnea de comando que
t brindaste.
Validara los parmetros de lnea de comando y saldr si su sintaxis es incorrecta.
Cargara el DLL especificado llamando a LoadLibraryW. Este paso ejecutara
automticamente el cdigo en el punto de entrada de la DLL (mantn esto en
mente, es muy importante).
Intentar obtener la direccin de la funcin export llamando a GetProcAddress y
saldr si la funcin no puede encontrarse.
Llamar a la funcin export, abasteciendo cualquiera de los argumentos opcionales
que es provisto.
La sintaxis de rundll32 es realmente simple, pero muchas personas tienen problemas en
entenderlos. Aqu estas algunos tips para errores comunes:
Tip #1
El error en la siguiente lnea de comando es que no se especific la funcin export. Como
resultado, la sintaxis comprobara fallas y rundll32.exe saldr antes de llamar a LoadLibraryW.
C:\>rundll32 malicious.dll
Asumiendo que deseas cargar una DLL y llamar nicamente a su funcin de punto entrada (por
ejemplo, no cualquier exportacin), entonces puedes usar el siguiente comando:
C:\>rundll32 malicious.dll. ThisIsFake
En el ejemplo, su sintaxis es vlida, as que rundll32.exe procede a llamar a LoadLibraryW.
Como se mencion previamente, LoadLibraryW invoca a la DLL en su funcin de punto de
entrada automticamente. Estas funciones de punto de entrada ejecutan antes rundll32.exe
para lograr el paso 3 para comprobar si ThisIsFake existe.
Tip #2
La siguiente lnea de comando contiene un error:
C:\rundll32 kernel32.dll, sleep 100
El error es que puedes llamar nicamente a las funciones que no requieren argumentos o que
esperan recibir argumentos desde cadena (ejemplo, un puntero a un buffer ANSI o UNICODE).
La llamada de la API sleep acepta un valor entero representando el nmero de milisegundos
para dormirse. En el ejemplo, sleep recibe actualmente la direccin de memoria donde la
cadena 100 existe, y el proceso de rundll32.exe finalizara apagndose por alguna cantidad
impredecible de tiempo en vez de 100 milisegundos.
Como puedes ver en BYPASSING HOST PROCESS RESTRINCTIONS, la funcin HideConnection
acepta un hostname desde cadena. Puedes llamar legtimamente esa funcin de la siguiente
manera:
C:\>rundll32 4DW4R3c.dll, HideConnection www.hideth1saddress.com
Monitoreando DLLs Dinamicamente

Вам также может понравиться