lunes, 19 de diciembre de 2011

Cifrando un ejecutable en C, problemas (2ª parte)

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:

image

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:

image

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:

image

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:

image

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.

image

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.

image

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!

12 comentarios:

  1. Grande Thor! Muy bién explicado para que un tipo como yo lo entienda xD

    Un saludo y espero la siguiente con ganas ^^

    ResponderEliminar
  2. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  3. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  4. Thor qué pasó con tu blog?. Hace mucho que no lo actulizás.

    ResponderEliminar
  5. hola 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!!

    ResponderEliminar
  6. Es 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.

    ResponderEliminar
    Respuestas
    1. Eres 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.

      Eliminar
  7. Thor vuelve ! Por favor ! :(
    Que será de nosotros sin tus explicaciones U_U

    ResponderEliminar
  8. hola bro , queria hacerte algunas preguntas , por favor donde puedo encontrarte gracias !!!

    ResponderEliminar
  9. Muy buena publicación mi amigo y muy interesante. Saludos.

    ResponderEliminar