Hola a todos! Decidí compartir con la comunidad información sobre un pequeño análisis de una pequeña utilidad (con un código ofuscado), conocida en círculos estrechos de apodos 1s. Este es mi primer artículo sobre Habr, le pido que no patee mucho, pero que sea digno de criticar.
Descargo de responsabilidadTodo lo que veas aquí puede afectar tus habilidades psíquicas, no uses lo que se describe en el artículo, ya que esto puede hacerte daño. El autor no asume ninguna responsabilidad por la precisión, integridad o calidad de la información proporcionada.
Que es estoTurboConf es un programa "shareware" que amplía las capacidades del configurador 1s,
ni una palabra más acerca de 1s , que no requiere instalación. Puede descargarlo en el sitio web del mismo nombre Runet. Todos los estudios se realizaron en la versión 5.9.7209.21363 del 27 de septiembre de 2019.
Análisis inicialDespués de la descarga, obtenemos un archivo zip. Desempacar Vemos varios archivos exe. Veamos la aplicación principal con un ícono corporativo. Si lo abre en un editor HEX simple, por ejemplo, HxD, puede comprender fácilmente que es un ensamblado en .Net Framework, porque los nombres de clase de la biblioteca .Net estándar son visibles:
A continuación, tomamos el descompilador DotPeek y miramos este ensamblaje en él. El código de bytes no está ofuscado, por lo que el descompilador produce fuentes casi originales:
Código de método recuperado Aquí es fácil entender que el trabajo de la utilidad se traslada a la aplicación "TurboConf.Application.exe". Ábrelo en DotPeek. Este también es un ensamblaje con código IL. Pero a diferencia del ensamblaje anterior, algunos de los métodos aquí están ofuscados, probablemente usando Confuser. Al estudiar el código, queda claro que la lógica principal del trabajo está en "TurboConf.Service.dll", y esto también es un ensamblado para .Net, y también algunos de los métodos están ofuscados. ¡Genial, esto es aún más interesante!
Investigación de defensaAl ver la estructura del ensamblaje, en el espacio de nombres "TurboConf.Service.Utils" encontramos la clase "Crypto", y en ella un método con el nombre de voz "DecryptStringAES":
Aunque está ofuscado, no es difícil restaurar la lógica del trabajo en el futuro. Encuentre el uso de este método (Shift + F12):
¡Y de inmediato éxito! ¡Este método se llama 2 veces en el constructor de la clase responsable de la licencia!
Fuente de recuperaciónEl ofuscador cifró todas las líneas y las colocó en un archivo de recursos. Puede obtener este archivo utilizando el descompilador de Microsoft ildasm.exe incluido en el SDK de Windows (y no solo):
Recuperando un Archivo de Recursos Y en lugar de las líneas originales, el ofuscador sustituye la siguiente construcción en el código: "<Module> .c (random_arithmic_operation)", donde el resultado de la operación aritmética es un número determinado en función del cual se calcula el desplazamiento del archivo de recursos, a partir del cual se extraen los datos cifrados y se restaura la cadena original. Para facilitar la tarea de descifrar cadenas, crearemos un nuevo proyecto en Visual Studio, transferiremos, con un poco de refinamiento, la clase "<Módulo>" y el archivo de recursos "recurso". Por lo tanto, podemos entender que en la ventana DotPeek el siguiente código
<Module>.c(sizeof (float) - 47, sizeof (int) + 6429, (int) ((uint) k >> 16) >= 0 ? sizeof (int) + 200 : System.Type.EmptyTypes.Length - 1805516213)
esta es la línea "Usuario:"
Restaura lentamente la lógica completa de la clase de licencia. Podríamos detenernos en esto, es decir, hacer un simple truco en el archivo investigado "TurboConf.Service.dll", reemplazando la verificación de igualdad para una licencia con desigualdad, pero esto no es interesante. Yendo más allá ...
Principio de protecciónPara obtener una licencia, necesita un identificador único para el equipo en el que se ejecuta el programa. Este HardwareID se genera en función del identificador del procesador y el número de serie del volumen de la unidad "Ts". Para obtener una licencia de prueba, el programa realiza una solicitud GET con un identificador de equipo para el dominio "netlenka1c.ru". Y en respuesta llega una clave que indica la fecha de finalización del período de prueba, firmada ... digitalmente. El programa se basa en el algoritmo RSA asimétrico con una clave de 1024 bits. En esta etapa, me di cuenta de que es imposible hacerlo sin modificar el archivo original, ya que es casi imposible obtener la clave privada (no está en los archivos de la utilidad).
Mini centro de licenciasHabiendo entendido cómo funciona la protección, decidí convertirme en un pequeño dios para este programa, de modo que yo mismo pudiera generar claves. Para hacer esto, se desarrolló un parche, que primero reemplaza la clave pública de la firma digital en el ensamblado con la clave pública generada en sí:
Y luego, la utilidad desarrollada para generar claves (tanto temporales para un período de validez especificado como perpetuas), agrega una firma digital a la clave basada en la clave privada generada:
Como resultado, tenemos un programa registrado viable con funcionalidad completa:
MoralejaLa ofuscación es un método bastante bueno para confundir lo contrario, pero es solo cuestión de tiempo.
PSEl artículo específicamente tiene lagunas en la narrativa, para no sustituir al autor del programa. No se adjuntan códigos fuente y programas de trabajo y no se incluirán. ¡Respeta el trabajo de los demás, especialmente los colegas de la "tienda"!
¡Gracias a todos los que leen la publicación!