Rutina de desencriptación con TLS Callback

Iniciado por Binary_Death, 27 Agosto 2013, 20:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Binary_Death

Con el objetivo de hacer un crypter, se puede añadir una sección (o extender la última) en el PE para hacer espacio para una función TLS Callback que desencripte el ejecutable.

El problema claro, el loader de windows, que te carga las API importadas en la IAT, y la función de desencriptación se la carga. Pero si la función para cifrar y para descifrar coinciden, he pensado que localizando la IAT y pasándola por la rutina de nuevo volvería a quedar limpia y correría bien.

En fin, lo que me gustaría saber es si pensáis que es factible hacer esto, ya que estaba pensando programarlo en serio y me gustaría oir opiniones.

Gracias  :P

Karcrack

Claro que es factible, de hecho si no me equivoco Yoda's crypter usaba TLS callbacks para descifrar. No acabo de comprender el problema del que hablas.

Apunte pedante: "Desencriptación" no existe, es "descifrado". De hecho cualquier derivado de [des]cifrar no es correcto en castellano.

Binary_Death

#2
El problema que decía es que cuando el crypter cifra todo el ejecutable (menos el PE Header, claro) y añade la rutina para descifrarlo (gracias por el apunte, ya había oído que es incorrecto pero es la costumbre  :xD) también estará cifrando la Import Table. Entonces cuando el loader de Windows vaya a cargar la IAT con las direcciones de las API's importadas (que lo hace antes de que se ejecuten las TLS Callback) e intente acceder a todas las RVA's y demás, se lo encontrará todo cifrado.

Supongo que habría que hacer algún apaño, como no cifrar la IT (pero entonces no sería un buen crypter...), o hacer que el loader cargara una IT falsa, y luego descifrar la verdadera y rellenar la IAT con las direcciones de las API...
O aun mejor, poner a 0 en la cabecera Import Table Address, Import Table size, Import Address Table address, Import Addres Table size. Así Windows pensará que no hay nada que importar, y después bastará con cargar manualmente todo y listo.

La RVA de la IT y la IAT se guarda en algún sitio de la nueva sección creada, donde también meto la rutina de descifrado y la estructura TLS_DIRECTORY. Aunque es cierto que habría que consultar previamente si el ejecutable original ya tiene una sección .tls, que sería muy raro, pero por si las moscas...  :-\

Karcrack

Sí, la solución es encargarse de la IAT manualmente. Almacena las cadenas de las librerías y los hashes de las funciones por ejemplo y luego creas tu la IAT a mano.

Binary_Death

Cita de: Karcrack en 28 Agosto 2013, 20:32 PM
Sí, la solución es encargarse de la IAT manualmente. Almacena las cadenas de las librerías y los hashes de las funciones por ejemplo y luego creas tu la IAT a mano.

Está bien, muchas gracias  ;D

Empezaré a codear, cuando tenga algo decente lo postearé en este subforo.

Binary_Death

#5
¿Alguien podría resolverme la siguiente duda?

¿Qué diablos hace Windows con el directorio de recursos de un ejecutable antes de pasarle el control a nuestro entry point? Porque por lo que vi si cifro la sección de recursos y no quito la RVA a ella en el DataDirectory, windows no puede cargar el ejecutable...