
qiling v1.4.11
진정한 계측 가능한 바이너리 에뮬레이션 프레임워크
Qiling은 고급 바이너리 에뮬레이션 프레임워크로, 다음과 같은 기능을 제공합니다:
- 멀티 플랫폼 에뮬레이션: Windows, macOS, Linux, Android, BSD, UEFI, DOS, MBR.
- 멀티 아키텍처 에뮬레이션: 8086, X86, X86_64, ARM, ARM64, MIPS, RISC-V, PowerPC.
- 여러 파일 형식 지원: PE, Mach-O, ELF, COM, MBR.
- Demigod를 통한 Windows 드라이버(.sys), Linux 커널 모듈(.ko) 및 macOS 커널(.kext) 지원.
- 격리된 환경에서 코드 에뮬레이션 및 샌드박스 처리.
- 완전히 구성 가능한 샌드박스 제공.
- 심층적인 메모리, 레지스터, OS 수준 및 파일시스템 수준 API 제공.
- 정밀한 계측: 다양한 수준에서 후크 가능 (명령어/기본 블록/메모리 접근/예외/시스템 호출/IO 등).
- 현재 실행 상태를 저장 및 복원하는 가상 머신 수준의 API 제공.
- 크로스 아키텍처 및 플랫폼 디버깅 기능 지원.
- 역방향 디버깅 기능이 내장된 디버거.
- 실행 중인 코드(로드된 라이브러리 포함)에 동적 핫 패치 적용 가능.
- Python 기반의 진정한 프레임워크로, 그 위에 맞춤형 보안 분석 도구를 쉽게 구축 가능.
Qiling은 또한 다양한 국제 컨퍼런스에 소개되었습니다.
2022:
2021:
2020:
- 블랙햇, Europe
- 블랙햇, USA
- 블랙햇, USA (Demigod)
- 블랙햇, Asia
- Hack In The Box, Lockdown 001
- Hack In The Box, Lockdown 002
- Hack In The Box, Cyberweek
- Nullcon
2019:
Qiling은 Unicorn Engine을 기반으로 합니다.
자세한 내용은 웹사이트를 방문하세요.
라이선스
이 프로그램은 자유 소프트웨어입니다; 자유 소프트웨어 재단에서 발표한 GNU General Public License 버전 2 또는 (선택에 따라) 이후 버전의 조건에 따라 재배포 및/또는 수정할 수 있습니다.
Qiling vs. 다른 에뮬레이터
많은 오픈 소스 에뮬레이터가 있지만, Qiling에 가장 가까운 두 프로젝트는 Unicorn과 QEMU 사용자 모드입니다. 이 섹션에서는 Qiling과 이들 간의 주요 차이점을 설명합니다.
Qiling vs. Unicorn 엔진
Unicorn 위에 구축되었지만, Qiling과 Unicorn은 완전히 다른 개념입니다.
- Unicorn은 CPU 에뮬레이터일 뿐이므로 CPU 명령어 에뮬레이션에 초점을 맞추며, 에뮬레이터 메모리를 이해할 수 있습니다. 그 외에는 Unicorn이 동적 라이브러리, 시스템 호출, I/O 처리 또는 PE, Mach-O, ELF와 같은 실행 파일 형식과 같은 상위 수준 개념을 인식하지 못합니다. 결과적으로 Unicorn은 운영 체제(OS) 컨텍스트 없이 원시 기계 명령어만 에뮬레이션할 수 있습니다.
- Qiling은 더 높은 수준의 프레임워크로 설계되어 Unicorn을 활용하여 CPU 명령어를 에뮬레이션하지만 OS를 이해할 수 있습니다: 실행 파일 형식 로더(현재 PE, Mach-O, ELF용), 동적 링커(공유 라이브러리를 로드 및 재배치 가능), 시스템 호출 및 I/O 핸들러가 있습니다. 이러한 이유로 Qiling은 네이티브 OS 없이 실행 가능한 바이너리를 실행할 수 있습니다.
Qiling vs. QEMU 사용자 모드
QEMU 사용자 모드는 우리의 에뮬레이터와 유사한 작업, 즉 크로스 아키텍처 방식으로 전체 실행 가능한 바이너리를 에뮬레이션합니다. 그러나 Qiling은 QEMU 사용자 모드와 비교하여 몇 가지 중요한 차이점을 제공합니다:
- Qiling은 진정한 분석 프레임워크로, 그 위에 맞춤형 동적 분석 도구를 (Python으로) 구축할 수 있습니다. 반면 QEMU는 도구일 뿐 프레임워크가 아닙니다.
- Qiling은 동적 계측을 수행할 수 있으며, 심지어 런타임에 코드를 핫 패치할 수도 있습니다. QEMU는 둘 다 할 수 없습니다.
- 크로스 아키텍처뿐만 아니라 Qiling은 크로스 플랫폼이기도 합니다. 예를 들어, Windows 위에서 Linux ELF 파일을 실행할 수 있습니다. 반면 QEMU 사용자 모드는 에뮬레이션된 코드에서 네이티브 OS로 시스템 호출을 전달하는 방식 때문에 동일한 OS의 바이너리(예: Linux에서 Linux ELF)만 실행할 수 있습니다.
- Qiling은 Windows, macOS, Linux 및 BSD를 포함한 더 많은 플랫폼을 지원합니다. QEMU 사용자 모드는 Linux와 BSD만 처리할 수 있습니다.
설치
Qiling Framework 설치 방법은 설정 가이드 파일을 참조하세요.
예제
아래 예제는 Windows 실행 파일을 에뮬레이션하는 가장 간단한 방법으로 Qiling 프레임워크를 사용하는 방법을 보여줍니다.
from qiling import Qiling
if __name__ == "__main__":
# Qiling 인스턴스 초기화, 에뮬레이션할 실행 파일과 에뮬레이션된 시스템 루트 지정.
# 현재 작업 디렉토리는 Qiling 홈 디렉토리로 가정합니다.
ql = Qiling([r'examples/rootfs/x86_windows/bin/x86_hello.exe'], r'examples/rootfs/x86_windows')
# 에뮬레이션 시작
ql.run()
- 다음 예제는 Windows 크랙미(crackme)가 항상 "Congratulation" 대화상자를 표시하도록 동적으로 패치하는 방법을 보여줍니다.
from qiling import Qiling
def force_call_dialog_func(ql: Qiling):
# 현재 스택 프레임에서 DialogFunc 주소 가져오기
lpDialogFunc = ql.stack_read(-8)
# DialogFunc를 위한 스택 메모리 설정
ql.stack_push(0)
ql.stack_push(1001) # IDS_APPNAME
ql.stack_push(0x111) # WM_COMMAND
ql.stack_push(0)
# 리턴 주소 푸시
ql.stack_push(0x0401018)
# DialogFunc 주소에서 에뮬레이션 재개
ql.arch.regs.eip = lpDialogFunc
if __name__ == "__main__":
# Qiling 인스턴스 초기화
ql = Qiling([r'rootfs/x86_windows/bin/Easy_CrackMe.exe'], r'rootfs/x86_windows')
# 일부 코드를 NOP 처리
ql.patch(0x004010B5, b'\x90\x90')
ql.patch(0x004010CD, b'\x90\x90')
ql.patch(0x0040110B, b'\x90\x90')
ql.patch(0x00401112, b'\x90\x90')
# 콜백으로 특정 주소에 후크
ql.hook_address(force_call_dialog_func, 0x00401016)
ql.run()
아래 YouTube 동영상은 위 예제가 작동하는 방식을 보여줍니다.
Ubuntu x64 호스트에서 ARM 라우터 펌웨어 에뮬레이션
Qiling Framework는 ARM 라우터의 /usr/bin/httpd를 x86_64 Ubuntu 호스트에서 핫 패치하고 에뮬레이션합니다.
Qiling의 IDA Pro 플러그인: Mirai의 비밀 계측 및 복호화
이 동영상은 Qiling의 IDA Pro 플러그인이 IDA Pro를 Qiling 계측 엔진과 함께 실행할 수 있게 하는 방법을 보여줍니다.
IDA Pro 데모와 GDB 서버
Qiling Framework와 IDA Pro를 사용하여 간단한 CTF 챌린지 풀기
Solving a simple CTF challenge with Qiling Framework and IDA Pro
MBR 에뮬레이션
Qiling Framework가 MBR을 에뮬레이션합니다.
Qltool
Qiling은 또한 qltool이라는 친숙한 도구를 제공하여 셸코드 및 실행 가능한 바이너리를 빠르게 에뮬레이션할 수 있습니다.
qltool을 사용하면 간편하게 실행할 수 있습니다:
셸코드 사용:
$ ./qltool code --os linux --arch arm --format hex -f examples/shellcodes/linarm32_tcp_reverse_shell.hex
바이너리 파일 사용:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --rootfs examples/rootfs/x8664_linux/
GDB 디버거 활성화와 함께 바이너리 사용:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --gdb 127.0.0.1:9999 --rootfs examples/rootfs/x8664_linux
코드 커버리지 수집과 함께 사용 (현재는 UEFI만 지원):
$ ./qltool run -f examples/rootfs/x8664_efi/bin/TcgPlatformSetupPolicy --rootfs examples/rootfs/x8664_efi --coverage-format drcov --coverage-file TcgPlatformSetupPolicy.cov
JSON 출력과 함께 사용 (주로 Windows):
$ ./qltool run -f examples/rootfs/x86_windows/bin/x86_hello.exe --rootfs examples/rootfs/x86_windows/ --console False --json
연락처
웹사이트 https://www.qiling.io 에서 최신 정보를 확인하세요.
이메일 [email protected], Twitter @qiling_io를 통해 연락주세요.
핵심 개발자, 주요 기여자 등
CREDITS.md를 참조하세요.

