본 문서는 어셈블리어 단위 디버깅을 활용한 동적 암호화 스캐너를 구현하기 위한 아키텍처 제안과 현재 구현 현황을 정리한다. Windows, Linux, ARM/AMD/x86 등 다양한 환경을 지원하는 것을 목표로 한다.
-
공통
DebugSession인터페이스를Launch/Attach/resume/single_step/get_thread_registers등 아키텍처 중립 API로 확장하였다.- 레지스터 표현(
RegisterState)은 x86/x86-64/ARM/AArch64 구조체를 포함하도록 설계되었으며 현재는 Linux x86-64에서 완전 동작한다. - 소프트웨어 브레이크포인트는 원본 코드 바이트를 보존·복원하며 단일 스텝 후 재설치하는 루프를 제공한다.
- 원격 메모리 I/O(
read_memory/write_memory)가 단위 바이트 단위로 구현되어 코드/스택 스냅샷 확보가 가능하다.
- 레지스터 표현(
-
Linux
ptrace백엔드는 다음 기능을 지원한다.PTRACE_TRACEME/fork/execve를 통한 프로세스 실행, 혹은PTRACE_ATTACH기반 기존 프로세스 부착.waitpid(-1, __WALL)이벤트를ProcessStart/Breakpoint/SingleStep/Signal/ProcessExit로 변환한다.- 단일 스텝 중인지 추적하여
SIGTRAP을Breakpoint와SingleStep으로 구분한다. - 디버거 종료 시 모든 브레이크포인트를 원본 코드로 복원 후
SIGKILL또는PTRACE_DETACH로 정리한다.
-
dynscanner_cli는 계층화된 분석 파이프라인을 제공한다.--target또는--attach로 대상 프로세스를 제어하고, 다수의--breakpoint를 설정할 수 있다.- 브레이크포인트 히트 시 코드/스택 스냅샷을 채취하고
Analyzer에 전달한다. - 내장 규칙은 AES S-box, ChaCha20 시그마 상수, 대량 블록 처리 휴리스틱을 감지하며 결과를 실시간 로그로 출력한다.
- 옵션으로 코드/스택 스냅샷 크기 조정, 환경 변수 설정, 작업 디렉터리 지정이 가능하다.
cmake -S . -B build
cmake --build build
./build/dynscanner_cli --target /bin/true# 대상 실행 파일과 브레이크포인트 설정
./build/dynscanner_cli \
--target ./samples/crypto_target \
--breakpoint 0x401000 --breakpoint 0x401050 \
--code-window 128 --stack-window 256
# 실행 중인 PID에 부착
./build/dynscanner_cli --attach 12345 --breakpoint 0x401000현재는 Linux x86-64 백엔드가 완전 지원되며, 다른 플랫폼 구현체는 앞으로 순차적으로 추가될 예정이다.
- 대상 프로세스를 일시 중단 상태로 생성하거나 이미 실행 중인 프로세스에 디버거로 attach 한다. (구현 완료)
- 분석하고자 하는 명령어 주소에 소프트웨어 브레이크포인트(예: x86의
0xCC, AArch64의BRK)를 삽입한다. (x86-64 구현 완료) - 브레이크포인트 예외가 발생할 때마다 레지스터, 메모리 상태를 수집하고 암호화 알고리즘 여부를 판단한다. (Analyzer 스냅샷 파이프라인 구현)
- 원본 명령어를 복원하고 프로그램 카운터를 조정한 뒤 실행을 이어간다. (단일 스텝 기반 복원 루프 구현)
┌────────────────┐
│ Frontend CLI │
└───────┬────────┘
│ 명령/구성 전달
┌───────▼────────┐
│ Core Analyzer │ ← 암호화 패턴 탐지, 규칙 엔진
└───────┬────────┘
│ Breakpoint 이벤트
┌───────▼────────┐
│ Debug Session │ ← 공통 인터페이스(IDebugSession)
└───────┬────────┘
┌────▼────┐┌───▼────┐
│WinDBG ││Ptrace │ … 플랫폼 어댑터
└─────────┘└────────┘
launch(target, args, options)/attach(pid)(구현됨)set_breakpoint(address)/remove_breakpoint(address)(구현됨 — x86-64)read_memory(addr, size)/write_memory(addr, data)(구현됨)get_registers(thread)/set_registers(thread, regs)(구현됨 — x86/x86-64)resume(thread=None)/single_step(thread)(구현됨)- 이벤트 스트림:
BreakpointHit,SingleStep,Exception,ProcessExit(현재Signal/Breakpoint/SingleStep/ProcessStart/ProcessExit구현)
| 플랫폼 | 구현 포인트 |
|---|---|
| Windows (x86/x64/ARM64) | `CreateProcess(DEBUG_ONLY_THIS_PROCESS |
| Linux (x86/x64/ARM/AArch64) | ptrace(PTRACE_TRACEME/ATTACH/CONT/STEP/GETREGS/SETREGS/POKETEXT), waitpid, siginfo_t 이벤트 처리 (x86/x86-64 구현 완료, ARM/AArch64 준비됨) |
| macOS/BSD | Mach 예외 포트 또는 ptrace 유사 API 사용, 코드서명 우회 대비 |
각 어댑터는 공통 인터페이스를 구현하고, 브레이크포인트 명령어 길이 및 PC 조정 로직을 캡슐화한다.
- 브레이크포인트 등록 시 원본 명령어 바이트를 저장한다. (구현됨 —
BreakpointInfo) - 아키텍처별 트랩 명령어 길이를 고려하여 PC 보정 로직을 제공한다. (x86-64 구현 완료, 타 아키텍처 확장 예정)
- 예외 처리 시:
- 원본 명령어 복원 (구현됨)
- PC 보정 (예: x86 →
RIP -= 1, AArch64 →PC -= 4) (x86-64 구현 완료) - 단일 스텝 또는 재설치 로직 실행 (구현됨)
- 재개 전에 필요 시 단일 스텝으로 원본 명령어 실행 후 브레이크포인트를 재설치한다. (구현됨 — CLI 루프에서 수행)
- 공통 구조체를 정의해 아키텍처별 레지스터를 맵핑한다 (예:
RegStateX64,RegStateAArch64). (구현됨 —RegisterState) - 스냅샷은 분석 파이프라인으로 전달되어 암호화 루틴 탐지에 활용된다. (구현됨 —
Analyzer::ProcessSnapshot) - 엔디언 변환 및 정렬을 고려한 메모리 읽기 헬퍼를 제공한다. (구현됨 — 워드 단위 읽기/쓰기)
- 이벤트 수집층: 각 브레이크포인트 히트마다 레지스터/메모리/스택 정보를 기록. (CLI + Analyzer에서 구현)
- 휴리스틱 탐지: 반복 루프, 대량 메모리 복사, 특정 상수(S-box, 라운드 키 길이) 등을 활용. (BlockCopy/AES/ChaCha 규칙 구현)
- 패턴 시그니처: 알고리즘별 명령어 시퀀스 템플릿(AES, ChaCha20 등) 정의. (초기 시그니처 구현 완료)
- 동적 분석: 짧은 구간을 에뮬레이션하여 키 스케줄/라운드 동작을 검증. (후속 작업 — 인터페이스 준비됨)
- 리포팅: JSON/프로토콜 버퍼 기반 아티팩트로 기록. (향후 구현 예정, 현재 콘솔 로그 제공)
규칙 엔진은 C++ 클래스 기반으로 확장 가능하며, 향후 스크립트 기반 플러그인 추가 여지를 남겨두었다.
- CMake 기반 다중 플랫폼 빌드 스크립트.
- Windows: MSVC / clang-cl, Linux: GCC/Clang, macOS: Xcode toolchain.
- CI에서 QEMU를 활용한 크로스 아키텍처 단위 테스트 및 샘플 암호화 프로그램 실행.
- 테스트 타깃: 간단한 XOR, AES, ChaCha20 구현을 포함한 멀티 아키텍처 바이너리.
- 디버거 종료 시 원본 코드와 상태를 반드시 복원.
- 안티디버깅 대응: 타이밍 보정,
IsDebuggerPresent후킹,ptrace자기 검사 방어. - 권한 관리: Windows 관리자 권한/UAC, Linux Capabilities 설정.
- 로그 보존 및 법적 가이드라인 문서화.
- 하드웨어 브레이크포인트/PMU를 활용한 고성능 추적.
- 동적 코드 변조(Just-In-Time 패치)에 대응하기 위한 실시간 바이너리 재분석.
- GUI 기반 시각화 도구(타임라인, 메모리 맵, 키 추적 그래프).
해당 설계는 기본적인 구조를 제시하는 것으로, 실제 구현에서는 각 플랫폼의 세부 API 제약과 성능, 보안 요구사항을 추가로 검토해야 한다.