2010-11-23 24 views
6

lo siento - código fuente en C++ puede ser visto como la implementación de un diseño, y con ingeniería inversa me refiero a conseguir el diseño trasero. Parece que la mayoría de ustedes lo han leído como fuente de C++ a partir de binarios. He publicado una pregunta más precisa en Understanding a C++ codebase by generating UML - tools&methologyingeniería inversa C++ - mejores herramientas y el enfoque


Creo que hay muchas herramientas que pueden realizar ingeniería inversa de C++ (código fuente), pero por lo general no es tan fácil de hacer sentido de lo que se obtiene.

¿Alguien ha encontrado una buena metodología?

Creo que una de las cosas que podría querer ver, por ejemplo, es la capa GUI y cómo está separada (o no del resto). Piensa que las herramientas deberían detectar paquetes de alguna manera y luego déjame organizarlo manualmente.

+0

Si tiene el código fuente, lo que es exactamente lo que significa, en primer lugar por "ingeniería inversa" ing? – SingleNegationElimination

+0

¿Espera que un difusor o descompilador detecte paquetes, extraiga elementos de la interfaz de usuario de un código que no sea de la interfaz de usuario, o algo parecido a eso? – Falmarri

Respuesta

8

Que yo sepa, no hay herramientas confiables que puedan realizar ingeniería inversa en C++ compilado.

Por otra parte, creo que debería ser casi imposible construir un dispositivo de este tipo. Un programa compilado de C++ se convierte en nada más que instrucciones de lenguaje de máquina. Para saber cómo se correlaciona con las construcciones de C++, debe conocer el compilador, la configuración del compilador, las bibliotecas incluidas, etc. ad infinitum.

¿Por qué quieres algo así? Dependiendo de lo que desee, puede haber otras formas de lograr lo que realmente desea.

+1

Tampoco es una biyección, incluso teniendo en cuenta que los datos del compilador: por el momento se han inline algunas llamadas plantilla de función, una instancia con diferentes tipos, es imposible saber, y puede ser extremadamente difícil de adivinar, que en realidad todos ellos procedentes de la misma plantilla en primer lugar. A menos que el binario tenga información de depuración, por supuesto. –

+0

Bastante de acuerdo: no se puede aplicar ingeniería inversa de forma realista a C++. – Puppy

+0

Ustedes están asumiendo que el objetivo es restaurar el código fuente original. Es hipotéticamente posible recuperar algo funcionalmente equivalente (incluso si esto significa que las instancias de plantilla se verán como tipos y funciones independientes). Sin embargo, no existe una herramienta que lo haga bien en este momento. –

3

Puede tirar de flujo de control con dissembly pero nunca se podrá obtener tipos de datos de vuelta ...

No son sólo números enteros (y tal vez algunos cortos) en el montaje. ¡Piense en objetos, matrices, estructuras, cadenas y aritmética de punteros, todos del mismo tipo!

+3

"nunca volverás a tener tipos de datos" - Me pregunto. Los vtables pueden ser bastante reconocibles, y probablemente todo lo que tenga enlaces externos tendrá nombres que pueden exigirse. Es posible que pueda calcular una cantidad razonable de muchas clases, pero lo que no puede hacer es encontrar todas las llamadas a esa clase, ya que, en general, algunas estarán en línea. –

+1

@Steve: los nombres no están allí. Todo lo que queda son direcciones de memoria. –

+0

@Steve Jessop: las funciones en línea no son realmente un problema, eso solo aparecerá para el "descompilador" como funciones múltiples con código repetido. Seguro que no se parecerá a la fuente original, pero puede ser funcionalmente equivalente con lo que realmente importa para la ingeniería inversa. –

3

Si bien no es una solución completa. Debería mirar en IDA Pro y Hexrays.

Es más para "ingeniería inversa" en el sentido tradicional de la frase. Al igual que en, le dará una buena idea de cómo se vería el código en un lenguaje similar a C, pero no proporcionará (no puede) un código fuente completamente funcional.

Lo que es bueno para, es obtener una buena comprensión de cómo funciona un segmento en particular (generalmente una función). Es "asistido por el usuario", lo que significa que a menudo hará una gran cantidad de desreferencias de compensaciones cuando realmente hay una estructura o clase. En ese momento, puede suministrar al descompilador una definición de estructura (las clases son en realidad estructuras con elementos adicionales como v-tables y demás) y volverá a analizar el código con la nueva información de tipo.

Como dije, no es perfecto, pero si quieres hacer "ingeniería inversa" es la mejor solución que conozco. Si quiere una "descompilación" completa, entonces no tiene suerte.

0

El proyecto OovAide en http://sourceforge.net/projects/oovaide/ o en github tiene algunas características que pueden ayudar. Utiliza el compilador CLang para recuperar información precisa del código fuente. Escanea los directorios buscando el código fuente y recopila la información en , un conjunto de datos más pequeño que contiene la información necesaria para el análisis.

Un concepto se llama Diagramas de zona.Muestra las relaciones entre las clases en un nivel muy alto ya que cada clase se muestra como un punto en el diagrama, y ​​las líneas de relación se muestran conectándolas. Esto permite que los diagramas muestren cientos o miles de clases. La visualización del diagrama de zonas del programa OovAide tiene una opción llamada "Mostrar zonas secundarias", , que agrupa las clases que se encuentran dentro de directorios más cercanos entre sí. También hay filtros de directorio, que permiten reducir el número de clases que se muestran en un diagrama para proyectos muy grandes. se muestra un ejemplo de diagramas de zona y cómo funcionan aquí: http://oovaide.sourceforge.net/articles/ZoneDiagrams.html

Si los directorios se asignan tipos de componentes en la configuración de generación, a continuación, el diagrama de componentes se muestran las dependencias entre los componentes. Este incluso muestra qué componentes dependen de componentes externos como GTK u otras bibliotecas externas.

El siguiente nivel hacia abajo muestra algo así como diagramas de clase UML, pero muestra todas las relaciones en lugar de simplemente la agregación y la herencia. Puede mostrar las clases que se usan en los métodos, o las clases que se pasan como parámetros a los métodos. Cualquier clase puede ser elegido como punto de partida, a continuación, antes de se añade una clase el diagrama, se muestra una lista que permite la visualización qué clases se mostrarán por un tipo de relación.

El nivel más bajo muestra diagramas de secuencia. Esto permite navegar hacia arriba o hacia abajo el árbol de llamadas mientras se muestran las clases que contienen los métodos.

Cuestiones relacionadas