Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

Prólogo

El texto y las imágenes del texto provienen de Internet y son solo para el aprendizaje y la comunicación. No tienen ningún uso comercial. Los derechos de autor pertenecen al autor original. Si tiene alguna pregunta, contáctenos a tiempo para su procesamiento.

Autor: Wang Ping

PD: si necesita materiales de aprendizaje de Python, puede hacer clic en el siguiente enlace para obtener http://t.cn/A6Zvjdun

Hablemos de la ofuscación del código de Python. No tiene sentido ofuscar el código de Python, pero hay algunas necesidades para la entrega de proyectos de outsourcing.

El propósito de la ofuscación es hacer que sea más difícil para otros analizar la lógica y el flujo de su código, de modo que el código se vea desordenado y la lógica sea caótica. Pero el programa debe poder ejecutarse normalmente.

Confusión general

El simple punto de confusión con el código de Python es ofuscar nombres de variables / nombres de clase / cadenas / constantes, haciendo que el nombre sea muy largo o aproximado.

Existen muchas bibliotecas de ofuscación, como la biblioteca Intensio-Obfuscator. Esta biblioteca está dividida en ofuscación simple y compleja. Echemos un vistazo al uso de su modo simple para ofuscar el código de Python:

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

El lado izquierdo está antes de la confusión, y el lado derecho está después de la confusión, pero solo el nombre de la variable y el nombre del método se confunden y alargan.

El significado de esta simple confusión no es significativo, tanto las cadenas como las constantes son claras de un vistazo. La estructura del código depende del análisis estático, y el contexto del código sigue siendo claro.

Una confusión un poco más complicada es ocultar el código clave y agregar un código no válido al código.

O el complejo modo de ofuscación de la biblioteca Intensio-Obfuscator, echemos un vistazo:

 

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

A primera vista, a la derecha, no parece ser un código Python. De hecho, la cadena a la derecha es el código Python a la izquierda, pero solo el código Unicode. Debido a que Python tiene una función incorporada exec () que puede ejecutar programas de cadena, como este:

>> exec("1+1")>> 2

Imprimamos el contenido de esta cadena en utf8 y veamos el contenido:

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

 

Como se muestra en la figura anterior, su confusión es que el nombre de la variable se alarga, y el segundo es que se agrega algún código de interferencia al código.Al observar la marca roja, el código original originalmente no tenía declaraciones for y if, y el código ofuscado está disponible. Parece que es muy difícil analizar estáticamente este código. De hecho, si los nombres de las variables cambian de nombre y se acortan, esta parte del extra por y si a través del análisis estático es aún más fácil de saltar.

Para resumir el modo de ofuscación complejo de la biblioteca Intensio-Obfuscator, primero el nombre de la función de la variable de código se hace muy largo, luego el código no válido se agrega al código y, finalmente, el código fuente se comprime como una cadena, que se ejecuta con exec.

Árbol de sintaxis abstracta ofuscación

El método de ofuscación anterior es relativamente simple y se puede desuscarificar mediante análisis estático. Una confusión más complicada es la confusión del flujo de control. Por lo general, el flujo de ejecución del programa está muy organizado y la confusión del flujo de control es confundir el flujo de ejecución del programa.

Por ejemplo, hay mucho tiempo para sentencias if e incluso lamdb en el código, que cambian las operaciones de asignación, suma y resta en operaciones de bits, etc. Es difícil ver cuál es el propósito y la lógica del código a través del análisis estático.

Cómo lograr la confusión del flujo de control, a través del árbol de sintaxis abstracta (AST), a través del árbol de sintaxis abstracta, puede hacer el programa para modificar el programa. A través del árbol de sintaxis abstracta, puede saber exactamente lo que está haciendo el programa, por lo que puede modificar el código con mucha precisión.

Echemos un vistazo al sencillo ejemplo de confundir el programa a través del árbol de sintaxis abstracta, o tomemos el programa anterior como ejemplo.

 

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

A la izquierda está el código antes de la ofuscación, y en la parte posterior está la confusión posterior. Este ejemplo también confunde nombres de variables y luego confunde cadenas y constantes e importaciones. La dificultad del suavizado es un poco mayor que la anterior. Es necesario saber qué está haciendo el programa a través de la depuración dinámica.

¿Qué es un árbol de sintaxis abstracta?

Conocer el significado es abstraer el programa en un árbol, y las declaraciones en el código se dividen en nodos en el árbol. Hay un módulo AST en Python para hacer esto, o el código fuente anterior, y ve cómo se ve después de ser dividido en nodos por AST.

 

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

 

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

La segunda imagen es crear la primera imagen como un árbol de sintaxis abstracta e imprimir el código fuente de acuerdo con los nodos del árbol.

 

La flecha roja indica que hay un nodo Importar, un nodo Asignar, un nodo de función, un nodo de suma, etc. Este árbol puede expresar completamente el procedimiento anterior. Podemos modificar el programa por programa visitando este árbol.

Introducción a la ofuscación del código de flujo de control de Python, lo que dificulta que otros analicen la lógica y el flujo de su código

 

 

Personalice una clase, herede ast.NodeTransformer, por ejemplo, si desea acceder a la cadena, implemente el método visit_Str, si desea acceder a Importar, implemente el método visit_ImportFrom. En el método de implementación, puede usar algunos algoritmos de ofuscación para ofuscar (tenga en cuenta que solo puede ofuscarse, no cambiar el resultado). De esta manera, se puede lograr un refinamiento y una confusión más complicada.

Hay una biblioteca de ofuscación de terceros ASTObfuscate que ofusca el código al operar AST, pero no hay ofuscación del flujo lógico del programa. Para lograr una ofuscación más complicada del flujo de control, el árbol de análisis debe estar completamente implementado.

Por supuesto, si la ofuscación del código de Python es más difícil, debe ser a través de la ofuscación del código de bytes, o haciendo que el código de la llave se convierta en un archivo, lo que es más difícil de ofuscar. Tanto el bytecode como los archivos son instrucciones de ensamblaje.


Si quieres aprender Python o estás aprendiendo Python, hay muchos tutoriales de Python, pero ¿es el último? Tal vez haya aprendido algo que la gente podría haber aprendido hace dos años, y aquí comparto una ola de los últimos tutoriales de Python para 2020. ¡Cómo obtenerlo, puede obtenerlo gratis editando la "Información" de la carta privada!

 

Supongo que te gusta

Origin www.cnblogs.com/python0921/p/12694280.html
Recomendado
Clasificación