Introduccion
Esta publicación tiene como objetivo estudiar algunas técnicas de ingeniería inversa. Todos los materiales se presentan solo con fines informativos y no están destinados a ser utilizados para ningún beneficio personal.
Sujeto de investigación
Como ejemplo, estudiaremos el código de documentación de Atomineer Pro (en adelante APD). Este es un complemento para Visual Studio diseñado para generar automáticamente comentarios en los códigos fuente. Primero, instale este complemento y verifique su funcionamiento. La versión gratuita tiene un período de prueba y una serie de restricciones de uso durante este tiempo. Entonces, al agregar comentarios al archivo, el usuario recibe un mensaje que indica que durante el día puede procesar solo 10 archivos
Cuando intenta procesar todo el proyecto, la utilidad muestra un cuadro de diálogo que le advierte que este comando no está disponible.
Empecemos
Primero, busque en el directorio de la extensión instalada y encuentre solo una biblioteca dinámica. Lo necesitamos Lo primero que haremos es subirlo al descompilador dotPeek desde JetBrains.
Como puede ver en la pantalla, la biblioteca pasó por un ofuscador, las variables y los métodos fueron renombrados y tienen nombres como a, b, c, d ... esto es lo que necesitamos. Estábamos buscando eso. Veamos que se puede hacer.
Parte 1
Lo primero que viene a la mente es encontrar la línea, pero dado que la funcionalidad de búsqueda no está en dotPeek, vamos por un camino diferente. Descompilamos la biblioteca con el
ildasm.exe estándar de los SDK de Microsoft. La salida recibirá solo un archivo de texto. En él, busque el mensaje de texto "
Modo de prueba". Tenga en cuenta que su ... "
Encontrado un método
.method family hidebysig static bool e () cil administrado
Que pertenece a la clase CmdDocThisScope. Ahora volvamos a dotPeek.
Entonces lo que tenemos. Encontramos un método que muestra un mensaje de prueba APD y, dependiendo de la condición, devuelve verdadero o falso. Encontramos todos los lugares desde los cuales se llama este método
Solo se encontraron 2 puntos de llamada y estos son los métodos CmdDocThisFile :: c y CmdDocThisScope :: c.
Por el nombre de las clases y el código del constructor, es obvio que las clases son responsables de los elementos del menú, y la virtualidad del método "c" indica que este es el controlador de eventos para que el usuario seleccione el elemento del menú correspondiente (esta información nos será de utilidad). Es fácil adivinar que si el método devuelve verdadero, el comando se ejecutará aunque muestre un cuadro de diálogo con una advertencia.
Al comienzo del método CmdDocThisScope :: e, la variable f se incrementa. Abra la ventana "Vista IL" y busque el código de comando:
Wikipedia tiene un artículo que
describe estas instrucciones .
Luego, encuentre este método en el archivo de la biblioteca APD. Haremos esto usando la herramienta IDA. En la ventana con las funciones encontraremos nuestro método, y veremos el código ya familiar.
Una vez seleccionada la instrucción ldsfld, encontramos su representación binaria en la ventana de Vista Hex.
La descripción del equipo confirma que hemos encontrado el lugar correcto.
Un análisis más detallado del código para este método y los pasos posteriores están más allá del alcance de este artículo.
Parte 2
Ahora, como investigadores ya experimentados, encontramos una llamada al diálogo con el mensaje "
El comando 'Documentar todo en el proyecto' solo está disponible en la versión completa ... ". Este método es CmdDocThisProject :: c
La clase CmdDocThisProject es responsable del comando "Proyecto de proceso", el método "c" es virtual. Y contiene solo una cosa: es una llamada al diálogo con un mensaje. Sin condiciones, sin controles. La búsqueda del código fuente nos lleva al método CmdDocThisProject :: i, que tiene lo que esperamos en CmdDocThisProject :: c. Ahora en IDA podemos encontrar fácilmente los métodos necesarios y podemos aprender las instrucciones de CIL
Conclusión
Queda por decir que el artículo dejó deliberadamente puntos blancos para su estudio independiente.