WABT (“wabbit”으로 발음)는 참조 WebAssembly Binary Toolkit — wasm을 저수준에서 작업하기 위한 명령줄 도구 모음입니다. 바이너리 .wasm 형식과 인간이 읽을 수 있는 .wat 텍스트 형식 간에 변환하고, 모듈을 분석하고 덤프하고, 검증하고, C 같은 디컴파일을 생성하고, wasm을 해석/실행합니다. wasm 개발과 역공학 모두에 대한 기초 도구 상자입니다.
설치
| 플랫폼 | 명령어 |
|---|
| macOS (Homebrew) | brew install wabt |
| Debian/Ubuntu | sudo apt install wabt |
| Arch Linux | sudo pacman -S wabt |
| npm | npm install -g wabt |
| 소스에서 | WebAssembly/wabt 저장소에서 CMake로 빌드 |
| 확인 | wat2wasm --version |
핵심 도구
| 도구 | 변환 / 수행 |
|---|
wat2wasm | 텍스트 .wat → 바이너리 .wasm |
wasm2wat | 바이너리 .wasm → 텍스트 .wat (분석) |
wasm-objdump | 섹션, 옵코드, 심볼 덤프 |
wasm-decompile | 읽을 수 있는 C 같은 의사코드 생성 |
wasm-validate | 모듈 검증 |
wasm-interp | 모듈 해석/실행 (스택 머신) |
wasm2c | wasm → C 소스 변환 |
wasm-strip | 모듈에서 섹션 제거 (예: 이름) |
텍스트 ↔ 바이너리
# 텍스트를 바이너리로 어셈블
wat2wasm module.wat -o module.wasm
# 바이너리를 텍스트로 분석 (역공학 시작점)
wasm2wat module.wasm -o module.wat
# 분석 중 디버그 이름 / 사용자 정의 섹션 유지
wasm2wat --generate-names module.wasm
| 옵션 | 효과 |
|---|
-o FILE | 출력 파일 |
--generate-names | 이름 없는 함수/로컬에 대한 이름 합성 |
--enable-FEATURE | wasm 제안 켜기 (예: --enable-threads) |
-v | 상세 출력 |
모듈 검사 (objdump)
# 전체 섹션 + 분석 덤프
wasm-objdump -x module.wasm # 헤더/섹션
wasm-objdump -d module.wasm # 코드 분석
wasm-objdump -s module.wasm # 섹션 내용 (16진수)
| 플래그 | 표시 |
|---|
-h | 섹션 헤더 |
-x | 모든 섹션의 세부정보 |
-d | 분석된 함수 본문 |
-s | 원본 섹션 내용 |
-j SECTION | 하나의 섹션으로 제한 |
디컴파일 (읽을 수 있는 출력)
# C 같은 디컴파일 — WAT보다 읽기 훨씬 쉬움
wasm-decompile module.wasm -o module.dcmp
wasm-decompile은 구조화된 제어 흐름과 타입이 지정된 로컬을 재구성하여 분류 중에 모듈이 무엇을 하는지 빠르게 이해하는 방법입니다.
검증 및 실행
| 명령어 | 목적 |
|---|
wasm-validate module.wasm | 모듈이 올바르게 형성되었는지 확인 |
wasm-interp module.wasm --run-all-exports | 내보낸 함수 실행 |
wasm2c module.wasm -o module.c | 컴파일/분석을 위해 C를 내보냄 |
역공학 워크플로우
# 1) 이름을 지정하여 분석
wasm2wat --generate-names target.wasm -o target.wat
# 2) 기능을 이해하기 위해 가져오기/내보내기 덤프
wasm-objdump -x target.wasm | grep -E "import|export"
# 3) 읽을 수 있는 의사코드 얻기
wasm-decompile target.wasm -o target.dcmp
# 4) 데이터 섹션에서 문자열/URL 찾기
wasm-objdump -s target.wasm | less
기능 플래그 (제안)
| 플래그 | 활성화 |
|---|
--enable-threads | 스레드/원자성 |
--enable-simd | SIMD |
--enable-bulk-memory | 대량 메모리 연산 |
--enable-reference-types | 참조 타입 |
--enable-all | 지원되는 모든 제안 |
모듈이 더 최신 wasm 기능을 사용할 때 기본 도구가 이를 거부하는 경우 사용하세요.
WABT vs 관련 도구
| 도구 | 역할 |
|---|
| WABT | 변환/검사/검증/디컴파일 wasm |
| diswasm | 더 높은 수준의 의사코드 디컴파일러 |
| wasm-tools | Rust 저수준 조작 |
| Binaryen | 컴파일러/최적화 도구 모음 (wasm-dis, wasm-opt) |
자료