Estoy intentando construir un gráfico de flujo de control de los resultados del ensamblado que se devuelven mediante una llamada a objdump -d. Actualmente, el mejor método que he encontrado es colocar cada línea del resultado en una lista vinculada, y separar la dirección de memoria, el código de operación y los operandos para cada línea. Los estoy separando confiando en la naturaleza regular de los resultados objdump (la dirección de memoria va desde el carácter 2 hasta el carácter 7 en la cadena que representa cada línea).Elaboración de un gráfico de flujo de control utilizando los resultados de Objdump
Una vez hecho esto, comienzo la instrucción CFG real. Cada nodo en el CFG contiene una dirección de memoria de inicio y finalización, un puntero al bloque básico anterior y apunta a cualquier bloque básico de elementos secundarios. Luego reviso los resultados objdump y comparo el opcode con una matriz de todos los códigos de operación de flujo de control en x86_64. Si el código de operación es uno de flujo de control, registro la dirección como el final del bloque básico y, dependiendo del código de operación, agrego dos punteros secundarios (código de operación condicional) o uno (llamada o devolución).
Estoy en proceso de implementar esto en C, y parece que funcionará, pero se siente muy tenue. ¿Alguien tiene alguna sugerencia o algo que no esté teniendo en cuenta?
¡Gracias por tomarse el tiempo para leer esto!
edición:
La idea es utilizarlo para comparar trazas de la pila de llamadas de sistema generadas por DynamoRIO en contra de la esperada para un CFG binaria objetivo, espero que la construcción de ésta como esto facilitará que. No he reutilizado lo que está disponible porque A) Realmente no lo había pensado y B) Necesito que el gráfico se convierta en una estructura de datos utilizable para que pueda hacer comparaciones de rutas. Voy a echar un vistazo a algunas de las utilidades en la página que alineaste, gracias por apuntarme en la dirección correcta. Gracias por sus comentarios, ¡realmente lo aprecio!
Suena como un enfoque general plausible. Es posible que desee pensar qué hacer cuando vea una llamada indirecta. Además, usted dice que las instrucciones de devolución tendrán un sucesor, ¿qué sucedería exactamente para una función con varias personas que llaman? Las llamadas y devoluciones a menudo no se incluyen en CFG (como LLVM IR). La respuesta "correcta" depende de lo que planeas hacer con el CFG después de haberlo creado. –
Enfoque interesante. Hay varias herramientas (Ver http://en.wikipedia.org/wiki/Call_graph) que se pueden usar para crear CFG a partir del código fuente. ¿Hay alguna razón específica por la que desee adoptar este enfoque en lugar de reutilizar lo que está disponible? – Sudhanshu
¿cómo estás resolviendo punteros a las funciones? También estoy escribiendo un tipo de programa similar, pero aún me pregunto cómo resolveré los indicadores de función. – prap19