Estado: | En desarrollo |
Ubicación: | https://github.com/bdcht/ccrawl |
Versión: | 1.x |
Doc: | http://ccrawl.readthedocs.io/en/latest/index.html |
Ccrawl usa clang para construir una base de datos relacionada con varias estructuras de datos C/C++ (estructura, unión, clase, enumeración, typedef, prototipos y macros) que permite identificar tipos de datos y constantes/macros consultando esta base de datos para propiedades específicas, incluidas propiedades. relacionado con el diseño de memoria de estructura/clase.
Básicamente permite, por ejemplo,
Ccrawl permite entonces generar estructuras encontradas en muchos formatos: C/C++ por supuesto, pero también ctypes o amoco. La salida de ctypes de una clase C++ corresponde a un diseño de instancia (objeto) en la memoria, incluidos todos los punteros de tabla virtual (o VTT) que resultan de posiblemente múltiples clases principales (posiblemente virtuales).
Finalmente, Ccrawl permite calcular varias estadísticas sobre una API de biblioteca y permite calcular el gráfico de dependencia de cualquier tipo dado, como por ejemplo (consulte tests/samples/xxx/graph.h):
La documentación del usuario y la API se pueden encontrar en http://ccrawl.readthedocs.io/en/latest/index.html
Considere la siguiente estructura C del archivo samples/simple.h
estructura S { carácter c; int n; unión { carácter sin firmar x[2]; s cortas sin firmar; } tu; char (*PtrCharArrayOf3[2])[3]; vacío (*pfunc)(int, int); };
Primero, recopile la definición de estructura en una base de datos local:
$ ccrawl -l test.db -g 'test0' recopilar muestras/simple.h [100%] simple.h [ 2] -------------------------------------------------- ------------------ guardando base de datos... [2]
Entonces, es posible traducir la estructura completa en ctypes.
$ ccrawl -l test.db show -r -f ctypes 'estructura S' struct_S = tipo('struct_S',(Estructura,),{}) union_b0eccf67 = tipo('union_b0eccf67',(Unión,),{}) union_b0eccf67._fields_ = [("x", c_ubyte*2), ("s", c_ushort)] struct_S._anonymous_ = ("u",) struct_S._fields_ = [("c", c_byte), ("n", c_int), ("u", unión_b0eccf67), ("PtrCharArrayOf3", PUNTERO(c_byte*3)*2), ("pfunc", PUNTERO(CFUNCTYPE(Ninguno, c_int, c_int)))]
O simplemente para calcular las compensaciones de los campos.
$ ccrawl -l test.db info 'estructura S' identificador: estructura S clase: cEstructura fuente: simple.h etiqueta: prueba0 tamaño : 40 compensaciones: [(0, 1), (4, 4), (8, 2), (16, 16), (32, 8)]
Ahora veamos un ejemplo de C++ más complicado:
$ ccrawl -l test.db recopilar -a --cxx muestras/shahar.cpp [100%] shahar.cpp [18] -------------------------------------------------- ------------------ guardando base de datos... [ 18]
Podemos mostrar una definición completa (recursiva) de una clase:
$ ccrawl -l test.db show -r 'clase Niño' clase abuelo { público: virtual vacío abuelo_foo(); int abuelo_datos; }; clase Padre1: abuelo público virtual { público: vacío virtual parent1_foo(); int padre1_datos; }; clase Padre2: abuelo público virtual { público: vacío virtual parent2_foo(); int padre2_datos; }; clase Niño: Padre público1, Padre público2 { público: vacío virtual child_foo(); int datos_niño; };
Y su diseño de memoria de tipos:
$ ccrawl -l test.db show -f ctypes 'clase Niño' struct___layout$Niño = tipo('struct___layout$Niño',(Estructura,),{}) struct___layout$Child._fields_ = [("__vptr$Parent1", c_void_p), ("parent1_data", c_int), ("__vptr$Parent2", c_void_p), ("parent2_data", c_int), ("datos_infantiles", c_int), ("__vptr$Abuelo", c_void_p), ("abuelo_datos", c_int)]
Consulte la documentación para ver más ejemplos.