
Ghidra의 SLEIGH 프로세서 명세 라이브러리를 CMake로 빌드한 것으로, 리버스 엔지니어링 도구를 위한 독립 실행형 디스어셈블리 및 p-code 리프팅 엔진을 제공합니다.
Sleigh는 범용 마이크로프로세서의 명령어 집합의 의미를 기술하는 데 사용되는 언어로, 이러한 아키텍처용으로 컴파일된 소프트웨어의 리버스 엔지니어링을 용이하게 할 만큼 충분히 상세합니다. 이는 Ghidra 리버스 엔지니어링 플랫폼의 일부이며, 두 가지 주요 구성 요소인 디스어셈블리 및 디컴파일 엔진의 기반이 됩니다.
이 저장소는 Sleigh를 독립 실행형 라이브러리로 빌드하고 패키징하여 Ghidra 이외의 프로젝트에서 재사용할 수 있도록 CMake 기반 빌드 프로젝트를 제공합니다.
| 이름 | 지원 |
|---|---|
| Linux | 예 |
| macOS | 예 |
| Windows | 예 |
| 이름 | 버전 | 설치할 Linux 패키지 | 설치할 macOS Homebrew 패키지 |
|---|---|---|---|
| (HEAD 빌드) zlib | 최신 | zlib1g-dev | zlib |
| Git | 최신 | git | N/A |
| CMake | 3.18+ | cmake | cmake |
참고: 이 CMake 프로젝트는 구성 중에 인터넷에서 Ghidra 소스 코드를 가져옵니다. 자세한 내용은 Ghidra 소스 코드에 대한 참고 사항 섹션을 참조하세요.
문서 빌드용:
| 이름 | 버전 | 설치할 Linux 패키지 | 설치할 macOS Homebrew 패키지 |
|---|---|---|---|
| Doxygen | 최신 | doxygen | doxygen |
| GraphViz | 최신 | graphviz | graphviz |
# 이 저장소 복제 (sleigh용 CMake 프로젝트)
git clone https://github.com/lifting-bits/sleigh.git
cd sleigh
# CMake 구성
cmake -B build -S .
# Sleigh 빌드
cmake --build build --parallel 8
# Sleigh 설치
cmake --install build --prefix ./install
Ghidra 소스 코드는 실제로 이 git 저장소에 포함되어 있지 않으며, 기본적으로 CMake가 인터넷에서 안정적인 버전을 자동으로 가져옵니다.
사용/컴파일할 Ghidra 소스 코드 커밋을 사용자 지정하는 방법(자체 로컬 Ghidra 소스 사본 지정 포함)에 대한 자세한 내용은 src/README.md를 참조하세요.
CMake 구성은 Sleigh용 패키지 빌드도 지원합니다.
예:
# Sleigh 패키징
cmake --build build --target package
Sleigh API 사용 방법을 보여주기 위해 sleigh-lift라는 예제 프로그램이 포함되어 있습니다. 이 프로그램은 16진수 바이트 문자열을 입력받아 디스어셈블하거나 p-code로 리프트할 수 있습니다. 프로그램은 다음과 같이 호출할 수 있으며, action 인수는 disassemble 또는 pcode여야 합니다:
sleigh-lift [action] [sla_file] [bytes] [-a address] [-p root_sla_dir] [-s pspec_file]
예를 들어, 다음 바이트 문자열을 디스어셈블하려면:
$ sleigh-lift disassemble x86-64.sla 4881ecc00f0000
0x00000000: SUB RSP,0xfc0
그리고 이를 p-code로 리프트하려면:
$ sleigh-lift pcode x86-64.sla 4881ecc00f0000
(register,0x200,1) = INT_LESS (register,0x20,8) (const,0xfc0,8)
(register,0x20b,1) = INT_SBORROW (register,0x20,8) (const,0xfc0,8)
(register,0x20,8) = INT_SUB (register,0x20,8) (const,0xfc0,8)
(register,0x207,1) = INT_SLESS (register,0x20,8) (const,0x0,8)
(register,0x206,1) = INT_EQUAL (register,0x20,8) (const,0x0,8)
(unique,0x12c00,8) = INT_AND (register,0x20,8) (const,0xff,8)
(unique,0x12c80,1) = POPCOUNT (unique,0x12c00,8)
(unique,0x12d00,1) = INT_AND (unique,0x12c80,1) (const,0x1,1)
(register,0x202,1) = INT_EQUAL (unique,0x12d00,1) (const,0x0,1)
sleigh-lift를 빌드하지 않으려면 CMake 구성 중에 CMake 변수 sleigh_BUILD_EXTRATOOLS 옵션을 OFF로 설정해야 합니다.
이 저장소에는 Sleigh/Ghidra의 일부가 아닌 헬퍼가 support 디렉터리에 포함되어 있습니다. 이는 다음과 같은 시그니처를 가지며, 사용자가 시스템에서 주어진 스펙 파일의 위치를 찾는 데 도움을 줄 수 있습니다:
std::optional<std::filesystem::path>
FindSpecFile(std::string_view file_name,
const std::vector<std::filesystem::path> &search_paths =
gDefaultSearchPaths);
sleigh::FindSpecFile 함수는 사용자가 search_paths 인수를 통해 제공한 경로에서 file_name이라는 이름의 스펙 파일을 검색합니다. search_paths의 기본 인수는 sleigh::gDefaultSearchPaths이며, 이는 CMake 구성 중에 생성된 설치/빌드 디렉터리와 일반적인 설치 위치 집합을 포함합니다.
헬퍼를 빌드하지 않으려면 CMake 구성 중에 CMake 변수 sleigh_BUILD_SUPPORT 옵션을 OFF로 설정해야 합니다.
Sleigh 설치 시 프로젝트를 빌드할 때 사용할 수 있는 CMake 인터페이스를 제공합니다.
CMake 패키지 구성 파일을 사용하는 방법의 예는 find_package 예제에서 찾을 수 있습니다.
또한 sleigh 컴파일러를 사용하여 .slaspec 파일을 컴파일하는 CMake 헬퍼 함수 sleigh_compile도 제공합니다.
Sleigh 사양을 컴파일하는 더 복잡한 CMake 예제는 업스트림에서 제공하는 sleigh 예제 소스 코드를 사용하는 example 디렉터리에서 찾을 수 있습니다.
마지막으로, 설치된 컴파일된 sleigh 파일은 CMake 변수 sleigh_INSTALL_SPECDIR을 통해 찾을 수 있으며, 이는 컴파일된 sleigh 파일의 루트 디렉터리에 대한 절대 경로입니다---무엇을 예상해야 하는지 알기 위해 이를 수동으로 검사해야 합니다.
노출된 CMake 변수와 모듈에 대해 더 알아보려면 CMake 구성 파일과 specfiles CMake 파일을 참조하는 것도 권장합니다.
LICENSE 파일을 참조하세요.