DESEMPACANDO ARMADILLO 4.30
by Tena
Bueno gente hace mucho que no escribo nada asi que me baje algo de google y o casualidad siempre me tocan estos a mi jeje, un Armadillo 4.30 con Debug-Blocker..No es nada del otro mundo es mas de lo mismo, pero tenia ganas de escribir asi que me tome de este para hacerlo. No se agregara nada nuevo en este caso, asi que los mas expertos solo pueden darle una hojeada para criticarme, eso si cosas buenas jeje
Bueno como dije mi victima esta empacada con Armadillo, pero como sabemos que es eso cierto? a los mas nuevos les dire que hay detectores que te dicen con que esta empacado y compilado un archivo ejecutable.
Yo usare el RDG Packer Detector y lo puedes descargar de aqui:
http://www.egrupos.net/grupo/rdgsoft/ficheros/3/verFichero/29/RDG%20Packer%20Detector%20v0.6.6%202k8.rar
Si vemos que nos dice de nuestro amigo veremos esto:
Vemos que en modo B nos da la version exacta del armadillo, y esta compilado en Visual C++. Pues ahora que sabemos de que se trata tenemos que ver con que regalitos viene este armadillo. Sin mas usare el ArmaFP que es un detector especificamente para armadillo y nos dara mucha info sobre este packer.
Bien vemos que tiene Debug-Blocker, osea correra en dos procesos, y la version es 4.30 como nos dijo el rdg.
Listo el pollo, abramoslo en el Ollydbg, yo usare el de mi amigo Shady, OllyShadow.
Aqui tenes todos los links de descarga de las herramientas que usare:
http://foro.elhacker.net/ingenieria_inversa/herramientas-t183012.0.html
Aclaro que solamente usare el plugin de ollyAdvanced, pero por ahora tendremos desactivados todas las opciones que nos ofrece para esconder al olly.
Si lo ponemos a correr con F9 nos detectara y nos mostrara el siguiente mensaje..
Asi que bueno reiniciemos el olly y cambiemos el segundo byte del PEB (Process Environment Block) el cual es seteado a 1 por el sistema cuando el proceso es debugueado, este flag es comprobado por la api IsDebuggerPresent.
Al iniciar el ollydbg siempre en ebx nos queda apuntando al PEB, asi que para ver el flag BeingDebugged solo basta con ir a ebx+2.
En la ventana del dump hacemos lo siguiente
aceptamos y vemos que el byte esta en 1
lo cambiamos por cero
Ejecutamos con F9 y vemos que no nos detecta, pues sale corriendo el programa.
Bueno ahora para no tener que poner siempre a cero ese byte usare el plugin OllyAdvanced y tildamos la opcion de IsdebuggerPresent.
En este momento si no hemos reiniciado al olly podemos ver los dos procesos corriendo.
Lo que vamos hacer ahora es lograr que el programa corra en un solo proceso asi podremos dumpearlo. Asi que reiniciemos el olly y pongamos un Bp en la api OpenMutexA.
con F2 ponemos el bp..
Damos DOS veces run con F9 y luego Ctrl+F9 para ir al ret de la api.
Para lograr que corra en un solo proceso debemos cambiar el registro eax a 1.
Eliminamos el bp a OpenMutexA para que no caiga mas ahi, y ponemos un nuevo bp en la api CreateThread.
Ctrl+g
y ponemos el bp con F2
damos con F9 y caemos en el bp, hacemos Ctrl+F9 para ir al ret, otra vez mas Ctrl+F9, F7 para pasar el ret, y desde aqui bajamos un poco por el codigo, sin ejecutar nada, hasta encontrar el segundo Call Registro.
ponemos un bp en el Call Registro y damos run, caera ahi, entramos al call con F7 y estamos en el OEP.
Bien nuestro oep es 46DA0B, debemos ver como nos dejo la IAT, para ello nos posicionamos sobre el primer call indirecto y hacemos Follow in Dump Memory Address con el boton secundario del mouse, en la ventana del dump podemos apreciar esto..
umm esta fiero asi jeje, mejores la visual, pongamoslo en Long->Address
Ahi esta, vemos que hay valores malos el cual debemos arreglar, pero antes ya que estamos aqui veamos el inicio de la iat, asi que subamos hasta la primera api que nos muestra.
El inicio es 4ED000, ahora debemos ir al final de la iat, bajemos hasta encontrar la ultima api.
Ahi tenemos el final de la iat, 4ED7A8, debemos saber cual es el tamaño de la iat, entonces hacemos una simple resta Final-Inicio=Tamaño, eso nos da 7A8.
Ahora tenemos que buscar el salto magico que nos permita arreglar nuestra iat, pàra ello elegimos cualquier valor de la iat y le ponemos un hbpw, yo lo hice en la primera api de la iat. Lo que queremos buscar aqui es el momento en que escribe un valor en la iat.
y reiniciamos el ollydbg, ponemos el bp en OpenMutexA y hacemos como antes para hacer que corra en un solo proceso, una vez que cambiamos eax a 1, eliminamos el bp y damos run.
eso no es lo que buscamos, damos run.
Ahora si, vemos que en eax tenemos una direccion de la iat, en ecx tenemos un valor malo que metera en esa direccion, ademas vemos que a ecx se le asigna el valor de ebp-3598, pues pongamos un bpmw en ebp-3598 para ver cuando se escribe ahi el valor bueno o malo.
Vemos que en esta variable va tomando los valores buenos/malos, pongamo el bpmw y demos run con F9
aqui inicializa la variable en cero, demos run otra vez.
aqui le asigna el valor bueno, demos run varias veces hasta que le asigne un valor malo.
Ahi vemos arriba que le asigna el valor malo, mas abajo podemos ver donde le mete el valor bueno, y arriba de este compara la variable con cero, pero como antes le metio un valor malo, pues no es cero entonces salta y evita que se le ponga un valor bueno, y de esta forma mete finalmente el valor malo en la iat.
Por lo que nuestro salto magico es el JNE de la direccion D1ACACD, y debemos hacer que no salte, por lo tanto debemos poner el flag Z a 1.
Pondremos ese flag a 1 con un script.
Por el momento ya contamos con el oep y el salto magico, datos que necesitaremos en el script, tambien podriamos automatizar para que haga lo del OpenMutexA, pero no lo hare, esa parte la haremos a manopla.
Nuestro script quedaria asi:
// VARIABLES
var oep
var magico
// DIRECCIONES IMPORTANTES
mov oep, 46DA0B// el oep jeje
mov magico, D1ACACD // el salto magico
// HBP DE EJECUCION
bphws oep, "x"
bphws magico, "x"
eob bps // PARA QUE PODAMOS COMPARAR AL CAER EN HBPS
run // F9
// COMPARAMOS EL EIP PARA SABER EN QUE HBP CAYO
bps:
cmp eip,magico
je magia
cmp eip,oep
je fin
// SI CAYO EN EL MAGICO ENTONCES PONGO EL FLAG Z A 1
magia:
mov !zf,1
run
fin:
bphwc oep // ELIMINO EL HBP DEL OEP
bphwc magico // IGUAL PERO DEL MAGICO
msg "La IAT fue arreglada"
ret // TERMINAMOS LA EJECUCION DEL SCRIPT
Bueno reiniciamos el ollydbg, hacemos lo del OpenMutexA para que corra en un proceso y con el plugin OllyScript ponemos a correr nuestra creacion.
Nos deja parado en el oep y con la iat arreglada..
Esta todo en orden jeje..
Por si las moscas verifico y no tiene codigo splicing, que son saltos a una sección fuera del exe...
Bueno entonces queda copiar la cabecera del ejecutable cargado en otro olly, ya que armadillo hace destroyer la cabecera.. Pues abrimos otro olly y cargamos el exe.
Alt+M para abrir elñ memory map, doble clic sobre el header
seleccionamos todo y binary copy
cerramos este olly, volvemos al que teniamos abierto estando parado en el oep, Alt+M para abrir el memory map, doble clic sobre el header, seleccionamos todo y binary paste.
Abro el LordPE, selecciono el proceso y activo el intelliDump
y despues hago el dump full.
Ahora nos queda arreglar la iat con el ImportReconstructor, lo abrimos, seleccionamos el proceso y metemos el oep..
clic en Iat AutoSearch y vemos que calcula los mismos datos que sacamos nosotros, le damos a Get Imports, Show Invalid, y como vemos en la imagen hay algunas que no resolvio, pero esas son separaciones entre las dlls, osea ceros, vamos a eliminarlas, hacemos clic derecho sobre algunas de las que estan seleccionadas como invalidas y le aplicamos un cut thunk, por ultimo fix dump y elegimos nuestro dumpeado.
Lo ejecutamos
y se nos caga el laburo
veamos cerremos todos los ollys y dejemos uno, en este carguemos nuestro dumpeado y lo ejecutemos.
Nos sale el error, pausamos el olly con F12, presionamos Alt+F9 para que regrese al codigo, aceptamos el mensaje de error y salta el olly.
Cae justo despues de la llamda a la MessageBoxA y en la pila podemos ver que llama a un archivo con extension chm y con el mismo nombre que nuestro dumpeado, y ahi esta el error no encuentra ese archivo.
Pues la solucion es renombrar nuestro dumpeado y le ponemos el mismo nombre que el archivo original.. con esto ya sale volando y por las nubes jeje...
Espero que se haya entendido algo pues me llevo variosssss minutos meter las imagenes aqui jeje...
Un saludo a todos mis amigos, a Solid que ya hace bastante que no se lo ve por aqui, a Mintaka, a Shady, a Karmany, a todos, a todos mis amigos de la lista CracksLatinos en donde aprendi mucho, a todos..
byteS