2011-01-12 11 views
8

Estoy escribiendo un script para el desensamblador IDA Pro en Python usando el plugin idapython. Usando esto, puedo llenar los vacíos donde el autoanálisis de IDA se queda corto.C++ nombre mangling a mano

Un área que me ha dejado perplejo es nombrar ubicaciones/funciones con (a falta de un mejor término) "nombres bonitos". Un ejemplo de lo que quiero decir se ilustra a continuación:

IDA pretty names sample screenshot

idapython e IDA Pro en sí sólo me permite entrar nombres básicas de la función C-ish. Si ingreso símbolos no permitidos (por ejemplo, el operador de resolución del alcance), se reemplazan con guiones bajos. Sin embargo,, si ingreso un nombre destruido a mano (por ejemplo, __ZN9IOService15powerChangeDoneEm), IDA Pro será pretifique esto por mí.

De ahí mi pregunta: ¿cómo puedo generar nombres destrozados para pasar por idapython? ¿Hay una biblioteca de creación de nombres disponible? ¿Hay uno disponible en Python? ¿Mi única esperanza es romper la funcionalidad de mapeo de g++ y solucionarlo?

+2

Yo espero que haya algún documento en torno a que usted podría mirar en ... buena suerte! –

Respuesta

6

Finalmente pude cavar un poco.

Lamentablemente no pude encontrar la herramienta, aunque sí encontré recursos.

Si todo lo que quiere es nombres de mangle en la moda gcc3, entonces sepa que gcc3 utiliza el Itanium C++ ABI, que tiene un esquema estandarizado de creación de nombres. He encontrado dos documentos:

Como referencia, ambos provienen de la página de Wikipedia sobre Name Mangling.

+0

@ShafikYaghmour: Gracias, lo he sustituido por un enlace a otro sitio web (linux-foundation.org). –

+0

Me encontré con su pregunta b/c de esta pregunta: http://stackoverflow.com/questions/11335624/what-is-linux-utility-to-mangle-a-c-symbol-name?lq=1 que es similar –

3

Un método simple (alebit hacky) sería compilar un archivo C++ con el símbolo que desea, y luego extraer los símbolos necesarios de la tabla de símbolos del archivo .o. Con un poco de trabajo esto podría ser muy fácil de escribir.

+0

Lo hice en mi primer programa C++, mientras estaba en la escuela secundaria. No sabía que no era santard ni nada más. Eso me ayudó a implementar un sistema modular, permitiendo que el software (juego) se extendiera fácilmente. Ni siquiera era consciente de que este tipo de cosas no eran triviales. – Klaim

1

Aquí hay un article que explica cómo se hace el mangle mediante el compilador Visual. Para el cambio realizado por gcc, creo que puede encontrar la información en el origen del paquete binutils.

Cuestiones relacionadas