상태: | 개발중 |
위치: | https://github.com/bdcht/ccrawl |
버전: | 1.x |
의사: | http://ccrawl.readthedocs.io/en/latest/index.html |
Ccrawl은 clang을 사용하여 속성을 포함한 특정 속성에 대해 이 데이터베이스를 쿼리하여 데이터 유형 및 상수/매크로를 식별할 수 있는 다양한 C/C++ 데이터 구조(구조체, 공용체, 클래스, 열거형, typedef, 프로토타입 및 매크로)와 관련된 데이터베이스를 구축합니다. 구조체/클래스 메모리 레이아웃과 관련됩니다.
기본적으로 예를 들어
그런 다음 Ccrawl을 사용하면 발견된 구조를 C/C++뿐만 아니라 ctypes 또는 amoco와 같은 다양한 형식으로 출력할 수 있습니다. C++ 클래스의 ctypes 출력은 여러 부모(가상) 클래스의 결과인 모든 가상 테이블 포인터(또는 VTT)를 포함하여 메모리의 인스턴스(객체) 레이아웃에 해당합니다.
마지막으로 Ccrawl을 사용하면 라이브러리 API에 대한 다양한 통계를 계산할 수 있으며 예를 들어 다음과 같이 특정 유형의 종속성 그래프를 계산할 수 있습니다(tests/samples/xxx/graph.h 참조).
사용자 문서와 API는 http://ccrawl.readthedocs.io/en/latest/index.html에서 찾을 수 있습니다.
샘플/simple.h 파일에서 다음 C 구조체를 고려하세요.
구조체 S { 문자 C; int n; 노동조합 { 부호 없는 문자 x[2]; 부호 없는 짧은 s; } 당신; char(*PtrCharArrayOf3[2])[3]; void (*pfunc)(int, int); };
먼저 로컬 데이터베이스에서 구조 정의를 수집합니다.
$ ccrawl -l test.db -g 'test0' 샘플 수집/simple.h [100%] 단순.h [ 2] ------------------------------------- ------------------ 데이터베이스를 저장하는 중... [ 2]
그런 다음 ctypes의 전체 구조를 변환하는 것이 가능합니다.
$ ccrawl -l test.db show -r -f ctypes 'struct S' struct_S = type('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), ("n", c_int), ("u", Union_b0eccf67), ("PtrCharArrayOf3", 포인터(c_byte*3)*2), ("pfunc", POINTER(CFUNCTYPE(없음, c_int, c_int)))]
또는 단순히 필드 오프셋을 계산하기 위해
$ ccrawl -l test.db 정보 '구조체 S' 식별자: 구조체 S 클래스 : cStruct 출처 : simple.h 태그 : 테스트0 사이즈 : 40 오프셋 : [(0, 1), (4, 4), (8, 2), (16, 16), (32, 8)]
이제 좀 더 까다로운 C++ 예제를 다루겠습니다.
$ ccrawl -l test.db 수집 -a --cxx 샘플/shahar.cpp [100%] shahar.cpp [ 18] ------------------------------------- ------------------ 데이터베이스를 저장하는 중... [ 18]
클래스의 전체 (재귀) 정의를 표시할 수 있습니다.
$ ccrawl -l test.db show -r '클래스 하위' 클래스 조부모 { 공공의: 가상 무효 grandparent_foo(); int grandparent_data; }; 클래스 Parent1 : 가상 공개 조부모 { 공공의: 가상 무효 parent1_foo(); int parent1_data; }; 클래스 Parent2 : 가상 공개 조부모 { 공공의: 가상 무효 parent2_foo(); int parent2_data; }; 클래스 하위 : public Parent1, public Parent2 { 공공의: 가상 무효 child_foo(); int child_data; };
그리고 ctypes 메모리 레이아웃은 다음과 같습니다.
$ ccrawl -l test.db show -f ctypes '클래스 하위' struct___layout$Child = type('struct___layout$Child',(구조,),{}) struct___layout$Child._fields_ = [("__vptr$Parent1", c_void_p), ("parent1_data", c_int), ("__vptr$Parent2", c_void_p), ("parent2_data", c_int), ("child_data", c_int), ("__vptr$Grandparent", c_void_p), ("grandparent_data", c_int)]
더 많은 예제는 설명서를 참조하세요.