En esta entrada expliqué los posibles problemas que pueden suceder cuando ciframos un ejecutable y en la última entrada mejoré el “crypter” detectando estas situaciones.
Pero hay otra situación en la que no había caído.
Para empezar veamos la estructura típica de un ejecutable:
La sección que nos interesa es la de código que es la que vamos a cifrar, el resto de secciones no las tocaremos.
Pueden existir mas secciones por ejemplo .idata donde se almacena la IT, Import Table y la IAT, Import Address Table. En muchos ejecutables esta sección no existe y la IT y la IAT se almacenan en otras secciones.
Por ejemplo es habitual encontrarse con la IT en la cabecera del ejecutable y la IAT en la sección de código o ambas en la sección de código. Y esta última es la peor situación que nos puede suceder para nuestro crypter:
El problema es que el crypter que estoy haciendo en su estado actual hace un XOR a toda la sección de código. Y esto sobre un ejecutable que tiene la IT en la sección de código hace que la IT quede inválida, el loader de Windows no pueda leerla y no pueda cargar el ejecutable.
Este problema ya lo había explicado en la otra entrada, el otro problema, es que la IAT se encuentre en la sección de código.
Supongamos que tenemos un ejecutable que tiene la IT en la cabecera (así no nos molesta) y la IAT en la sección de código:
A este ejecutable le pasamos el crypter, el cual hará un XOR a toda la sección de código y agregara una nueva sección para descifrar la sección de código:
En esta situación el loader de Windows puede leer correctamente la IT y rellena correctamente la IAT con las direcciones de las funciones utilizadas por el ejecutable.
Lo siguiente que sucede es que se ejecuta el código de la nueva sección que es el encargado de descifrar la sección de código, volviendo a hacer XOR a la misma y salta al Entry Point original.
Al hacer XOR a la sección de código para descifrarla también se ha hecho XOR a la IAT que había sido rellenada correctamente por el loader y se ha dejado la IAT con direcciones de funciones incorrectas. De modo que el ejecutable cifrado falla en cuando llama a una función de una dll, vamos…siempre.
¿Cómo solucionar esto?
Hay dos opciones, una fácil y otra difícil:
- La fácil: Si la IT o la IAT se encuentran en la sección de código, no hacer XOR sobre la zona donde se encuentra.
- La difícil: Si la IT o la IAT se encuentra en la sección de código, moverlas a la nueva sección agregada por el crypter.
En la siguiente entrada implementará la primera opción, la segunda para mas adelante.
Buenas noches!
Grande Thor! Muy bién explicado para que un tipo como yo lo entienda xD
ResponderEliminarUn saludo y espero la siguiente con ganas ^^
Este comentario ha sido eliminado por un administrador del blog.
ResponderEliminarasdasdasd
EliminarEste comentario ha sido eliminado por un administrador del blog.
ResponderEliminarThor qué pasó con tu blog?. Hace mucho que no lo actulizás.
ResponderEliminarhola que tal, he seguido tus post, pero creo que he llegado tarde los archivos del source que has subido han sido eliminados, puedes subirlo de nuevo te lo agradeceria!!
ResponderEliminarEs una pena que no sigas actualizando el blog, porque es muy clara la explicación que das sobre el tema y las personas que trabajamos en servicios informáticos Barcelona valoramos mucho estos aportes y nos complace que gente como ustedes, se preocupen en aclarar ciertos temas a la comunidad.
ResponderEliminarEres un capullo, llegas a joder el blog con tus estúpidos comentarios, pero espera que lo poco que hayas ganado en SEO te lo tiro ahora.
EliminarThor vuelve ! Por favor ! :(
ResponderEliminarQue será de nosotros sin tus explicaciones U_U
hola bro , queria hacerte algunas preguntas , por favor donde puedo encontrarte gracias !!!
ResponderEliminarEn mi correo: xyzthor@gmail.com
ResponderEliminarMuy buena publicación mi amigo y muy interesante. Saludos.
ResponderEliminar