| Статус: | В разработке |
| Расположение: | 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)]
Дополнительные примеры см. в документации.