Binaries (GTIRB)에 대한 Grammatech 중간 표현은 기계 코드 분석 및 데이터 구조를 다시 작성합니다. 이진 분해, 분석, 변환 및 예쁜 인쇄를 수행하는 프로그램 간의 이진 IR의 통신을 용이하게하기위한 것입니다. GTIRB는 LLVM-IR에서 모델링되었으며 도구 간의 의사 소통과 상호 운용성을 장려하는 유사한 기능을 제공하고자합니다.
이 파일의 나머지 부분은 GTIRB의 다양한 측면을 설명합니다.
GTIRB는 다음과 같은 구조를 가지고 있습니다. 실선은 상속을 나타냅니다. 점선은 UUID의 기준을 나타냅니다.
GTIRB의 인스턴스에는 실행 파일 또는 라이브러리와 같은로드 가능한 객체, IPCFG ( IPCFG ) 및 AuxData ( AuxData )를 나타내는 여러 모듈 ( Module )이 포함될 수 있으며, 이는 IR의 다른 요소를 쉽게 참조 할 수있는 사용자 정의 형식에서 중재 분석 결과를 유지할 수있는 보조 데이터 테이블 (AuxData)이 포함될 수 있습니다. 각 모듈에는 기호 ( Symbol ) 및 섹션 자체가 실제 바이트와 데이터 및 모듈의 코드 블록을 담고있는 섹션과 같은 정보를 보유합니다. CFG는 기본 블록 ( Block ) 및이 블록 사이의 제어 흐름 가장자리로 구성됩니다. 각 데이터 또는 코드 블록은 바이트 간격 ( ByteInterval interval)의 바이트 범위를 참조합니다. 섹션은 모든 블록을 보유하는 하나의 큰 바이트 간격을 보유 할 수 있습니다 ( .text 섹션의 블록의 상대 위치가 정의 된 경우 블록 당 하나의 바이트 간격을 보유 할 수 있습니다. 각 기호에는 참조 된 블록 또는 데이텀에 대한 포인터가 있습니다.
GTIRB는 명시 적으로 지시 나 지시 의미를 나타내지 않지만 상징적 인 피연산자 정보를 제공하고 바이트에 대한 액세스를 제공합니다. 교육 시맨틱 (예 : Bap 's Bil, Angr's Vex 또는 Ghidra의 P 코드)을 표현하기위한 많은 중간 언어 (IL)가 있습니다. GTIRB는 일반적으로 그리고 효율적으로 원시 기계 코드 바이트 로 저장하고 기호 및 제어 흐름 정보를 별도로 저장하여 이들 또는 다른 IL과 협력합니다. 인기있는 Capstone/Keystone 디코더/엔코더는 특정 시맨틱 IL에 커밋하지 않고 GTIRB의 머신 코드 바이트 표현에서 지침을 읽고 쓸 수있는 훌륭한 옵션을 제공합니다. 여러 IL을 지원하고 분석의 별도의 저장을 지원함으로써 보조 데이터 테이블에서 GTIRB는 독립적 인 이진 분석과 다시 쓰기 팀과 도구 간의 협력을 가능하게합니다.
GTIRB는 추가 정보 공유, 예를 들어 분석 결과, AuxData 객체의 형태로 제공합니다. 이들은 기본 GTIRB 유형의 맵과 벡터를 휴대용 방식으로 저장할 수 있습니다. GTIRB 매뉴얼은 기능 경계 정보, 유형 정보 또는 표준 auxData 스키마의 일반적인 분석 결과와 같은 일반적인 유형의 보조 데이터에 대한 구조를 설명합니다.
GTIRB --- 예를 들어, 모듈 ( Module ), 기호 ( Symbol ) 및 블록 ( Block )의 모든 요소는 UUID (Universally Cight Identifier)가 있습니다. UUID는 일류 IR 구성 요소와 AuxData 테이블이 모두 IR의 요소를 참조 할 수 있도록 허용합니다.
명령 및 기호 피연산자는 클래스 Offset 으로 해결 될 수 있으며 UUID (명령어 블록을 참조) 및 오프셋을 캡슐화합니다.
Windows에서 GTIRB (및 DDisasm Disassembler 및 GTIRB-Pprinter Pretty Pretty Pretty Pretty Pretty Pretty를 포함한 승무원 툴링) 및 Ubuntu 20을 쉽게 설치하기 위해 패키지가 있습니다. 지침은 아래를 참조하십시오. 또한 공개 도커 이미지는 이러한 모든 도구가 설치된 Grammatech/DDisasm에 존재합니다. GTIRB는 major.minor.minor.patch 버전으로 버전을 사용하여 주요 버전 증분이 상당한 소스 변경이 필요하지만 매우 희귀 해야하는 경우 사소한 버전 증분에는 작은 소스 변경이 필요할 수 있으며 패치 버전 증분은 다운 스트림 빌드를 중단하지 않아야합니다. 우리는 아직 버전 변경에서 ABI 호환성을 제공하지 않습니다.
최신 안정적인 GTIRB Python API는 PIP를 사용하여 PYPI에서 설치할 수 있습니다.
pip install gtirbPython API의 최신 불안정한 버전은 사전 빌드 휠에서 설치할 수 있습니다.
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl stable 또는 unstable 패키지의 선택은 설치된 DDisasm 및 GTIRB-PPRING 패키지와 일치하는 것이 중요합니다.
Windows 릴리스는 .zip 파일로 포장되어 있으며 https://download.grammatech.com/gtirb/files/windows-release/에서 사용할 수 있습니다.
Ubuntu 20의 패키지는 GTIRB APT 저장소에서 제공되며 다음 지침에 따라 설치 될 수 있습니다.
먼저 Grammatech의 적절한 키를 추가하십시오.
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -다음으로 소스를 업데이트하십시오.
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.list어디:
[distribution] 는 focal 입니다 (현재 Ubuntu 20 패키지 만 사용할 수 있습니다)[component] 는 stable 이며 마지막 버전의 릴리스를 보유하거나 저장소의 헤드를 보유하는 unstable 입니다.마지막으로 패키지 데이터베이스를 업데이트하고 핵심 GTIRB 도구를 설치하십시오.
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm 경고 : 안정적인 버전 GTIRB-2.0.0, GTIRB-Pprinter-2.1.0, DDisasm-1.8.0 이상은 apt-get upgrade 시도 할 때 충돌을 일으키는 Metapackages에 의존합니다 ( #63 참조). 이 경우 GTIRB 저장소에서 얻은 패키지를 제거하고 다시 설치하십시오. 콘크리트 버전 패키지 (예 : ddisasm-1.5.1 )를 제거하기 전에 Metapackages (예 : ddisasm )를 제거하기 위해 dpkg --remove 사용해야 할 수도 있습니다. 최신 안정 버전은 더 이상 Metapackages에 의존하지 않으며 문제없이 업그레이드 할 수 있습니다.
GTIRB의 C ++ API는 최소한 C ++ 17을 지원하는 GCC, Clang 및 Visual Studio 컴파일러로 64 비트로 성공적으로 구축해야합니다. GTIRB는 CMAKE를 사용하여 최소 3.10 버전으로 설치해야합니다.
일반적인 빌드 프로세스는 다음과 같습니다.
mkdir build
cd build
# Note: You may wish to add some -D arguments to the next command. See below.
cmake < path/to/gtirb >
cmake --build .
# Run the test suite.
ctestGTIRB 빌드를 사용자 정의하려면 빌드 디렉토리로 탐색하고 실행하여 사용자 정의 옵션 목록을 얻을 수 있습니다.
cmake -LHGTIRB를 구축하고 설치하려면 다음 요구 사항을 설치해야합니다.
cmake 통해이 버전을 제공합니다.libprotobuf-dev 및 protobuf-compiler 통해이 버전을 제공합니다.GTIRB는 Google 프로토콜 버퍼 (예 : Protobuf)를 사용하여 직렬화되도록 설계되어 모든 프로그래밍 언어에서 쉽고 효율적인 사용을 가능하게합니다.
GTIRB는 여러 언어로 구현 된 전용 API를 통해 사용될 수 있습니다. API는 이진 분석 및 재 작성 응용 프로그램에 사용하기에 적합한 효율적인 데이터 구조를 제공합니다. 자세한 내용은 아래를 참조하십시오.
GTIRB는 8 바이트 시그니처와 직렬화 된 protobuf 데이터로 구성된 직렬화 된 형식을 사용합니다. Protobuf 데이터는 선택한 언어로 탐색 및 조작을 허용합니다. Google 프로토콜 버퍼 홈페이지는 프로토콜 버퍼를 직접 사용할 수있는 언어를 나열합니다. 다른 언어 사용자는 Protobuf 형식 데이터를 JSON 형식으로 변환 한 다음 응용 프로그램에서 JSON 데이터를 사용할 수 있습니다.
이 저장소의 proto 디렉토리에는 GTIRB의 프로토콜 버퍼 메시지 유형 정의가 포함되어 있습니다. 이 .proto 파일을 검사하여 다양한 GTIRB 메시지 유형의 구조를 결정할 수 있습니다. 최상위 메시지 유형은 IR 입니다.
자세한 내용은 직렬화 된 GTIRB 데이터 사용을 참조하십시오.
GTIRB API는 현재 C ++, Python 및 Common LISP로 제공됩니다. 외부 용도로 사용할 준비가되지 않은 부분 Java API가 있습니다. 언어 독립적 인 API 정보는 GTIRB 구성 요소를 참조하십시오. 다양한 API 구현에 대한 자세한 내용은 다음을 참조하십시오.