
Script en Python para IDA que desofusca el inyector DLL de Astaroth/Guildma
Script de IDA Python para desofuscar la DLL inyectora de Astaroth/Guildma
Al intentar analizar la DLL inyectora de una campaña reciente de Astaroth/Guildma (gracias a este diario de SANS ISC), me topé con un intento de ofuscación realmente molesto.
Una función (a la que llamé time_waster_3000 en la imagen de abajo) se llama más de 1,000 veces (!!!) en toda la DLL. Esta función toma seis cadenas hardcodeadas como argumentos, junto con una word aleatoria. La función en sí es un laberinto de aritmética que no sirve para ningún propósito práctico por lo que pude comprobar (aparte de hacer perder el tiempo a un reverser). Así es como se ve DLLEntry con esas molestas llamadas en su lugar:
El propósito de este script de IDA Python es ocultar todos los bloques de código que implican una llamada a esta función basura, así como sus argumentos. Así es como se ve DLLEntry después de ejecutar el script:
El script funciona encontrando una llamada a la función de relleno, representada por call sub_CHANGEME en el script. Por lo tanto, debes renombrarla en el script con el nombre de la función encontrado en la muestra con la que estés trabajando. Por ejemplo, cambiar idc.print_operand(x, 0) == 'sub_CHANGEME' a idc.print_operand(x, 0) == 'sub_431000'.
He elegido iterar sobre la instrucción call sub_CHANGEME en lugar de sobre los pushes de argumentos. La razón es simple: las cadenas hardcodeadas están presentes en múltiples lugares del binario; por lo tanto, cuando intenté buscar por instrucciones push que involucraran los offsets de dichas cadenas, el script no encontraba todas las instancias de estos datos basura.
El script solía funcionar ocultando cada instancia del paso de argumentos y la llamada a la función de relleno como un único bloque colapsado. Como la función se llama varias veces seguidas, eso resultaba en enormes espacios en blanco en la vista de desensamblado. Lo he actualizado para ocultar las instancias secuenciales de este relleno en un solo bloque colapsado, lo que realmente mejora la legibilidad.