LLevo unos cuantos dias trabajando en un ofuscador de AutoIt en Python. Lo libero porque un proyecto de ofuscadores online que planteamos entre Blau, Sanko y yo ha quedado en nada, espero que os sirva de algo.
Actualmente las características son las siguientes:
[spoiler][code2=plain]Características del proceso:
· Número de iteraciones del proceso de ofuscado.
· Enlazar includes desde otros ficheros del proyecto.
· Eliminar comentarios especificados por tags (comment-start/comment-end y cs/ce)
· Eliminar comentarios especificados por ;
· Eliminar regiones (#Region)
· Añadir nuevas regiones
· Ocultar nombres de variables
· Ocultar nombres de funciones
· Añadir funciones hardcodeadas especificadas en Hardcoded/HardcodedPrograms.py
· Añadir variables
· Añadir comentarios
· Añadir bloques de código generado al inicio
· Añadir bloques de código generado al final
· Añadir bloques de código generado entre lineas del código original.
· Añadir funciones
· Añadir llamadas a funciones
· Ocultar strings con método replace.
· Ocultar strings con método shuffle (genera codigo autoit para desordenar y ordenar las strings).
· Ocultar strings con método cipher (medio implementado por problemas con la salida de los algoritmos de PyCrypto).
· Ocultar strings con método reverse.
· Ofuscar enteros.
· Añadir directivas, incluido #pragma compile con datos generados.
· Añadir espacios y tabuladores en el código.
· Añadir símbolos en el EOF.
Características de los bloques de código generados (según una aproximación a la gramática de AutoIt):
· Generación de código y bloques if, for, switch, func y simple (definiciones de nuevas variables haciendo uso de macros, constantes ofuscadas, funciones del lenguaje de aridades 0, 1 y 2 y valores de tipos básicos)
· Definición del número mínimo y máximo de bloques a añadir.
· Definición del número mínimo y máximo de sentencias a añadir dentro del bloque (estas sentencias pueden ser a su vez nuevos bloques).
· Definición del número mínimo y máximo de condiciones lógicas a añadir en la guarda de los bloques generados.
· Definición del número mínimo y máximo de ElseIf dentro de un bloque If.
· Definición de la profundidad máxima de anidamiento de bloques generados.
· Definición de los valores mínimo y máximo de los enteros a usar en las definiciones (tiene sentido cuando se combina con la ofuscación de números).
· Posibilidad de añadir bloques al inicio, al final y entre medias del código original.
· Definición de la probabilidad de generación de nuevos bloques entre medias del código original.
· Definición del número mínimo y máximo de funciones a añadir.
· Definición de la aridad mínima y máxima de las funciones a añadir (define el número de parámetros de una función).
· Es necesario especificar todos estos valores en las tres posibilidades de adición de bloques (inicio, final, medio).
Otras características:
· Definición de la profundidad máxima en el ofuscado de enteros.
· Definición del tamaño en KB de la secuencia de símbolos a añadir tras el EOF.
· Variables declaradas con Local, Dim y Global.
· Considerado Call en las llamadas a funciones. (Considerar que el usuario pueda desactivarlo)
· Considerado Assign en las definiciones de variables. (Considerar que el usuario pueda desactivarlo)
· Considerado Eval. (Considerar que el usuario pueda desactivarlo)
· Alterar nombres de las funciones y palabras clave de AutoIt (Considerar que el usuario pueda desactivarlo)
· Posibilidad de combinar los métodos de ofuscado de strings disponibles.
· Todos los parámetros de los procesos son elegidos de forma aleatoria entre los valores límite especificados por el usuario (incrementa la dispersión y permite incrementar la exploración del espacio de soluciones si se emplean algoritmos genéticos para optimizar los parámetros).
· Implementado operador ternario (parece funcionar solo con algunas versiones de AutoIt, dar posibilidad de activarlo)[/code2][/spoiler]
· Número de iteraciones del proceso de ofuscado.
· Enlazar includes desde otros ficheros del proyecto.
· Eliminar comentarios especificados por tags (comment-start/comment-end y cs/ce)
· Eliminar comentarios especificados por ;
· Eliminar regiones (#Region)
· Añadir nuevas regiones
· Ocultar nombres de variables
· Ocultar nombres de funciones
· Añadir funciones hardcodeadas especificadas en Hardcoded/HardcodedPrograms.py
· Añadir variables
· Añadir comentarios
· Añadir bloques de código generado al inicio
· Añadir bloques de código generado al final
· Añadir bloques de código generado entre lineas del código original.
· Añadir funciones
· Añadir llamadas a funciones
· Ocultar strings con método replace.
· Ocultar strings con método shuffle (genera codigo autoit para desordenar y ordenar las strings).
· Ocultar strings con método cipher (medio implementado por problemas con la salida de los algoritmos de PyCrypto).
· Ocultar strings con método reverse.
· Ofuscar enteros.
· Añadir directivas, incluido #pragma compile con datos generados.
· Añadir espacios y tabuladores en el código.
· Añadir símbolos en el EOF.
Características de los bloques de código generados (según una aproximación a la gramática de AutoIt):
· Generación de código y bloques if, for, switch, func y simple (definiciones de nuevas variables haciendo uso de macros, constantes ofuscadas, funciones del lenguaje de aridades 0, 1 y 2 y valores de tipos básicos)
· Definición del número mínimo y máximo de bloques a añadir.
· Definición del número mínimo y máximo de sentencias a añadir dentro del bloque (estas sentencias pueden ser a su vez nuevos bloques).
· Definición del número mínimo y máximo de condiciones lógicas a añadir en la guarda de los bloques generados.
· Definición del número mínimo y máximo de ElseIf dentro de un bloque If.
· Definición de la profundidad máxima de anidamiento de bloques generados.
· Definición de los valores mínimo y máximo de los enteros a usar en las definiciones (tiene sentido cuando se combina con la ofuscación de números).
· Posibilidad de añadir bloques al inicio, al final y entre medias del código original.
· Definición de la probabilidad de generación de nuevos bloques entre medias del código original.
· Definición del número mínimo y máximo de funciones a añadir.
· Definición de la aridad mínima y máxima de las funciones a añadir (define el número de parámetros de una función).
· Es necesario especificar todos estos valores en las tres posibilidades de adición de bloques (inicio, final, medio).
Otras características:
· Definición de la profundidad máxima en el ofuscado de enteros.
· Definición del tamaño en KB de la secuencia de símbolos a añadir tras el EOF.
· Variables declaradas con Local, Dim y Global.
· Considerado Call en las llamadas a funciones. (Considerar que el usuario pueda desactivarlo)
· Considerado Assign en las definiciones de variables. (Considerar que el usuario pueda desactivarlo)
· Considerado Eval. (Considerar que el usuario pueda desactivarlo)
· Alterar nombres de las funciones y palabras clave de AutoIt (Considerar que el usuario pueda desactivarlo)
· Posibilidad de combinar los métodos de ofuscado de strings disponibles.
· Todos los parámetros de los procesos son elegidos de forma aleatoria entre los valores límite especificados por el usuario (incrementa la dispersión y permite incrementar la exploración del espacio de soluciones si se emplean algoritmos genéticos para optimizar los parámetros).
· Implementado operador ternario (parece funcionar solo con algunas versiones de AutoIt, dar posibilidad de activarlo)[/code2][/spoiler]
Además, pretendo llevar adelante el proyecto hasta al menos el 25 de este mes que empiece el máster por lo que intentaré añadir en futuras versiones:
[spoiler][code2=plain]· Algoritmo genético para optimizar los parámetros del proceso.
· GUI (Sadfud y Blau)
· Compilar automáticamente con Aut2Exe y variar sus parámetros (compresión, iconos, ...)
· Añadir soporte de bloques While y Do Until.
· Considerar arrays.
· Considerar constantes y enumeraciones (const y enum). (Reparando bugs)
· Añadir expresiones lógicas siempre ciertas en el código ya existente.
· Añadir más macros y funciones de autoit con más aridades.
· Considerar objetos.
· Solucionar problemas con algunos scripts.
· Reparar bugs al ocultar variables (constantes de AutoIt).
· Considerar declaraciones relacionadas con objetos (With y For Inf)
· Añadir más funciones hardcodeadas.
· Añadir más métodos de ofuscado de strings.
· Parametrizar el script principal.
· Reordenación de código (tengo planteado algo usando grafos para tener en cuenta las dependencias).
· Dar la posibilidad de especificar más parámetros como el tamaño de los identificadores generados (esto se considera en las funciones implementadas pero no se deja al usuario especificarlo, puede reducir considerablemente el tamaño del código).
· Hardcodear instancias simples de problemas NP.[/code2][/spoiler]
· GUI (Sadfud y Blau)
· Compilar automáticamente con Aut2Exe y variar sus parámetros (compresión, iconos, ...)
· Añadir soporte de bloques While y Do Until.
· Considerar arrays.
· Considerar constantes y enumeraciones (const y enum). (Reparando bugs)
· Añadir expresiones lógicas siempre ciertas en el código ya existente.
· Añadir más macros y funciones de autoit con más aridades.
· Considerar objetos.
· Solucionar problemas con algunos scripts.
· Reparar bugs al ocultar variables (constantes de AutoIt).
· Considerar declaraciones relacionadas con objetos (With y For Inf)
· Añadir más funciones hardcodeadas.
· Añadir más métodos de ofuscado de strings.
· Parametrizar el script principal.
· Reordenación de código (tengo planteado algo usando grafos para tener en cuenta las dependencias).
· Dar la posibilidad de especificar más parámetros como el tamaño de los identificadores generados (esto se considera en las funciones implementadas pero no se deja al usuario especificarlo, puede reducir considerablemente el tamaño del código).
· Hardcodear instancias simples de problemas NP.[/code2][/spoiler]
He podido identificar una serie de errores que tienen solución simplemente usando bien el ofuscador, sin embargo es posible que haya algunos errores permanentes si usáis alguna función que no se comporte correctamente con un script dado, ante ese problema desactivad la función, variad los límites de dicha función o esperad hasta una nueva versión. Algunos de los errores conocidos son:
[spoiler][code2=plain]Errores conocidos:
· Duplicate name (function) ->
· Problema: Repetición del nombre de alguna función.
· Solución: Volver a ejecutar el ofuscador.
· Error in expresion ->
· Problema: Error en algún Switch generado
· Solución: Volver a ejecutar el ofuscador.
· Error subscripted array ->
· Problema: Error general, fuente desconocida.
· Solución: Volver a ejecutar el ofuscador, error general, fuente desconocida.
· Undefined variable ->
· Problema: Se hace uso de una variable no definida en alguna evaluación.
Generalmente ocurre cuando se intentan ocultar variables y se hace uso en el código de constantes AutoIt.
· Solución: Desactivar la función de ocultar variables. (Intentad volviendo a ejecutar el ofuscador)[/code2][/spoiler]
· Duplicate name (function) ->
· Problema: Repetición del nombre de alguna función.
· Solución: Volver a ejecutar el ofuscador.
· Error in expresion ->
· Problema: Error en algún Switch generado
· Solución: Volver a ejecutar el ofuscador.
· Error subscripted array ->
· Problema: Error general, fuente desconocida.
· Solución: Volver a ejecutar el ofuscador, error general, fuente desconocida.
· Undefined variable ->
· Problema: Se hace uso de una variable no definida en alguna evaluación.
Generalmente ocurre cuando se intentan ocultar variables y se hace uso en el código de constantes AutoIt.
· Solución: Desactivar la función de ocultar variables. (Intentad volviendo a ejecutar el ofuscador)[/code2][/spoiler]
Si obtenéis un error diferente a los conocidos, intentad variar los parámetros o desactivar las funciones del ofuscador que supongáis que ocasionan el problema. Hay que tener cierta maña para usarlo y darse cuenta de qué funciones y parámetros provocan cada error, no os desaniméis si no funciona a la primera . Además, podéis escribir el error en el post para que pueda darle solución en futuras versiones o daros alguna recomendación de uso.
Con respecto al código, podéis descargarlo de mi [Enlace externo eliminado para invitados] , es ahí donde subiré las actualizaciones (avisaré también por aquí). Para usar esta versión solo tenéis que cambiar los parámetros en Obfuscator.py y ejecutar el script.
Además, Sadfud y Blau han colaborado haciendo una GUI cada uno, de momento solo está la de Sadfud y tiene algunos problemas que yo haya podido comprobar (funciona con una versión anterior del código, salta Avira y solo deja ofuscar un fichero en cada ejecución de la interfaz).
SadFud
Blau
De momento recomiendo usar directamente el script de mi [Enlace externo eliminado para invitados] variando los parámetros correctamente para cada script AutoIt, aunque si no es posible tenéis la GUI de Sadfud.
No me hago responsable del uso que le déis a la herramienta , espero que os sea útil .