Статус: | В разработке |
Расположение: | https://github.com/bdcht/ccrawl |
Версия: | 1.х |
Док: | http://ccrawl.readthedocs.io/en/latest/index.html |
Ccrawl использует clang для создания базы данных, связанной с различными структурами данных C/C++ (структура, объединение, класс, перечисление, typedef, прототипы и макросы), что позволяет идентифицировать типы данных и константы/макросы, запрашивая эту базу данных для определенных свойств, включая свойства. связанный с расположением памяти структуры/класса.
По сути, это позволяет, например,
Затем Ccrawl позволяет выводить найденные структуры во многих форматах: конечно, C/C++, а также ctypes или amoco. Вывод ctypes класса C++ соответствует макету экземпляра (объекта) в памяти, включая все указатели виртуальных таблиц (или VTT), которые возникают в результате, возможно, нескольких родительских (возможно, виртуальных) классов.
Наконец, Ccrawl позволяет вычислять различную статистику об API библиотеки и позволяет вычислять граф зависимостей любого заданного типа, например (см. тесты/образцы/xxx/graph.h):
Пользовательскую документацию и API можно найти по адресу http://ccrawl.readthedocs.io/en/latest/index.html.
Рассмотрим следующую структуру C из файла sample/simple.h.
структура S { символ с; интервал н; союз { беззнаковый символ x[2]; беззнаковое короткое s; } ты; char (*PtrCharArrayOf3[2])[3]; пустота (*pfunc)(интервал, интервал); };
Сначала соберите определение структуры в локальной базе данных:
$ ccrawl -l test.db -g 'test0' собрать образцы/simple.h [100%] simple.h [ 2] -------------------------------------------------- ------------------ сохранение базы данных... [ 2]
Затем можно перевести полную структуру в ctypes
$ ccrawl -l test.db show -r -f ctypes 'struct S' struct_S = тип('struct_S',(Структура,),{}) Union_b0eccf67 = тип('union_b0eccf67',(Union,),{}) Union_b0eccf67._fields_ = [("x", c_ubyte*2), ("s", c_ushort)] struct_S._anonymous_ = ("u",) struct_S._fields_ = [("c", c_byte), ("н", c_int), ("у", Union_b0eccf67), ("PtrCharArrayOf3", POINTER(c_byte*3)*2), ("pfunc", POINTER(CFUNCTYPE(Нет, c_int, c_int)))]
Или просто вычислить смещения полей
$ ccrawl -l test.db info 'struct S' идентификатор: структура S класс: cStruct источник: simple.h тег: test0 размер: 40 смещения: [(0, 1), (4, 4), (8, 2), (16, 16), (32, 8)]
Теперь давайте разберемся с более сложным примером C++:
$ ccrawl -l test.db Collect -a --cxx sample/shahar.cpp [100%] shahar.cpp [ 18] -------------------------------------------------- ------------------ сохранение базы данных... [ 18]
Мы можем показать полное (рекурсивное) определение класса:
$ ccrawl -l test.db show -r 'дочерний класс' класс Дедушка { публика: виртуальная пустота grandparent_foo(); интервал grandparent_data; }; класс Parent1: виртуальный публичный дедушка { публика: виртуальная пустота родитель1_foo(); интервал родитель1_данные; }; класс Parent2: виртуальный публичный дедушка { публика: виртуальная пустота родитель2_foo(); интервал родительских2_данных; }; класс Child: public Parent1, public Parent2 { публика: виртуальная пустота child_foo(); интервал дочерних_данных; };
И его расположение памяти ctypes:
$ ccrawl -l test.db show -f ctypes 'дочерний класс' struct___layout$Child = type('struct___layout$Child',(Structure,),{}) struct___layout$Child._fields_ = [("__vptr$Parent1", c_void_p), («parent1_data», c_int), ("__vptr$Parent2", c_void_p), («parent2_data», c_int), («детские_данные», c_int), ("__vptr$Дедушка", c_void_p), («grandparent_data», c_int)]
Дополнительные примеры см. в документации.