Windows Memory Attack & Forensics Research Platform
XMem은 Windows 프로세스의 메모리 구조, PE 이미지, 모듈, 스레드, 메모리 보호 속성, 메모리 영역 변화, Snapshot, Minidump 및 메모리 기반 행위를 종합적으로 분석하는 User-mode 연구 플랫폼이다.
핵심 질문:
특정 Windows 프로세스에서 메모리 관련 실험을 수행했을 때, 프로세스의 메모리·모듈·스레드·PE·보호 속성에 어떤 변화가 발생했는가?
핵심 Workflow (장기 목표):
Baseline → Controlled Experiment → Post-state → Snapshot Diff → Detection → Forensic Evidence → Report
현재 v0.2.6 — Batch D(엔지니어링 성숙도·GUI 잔여)를 적용했다: 숨김 벤치마크(xmem bench), 시드 고정 fuzz-lite(패턴·PE·정책·이미지 파서), RSS soak 테스트(--ignored), 이미지 바이트 수준 diff(image diff), GUI 로그 레벨 필터·파일 저장, GUI 맵 주소 점프, 포터블 설치/제거 스크립트(packaging/). 실험 자동화는 CLI 전용으로 유지된다.
| 구성 요소 | 상태 |
|---|---|
| Cargo workspace / 빌드·lint 게이트 | Implemented |
| Core Data Model (Process/Memory/Module/Thread/Protection/Evidence) | Implemented |
Error Model (XmemError) |
Implemented |
보호 프로세스 정책 (xmem-core::guard) |
Implemented |
MemorySource 추상화 (trait) |
Implemented |
Windows 추상화 (Win32 오류 매핑, RAII OwnedHandle, 프로세스 primitive) |
Implemented |
CLI 골격 (전체 명령 트리, --json, 로깅 분리, exit code 계약) |
Implemented |
process list / process info (경로, arch, session, 생성시각, 사용자, 명령줄, 메모리, 스레드/모듈 수) |
Implemented |
memory map (VirtualQueryEx, MEM_* state/type, PAGE_* 보호 속성, allocation base(ALLOC), R/W/X, class, PE 프로브 heuristic 포함, mapped file, --json) |
Implemented |
memory scan (패턴/ASCII/UTF-16, 필터, chunked 병렬, 취소, --progress 진행률, --json) |
Implemented |
modules --pid (Toolhelp 모듈 열거: base/size/path/arch, --unloaded 언로드 이미지 후보, --json) |
Implemented |
threads --pid (TID, priority, start address → region/module 상관관계, --json) |
Implemented |
modules --pid --pe (모듈 메모리 헤더 PE 요약: machine/entry/sections, --json) |
Implemented |
PE 분석 (xmem-pe: 파서/메모리 PE 분류, memory map heuristic 활성화) |
Implemented |
snapshot create (포맷 v1, 메타데이터 + 영역 blake3 + findings, --hash-budget/--hash-all 해시 예산, 디스크 사전 검사, atomic rename, --json) |
Implemented |
snapshot diff (region/module/thread/protection/content/detection 변화, --json) |
Implemented |
detect --pid (Rule 기반 XMEM-001~005, Observed/Evidence/Heuristic/Confidence 분리, 위험도 스코어 risk N/100, 정책 파일 --rules(JSON 사용자 규칙·억제, suppressed 보고), --json) |
Implemented |
report --pid <PID> --output <FILE> (JSON/Markdown 리포트: regions/modules/threads/findings + summary + risk, 정책 파일(--rules), 확장자 .md면 Markdown, temp→rename, --json) |
Implemented |
dump create --pid <PID> --output <FILE> [--full] (MiniDumpWriteDump, metadata+FullMemoryInfo 기본, --full은 전체 메모리·디스크 사전 검사, --progress 콜백 진행률, temp→검증→rename, --json) |
Implemented |
dump analyze <FILE> (minidump 파싱: os/cpu/arch/pid/modules/threads(시작 주소 출처 포함)/regions/findings, 오프라인 Detection, --json) |
Implemented |
image create|info|analyze|scan|diff (MemoryImage .xmemimg v1: 프로세스 메모리 오프라인 스냅샷(committed+readable, 예산 상한, temp→재검증→rename), info/analyze/scan 오프라인 재분석, diff는 두 이미지의 바이트 수준 변경 구간·바이트 수 보고, --json) |
Implemented |
Test Target (lab/targets/xmem-target) (deterministic 시나리오 normal/pattern/private/private-exec/pe-like/threads/protection/all, Ground Truth JSON report, 회귀 테스트) |
Implemented |
Experiment 자동화 (experiment list / experiment run <NAME> / experiment history) (7개 정의 실험: remote-alloc/protection-flip/pe-staging/remote-thread/multi-alloc/exec-only-alloc/writecopy-alloc, spawn한 xmem-target 한정, guard/신원 검증, cleanup, 실행 이력 %APPDATA%\XMem\experiments.jsonl·회귀 표시, --json) |
Implemented |
GUI (xmem-gui) (egui 단일 exe: 프로세스 목록/개요·메모리맵·검색+hex 미리보기·모듈·스레드·탐지·스냅샷·덤프·리포트, 맵/모듈/스레드 상세 패널(hex 페이지 뷰어·디스크/메모리 PE 비교·스레드 시간), 스캔/덤프 진행바·위험도 배지·해시 예산 입력·언로드 후보, 아이콘·무콘솔, 시작 시 관리자 권한 자동 요청(runas), 가이드, 로그 패널, 다크/라이트) |
Implemented |
세부 설계는 docs/architecture.md, 마일스톤 실행 계획은 docs/plans/ 참고.
- Windows 10 / 11 (x86-64)
- Rust stable 1.98+ (edition 2024)
- MSVC Build Tools (link.exe) —
rustup기본 toolchainx86_64-pc-windows-msvc
$env:PATH = "$env:USERPROFILE\.cargo\bin;$env:PATH"
cargo build --release
# 산출물: target\release\xmem.exexmem --version
xmem --help
xmem process list # 프로세스 목록 (접근 불가 필드는 '-'로 표시)
xmem process info --pid <PID> # 상세 메타데이터
xmem memory map --pid <PID> # 가상 메모리 영역 맵 (분류/heuristic/mapped file)
xmem memory scan --pid <PID> --string pwsh --max-results 3 # ASCII 문자열 검색
xmem memory scan --pid <PID> --pattern "4D 5A" --executable-only # 실행 영역에서 PE 시그니처
xmem memory scan --pid <PID> --string pwsh --progress # 진행률을 stderr에 표시
xmem modules --pid <PID> # 로드된 모듈 (base/size/path)
xmem modules --pid <PID> --pe # 모듈별 PE 요약 (machine/entry/sections)
xmem modules --pid <PID> --unloaded # 언로드 이미지 후보 (private exec PE-like, 모듈 범위 밖)
xmem threads --pid <PID> # 스레드 + 시작 주소 → region/module 상관관계
xmem snapshot create --pid <PID> --output before.xmem # Baseline 스냅샷 (XMEM 포맷 v1)
xmem snapshot create --pid <PID> --output before.xmem --hash-budget 32Mi # 해시 예산 지정(--hash-all 전체)
xmem snapshot diff before.xmem after.xmem # 변화 분석 (region/module/thread/content/detection)
xmem detect --pid <PID> # Detection Rule 실행 (findings + evidence + risk N/100)
xmem dump create --pid <PID> --output target.dmp # 미니덤프 생성 (기본 metadata + FullMemoryInfo)
xmem dump create --pid <PID> --output target.dmp --progress # 덤프 진행률 (취소 불가)
xmem dump analyze target.dmp # 오프라인 분석 (regions/modules/threads + findings)
xmem detect --pid <PID> --rules policy.json # 사용자 규칙 + 억제 목록 적용 (suppressed 보고)
xmem image create --pid <PID> --output lab.xmemimg --max-bytes 64Mi # 메모리 이미지 저장 (오프라인 분석용)
xmem image scan lab.xmemimg --string XMEM_PATTERN_ALPHA_0123456789 # 이미지에서 문자열 재검색
xmem image diff a.xmemimg b.xmemimg # 두 이미지의 바이트 수준 변경 구간 (0x주소 +오프셋 N바이트)
xmem report --pid <PID> --output report.md # JSON/Markdown 리포트 (findings 포함)
cargo build -p xmem-target # Research Lab Test Target 빌드
.\target\debug\xmem-target.exe run all --hold-secs 60 --report report.json # 알려진 아티팩트 프로세스
xmem detect --pid <TARGET-PID> # 타깃에서 XMEM-001/002/004 등 관찰
xmem experiment list # 정의된 실험 목록 (7종)
xmem experiment run remote-alloc # Baseline→Action→Post→Diff→Detection
xmem --json experiment run protection-flip # 실험 결과 JSON
xmem experiment history # 실행 이력 + 회귀(regressions) 표시
xmem --json process list # JSON envelope (schema_version 포함)
xmem --json memory map --pid <PID> # 영역 상세 JSON
xmem --json memory scan --pid <PID> --wide-string pwsh # UTF-16LE 검색 JSON
cargo build --release -p xmem-gui # GUI 빌드 (egui 단일 exe)
.\target\release\xmem-gui.exe # GUI 실행 (--pid <PID>로 시작 가능)
.\packaging\install.ps1 -ZipPath .\xmem-v0.2.6-windows-x64.zip # 포터블 설치(LOCALAPPDATA\Programs\XMem + 시작 메뉴)
.\packaging\uninstall.ps1 # 설치 제거(사용자 데이터 gui.json·Documents\XMem은 유지)xmem process list
xmem process info --pid <PID>
xmem memory map --pid <PID>
xmem memory scan --pid <PID>
xmem modules --pid <PID>
xmem threads --pid <PID>
xmem snapshot create --pid <PID> --output before.xmem
xmem snapshot diff before.xmem after.xmem
xmem dump create --pid <PID> --output target.dmp
xmem dump analyze target.dmp
xmem detect --pid <PID>
xmem report --pid <PID> --output report.json
xmem experiment list
xmem experiment run <NAME>
전역 옵션: --json, -v/-vv/-vvv, -q, --no-color.
memory scan 옵션 (needle 중 정확히 1개 필수):
| 옵션 | 설명 |
|---|---|
--pattern <HEX> |
16진 바이트 패턴. ??(전체 와일드카드), 4?/?8(니블 마스크) 지원 |
--string <S> / --wide-string <S> |
ASCII / UTF-16LE 문자열 |
--executable-only / --private-only / --writable-only |
영역 필터 |
--range <START:END> |
주소 범위 (예: 0x1000:0x2000) |
--max-region-size <SIZE> |
초과 영역 스킵 (예: 8Mi) |
--offset <N> |
영역 내 상대 오프셋이 정확히 N인 매치만 보고 |
--max-results <N> |
최대 결과 수 (0 = 무제한, 기본 1024) |
--chunk-size <SIZE> |
청크 크기 (기본 1Mi, 허용 4Ki~16Mi) |
--threads <N> |
worker 스레드 수 (기본 min(논리CPU-1, 4)) |
--all |
committed > 4 GiB 정책 해제 |
memory map 필터/정렬 (기본 없음 — 전체 표시, 여러 조건은 AND):
| 옵션 | 설명 |
|---|---|
--readable-only / --writable-only / --executable-only |
권한 기준 영역 필터 |
--state <commit|reserve|free> |
메모리 상태 |
--class <image|mapped|private> |
분류 |
--prot <rwx|r-x|rw-|r--|x|---> |
보호 속성 (x = 실행 전용, --- = 없음) |
--heuristic <exec-private|exec-anon|pe-like|wx> |
heuristic 태그 |
--pe-like |
PE-like private executable 영역만 |
--outside-modules |
로드된 모듈 범위 밖 영역만 (모듈 목록이 비면 매칭 없음) |
--mapped-only |
파일 백킹이 관찰된 영역만 |
--range <START:END> |
주소 범위 겹침 |
--min-size <SIZE> / --max-size <SIZE> |
영역 크기 — 접미사 허용(예: 4096, 4Ki, 8Mi) |
--sort <addr|addr-desc|size-desc> |
정렬 (기본 addr) |
다른 분석 명령의 필터 플래그 (모두 기본 없음, 결과 수집 후 적용):
| 명령 | 플래그 |
|---|---|
process list |
--name <SUBSTR> (이름), --arch <x64|x86>, --session <N>, --user <SUBSTR>, --protected (중요 프로세스 보호 목록), --ppid <N> (+기존 --accessible-only) |
modules |
--filter <SUBSTR> (이름/경로), --arch <x64|x86> (모듈 아키텍처), --unparsed (PE 파싱 실패 모듈만) |
threads |
--with-start (시작 주소 조회 가능), --suspicious (모듈 밖 시작 주소), --tid <N> |
detect |
--min-severity <info|low|medium|high|critical>, --min-confidence <low|medium|high>, --rule <ID>, --sort <severity|address|rule> (기본 rule) |
snapshot diff |
--only <regions,content,modules,threads,detections> (콤마 목록, 미지정 시 전체) |
필터 로직은 GUI와 CLI가 xmem-core::filter의 동일 구현(공유 *Filter + matches())을 사용하며 플래그와 GUI 컨트롤은 1:1 대응이다.
snapshot create는 XMEM 포맷 v1(magic "XMEM" | format_version | flags | payload_len | JSON)로 저장하며, committed + readable 영역을 executable/private 우선으로 최대 64 MiB까지 blake3 해싱한다(예산 초과 영역은 partial: true). 파일은 temp → 재파싱 검증 → atomic rename으로 기록되고, 생성 전 가용 디스크 공간(예상 크기 + 16 MiB)을 검사한다.
snapshot diff는 region(base 키), module(name 키), thread(tid 키), content hash(base 키), finding(rule + 위치 키)을 매칭해 Added/Removed/Changed를 보고한다. 양쪽 모두 해시가 있는 영역만 content 변화로 보고된다.
detect는 Rule을 xmem-detection 크레이트에만 두고 CLI에는 하드코딩하지 않는다. 모든 finding은 Observed Fact → Evidence → Heuristic → Confidence → Interpretation 구조이며 악성 확정 표현을 쓰지 않는다. finding 0건이 안전을 증명하지 않는다 — 출력에 이 문구가 포함된다.
dump create는 MiniDumpWriteDump로 덤프를 생성한다. 기본은 MiniDumpNormal | MiniDumpWithFullMemoryInfo(영역 정보 포함, 작음)이고 --full은 전체 메모리를 포함한다(대상의 commit 바이트 + 16 MiB 여유를 생성 전에 검사). 파일은 temp → MDMP 시그니처 검증 → atomic rename으로 기록되며 실패 시 temp를 제거한다.
dump analyze는 minidump crate로 덤프를 파싱해 os/cpu/arch/pid, modules, threads, regions(MemoryInfoList), 메모리 범위를 보고하고, 라이브 프로세스와 동일한 Detection Rule을 오프라인에서 실행해 findings를 포함한다(덤프 자체는 변경되지 않는다).
Test Target(lab/targets/xmem-target)은 XMem이 알려진 상태를 분석하도록 deterministic한 아티팩트를 자기 프로세스에 구성한다: normal, pattern(ASCII/UTF-16/바이트 패턴), private, private-exec(RWX), pe-like(가짜 PE 헤더), threads(suspended 스레드), protection(RW→RWX), all. --report <FILE>로 각 아티팩트의 주소/크기/TID를 Ground Truth JSON으로 기록하며, 이 주소는 실행마다 달라진다. cargo test --workspace에 포함된 Ground Truth 회귀 테스트가 타깃을 spawn해 detect/scan 결과와 report를 대조한다.
experiment run <NAME>은 XMem이 직접 spawn한 xmem-target에만 실험한다. 실험마다 Baseline Snapshot 수집 → 원격 메모리 Action(VirtualAllocEx/VirtualProtectEx/WriteProcessMemory/CreateRemoteThread) → Post Snapshot 수집 → Diff → Detection 판정 순서로 진행하고, 기대 Rule이 기대 영역에서 관찰되었는지(expected_observed)를 --report Ground Truth와 대조해 보고한다. 모든 Action은 spawn 직후의 신원(image path/생성 시각/PID)과 guard 정책을 통과해야 하며, 종료 시 target 프로세스와 임시 파일을 정리한다.
Exit code: 0 성공, 1 실행 오류, 2 사용법 오류, 3 정책 거부(보호 프로세스 등), 130 취소(Ctrl+C).
- 2계층 구조: Core Analyzer (read-only) + Research/Experiment Layer
unsafe는xmem-windows크레이트에만 허용 (workspace lint로 강제)- 모든 분석 명령은 기본적으로 read-only이며, 대상 프로세스 상태 변경은 별도 Experiment로만 수행
자세한 내용: docs/architecture.md
$env:PATH = "$env:USERPROFILE\.cargo\bin;$env:PATH"
cargo fmt --all -- --check
cargo check --workspace
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings개발 도구 (v0.2.6):
xmem bench --pid <PID> --scenario all --iterations 3 # 분석 경로 반복 벤치마크(숨김 명령, map/scan/detect/modules/threads/snapshot)
cargo test -q -p xmem-memory --test soak -- --ignored --nocapture # soak: map+scan 60회, RSS 증가 < 32 MiB- User-mode 전용: Kernel driver, 물리 메모리 접근, 커널 패칭은 범위 밖(Non-Goal).
- M12 기준 모든 CLI 명령(
process/memory/modules/threads/snapshot/dump/detect/report/experiment)이 구현되어 있다. memory map의 mapped file 경로는QueryDosDeviceW로C:\...형태로 정규화해 표시한다(볼륨 문자를 찾지 못하면\Device\...원본 유지).memory scan은 guard(no-access) 및 non-readable 영역을 사전 스킵하며(카운트됨), 결과는 기본 1024개 상한(초과 시truncated: true보고,--max-results 0으로 해제).- committed > 4 GiB 대형 프로세스는 기본적으로 executable/private 영역만 스캔한다(
--all로 해제,policy_restricted로 보고). - 문자열 검색은 대소문자를 구분하며, 패턴 매처는 naive 구현이다(벤치마크 후 최적화 예정).
memory scan통계에는 XMem 자신의 RSS(작업 집합)가 포함된다(peak RSS 추적은 후속). 읽기 실패는 사유별(denied/invalid/other)로 집계되며 실패 주소 목록은 아직 제공하지 않는다.memory map/memory scan/detect는--output <FILE>(미지정 시 기존 표준 출력)과--format json|csv(기본 json)로 결과를 파일로 저장할 수 있다. 파일은 temp → 재읽기 검증 → rename으로 기록되며 실패 시 temp를 남기지 않는다. GUI는 맵/스캔/탐지 탭에서 JSON/CSV 내보내기 버튼과 저장 대화상자를 제공한다.executable_anonymous/private_executable_pe_likeheuristic은 private executable 영역의 헤더 prefix(4 KiB)를 읽어 판정한다(읽기 실패/부분 읽기에서는 heuristic을 추가하지 않는다).modules --pe는 메모리 헤더 prefix(4 KiB) 기준이라 imports/exports/relocations/TLS는 0으로 표시되며, VM_READ 권한이 없거나 파싱에 실패한 모듈은-로 표시된다(Malformed PE는 pe-like로 취급).modules의 모듈별 arch는 모듈 헤더(4 KiB prefix)의 PE machine에서 읽으며, 읽기/파싱 실패 시 프로세스 arch로 폴백한다. GUI 모듈 상세 패널은 디스크 PE 전체 파싱(parse_pe_file, 64 MiB 상한)을 우선 사용해 imports/exports/relocations/TLS/컴파일 시각까지 표시하고, 디스크 파싱이 실패하면 메모리 헤더 결과만 출처 라벨과 함께 보여준다.threads의 priority는 동적 우선순위(조회 실패 시-)이다. 스레드 시간 통계는 GUI 스레드 상세 패널에서GetThreadTimes(생성/종료 시각, kernel/user 시간)로 표시되며, CLI 출력에는 아직 포함되지 않는다.- Snapshot 해싱은 기본 64 MiB 예산이며,
snapshot create --hash-budget <SIZE>로 조정하거나--hash-all로 전체를 해시할 수 있다(--hash-all은 프로세스 크기에 비례해 오래 걸리고 스냅샷 파일이 커진다). 해시가 없는 영역은 content diff로 보고되지 않는다.SnapshotSource의 메모리 내용 read는 후속(MemoryImage)에서 지원 예정이다. memory scan --progress와dump create --progress는 진행 상황을 stderr에 10% 단위로 출력한다(JSON 출력과 무관). 덤프 진행률은 MiniDumpWriteDump 콜백 기반이며estimated_total은 프로세스 commit 기준이라 실제 파일 크기와 다를 수 있고, 덤프는 여전히 진행 중 취소를 지원하지 않는다.modules --unloaded는 private executable + PE-like 휴리스틱 영역 중 모듈 범위 밖에서 4 KiB 헤더 파싱에 성공한 것만 "언로드 이미지 후보"로 보고한다(정상 JIT/런타임 스텁도 포함될 수 있는 휴리스틱이며, 후보 없음이 정상을 보장하지 않는다).experiment history는%APPDATA%\XMem\experiments.jsonl을 읽으며 파일이 없거나 일부 줄이 손상돼도 실패하지 않고(손상 줄 건너뜀) 이력 기록 실패는 실험 실행 결과에 영향을 주지 않는다.dump analyze는 MemoryInfoList 스트림에 의존한다(XMem이 만든 덤프에는 항상 포함). XMEM-004는 덤프의 스레드 컨텍스트 instruction pointer(근사)로 시작 주소를 채우고start_address_source = minidump-context-rip로 출처를 남긴다(v0.2.5;dump analyzeJSONthreads배열에서 확인). RIP는 대개 모듈 내부(ntdll 등)라 XMEM-004가 발화하지 않을 수 있고, 컨텍스트가 없는 스레드는None으로 남아 skip된다. mapped file 이름은 module 목록 기반 근사이며, 모듈 목록이 없는 덤프에서는 XMEM-003/004가 침묵한다.--full은 진행 중 취소를 지원하지 않는다(Ctrl+C는 XMem을 종료하며, 콜백 기반 취소는 후속).detect의 finding은 관찰 기반 heuristic이며 악성 판정이 아니다. XMEM-002는memory map의 4 KiB 헤더 프로브 결과에 의존한다. XMEM-003은 모듈 범위 밖 executable 영역 중 파일 백킹이 확인되지 않는 것만 보고한다(mapped_filebasename이 로드된 모듈명과 일치하거나MEM_IMAGE면 제외, private은 XMEM-001/002가 담당, 남은MEM_MAPPED무파일은 Low confidence). 그래도 .NET 내부 등 정상 소프트웨어에서 Low confidence finding이 발생할 수 있다. 모듈 조회가 실패하면 XMEM-003/004는 침묵한다(skip).- region 목록은
MAX_REGIONS(1,048,576) 상한을 가지며, 초과 시truncated: true로 보고된다. - 비관리자 권한으로 실행 가능하지만, 일부 시스템 프로세스는 접근이 제한된다(설계상 정상 동작). 프로세스 목록은 포렌식 목적상 접근 불가 프로세스도 그대로 표시하되 메모리 읽기 가능 여부를
ACCESS(가능/권한 필요)로 표시하며,process list --accessible-only(GUI "접근 가능만 보기")로 읽을 수 있는 프로세스만 볼 수 있다(GUI에는 아키텍처 필터 전체/x64/x86도 있다). - 실험 기능은 XMem이 직접 spawn한 전용 Test Target에만 수행한다(호스트 보호).
- Test Target은 자기 프로세스의 메모리만 변경하며(x64 Windows 전용),
threads시나리오의 스레드는 suspended 상태로 생성되어 실제로 실행되지 않는다. 아티팩트 주소는 실행마다 달라지므로 테스트/스모크는--report의 주소를 사용해야 한다. - Experiment는 v1에서 XMem이 spawn한
xmem-target전용이다(임의 PID 불가).remote-thread의 원격 스레드는 suspended 상태로 생성되어 실행되지 않으며, 변경 Win32 API 호출은xmem-experiments경로에서만 일어난다. 테스트에서는RunOptions::target_binary로 바이너리를 지정하며, CLI는 실행 파일 기준 또는XMEM_TARGET환경 변수로 타깃을 찾는다. - GUI는 분석 기능만 제공한다(실험은 CLI 전용). 덤프 생성은 진행 중 취소를 지원하지 않으며, PPL 보호 프로세스는 관리자 권한으로도 열 수 없다. 검색은 진행률을 표시하지 않는다(취소는 가능). GUI는 시작할 때
ShellExecuteW runas로 자신을 관리자 권한으로 다시 띄우고(--pid유지), UAC를 취소하면 표준 권한으로 계속 실행된다(상단 배지의 "관리자로 재시작"으로 다시 시도 가능). 콘솔 창은 뜨지 않는다. - GUI 상세 패널(맵/모듈/스레드)은 행을 클릭하면 하단에 열리며, 조회 실패 시 원인을 사람이 읽을 수 있는 오류 라벨(
error_label: 접근 거부·부분 읽기·잘못된 주소·Windows API 코드 등)로 표시한다. 맵 상세의 hex 뷰어는 4 KiB 페이지 단위로 읽고, 읽지 못한 페이지는 사유를 표시한다. - GUI는 좁은 창(820px)에서 표를 패널 폭에 맞춰 그려 세로 스크롤바를 유지한다(가로 스크롤 대신 일부 열이 잘릴 수 있다). 맵/모듈/스레드 표는 행을 클릭한 뒤 ↑/↓로 선택을 이동할 수 있고(텍스트 입력 중에는 동작하지 않음), 맵·모듈·스레드 수집은 취소할 수 있다(취소 시 "취소되었습니다" 표시).
- 맵/프로세스/모듈/스레드/탐지 필터는 GUI와 CLI가 동일한
xmem-core::filter구현을 공유한다(플래그 ↔ GUI 컨트롤 1:1, 결과 동일). 기본은 필터 없음(전체 표시)이며 여러 조건은 AND로 결합된다. 맵 보호 콤보도 CLI--prot와 동일하게 X(실행 전용)·none을 제공한다. GUI는 좁은 창에서도 각 탭의 "필터" 팝업으로 전체 필터에 접근할 수 있다(넓은 창에서는 인라인 컨트롤 유지). - 덤프에 모듈 목록이 없으면 그 한계를, 모듈 상세의 디스크 PE 파싱이 실패하면 실패 사유를 화면에 표시한다.
- 탐지 정책 파일(v0.2.5, JSON)은
detect/report의--rules <FILE>로 적용한다:user_rules(영역 조건 매칭으로 XMEM-U… finding 추가)와suppress(rule_id +observed글롭으로 finding 억제, 사유 기록)로 구성되며suppressed N findings와 억제 사유를 함께 보고한다. 빈 id·중복 id·내장 rule_id 재정의·빈 사유는 거부하고, 오류 시 exit 1로 중단한다. GUI는 탐지 탭에서 규칙 파일을 불러오기/해제할 수 있다. 정책은 분석 튜닝 도구이며 findings를 숨긴 사실 자체가 suppressed로 드러난다. image명령군(v0.2.5)은 Snapshot과 별개의.xmemimg포맷(v1, magicXMEMIMG)이다.image create는 committed+readable 영역을 예산(--max-bytes, 기본 256 MiB)·영역 상한 안에서 저장하고(--executable-only/--private-only필터, 디스크 사전 검사, temp→재검증→rename),image info/image analyze/image scan은 네트워크/대상 프로세스 없이 저장된 내용만으로 동작한다(저장되지 않은 영역은 read/scan 불가). GUI에는 아직 이미지 탭이 없다.- XMEM-001/003 정밀화(v0.2.5): 같은
allocation_base안에 committed executable 영역이 2개 이상이면 XMEM-001 confidence를 Low로 낮추고allocation_region_count/allocation_base를 evidence에 남긴다(정상 런타임/JIT 힌트). XMEM-003의mapped-no-file도 같은 할당에 파일 백킹 형제 영역이 있으면 Low로 낮추고allocation_backed = some을 남긴다. image diff(v0.2.6)는 두 이미지에서 저장된(stored) 영역만 비교한다(4 KiB 청크, 인접 변경 병합). 영역은base로 매칭하므로 같은 base가 다시 매핑되며 크기가 달라져도 크기 자체는 보고하지 않고 꼬리 변경만 보고한다.--max-changes(기본 1000) 초과 시 목록은 잘리지만 합계(changed_bytes)는 정확하며truncated: true로 표시된다.bench(v0.2.6)는 개발도구용 숨김 명령(--help에 미표시)이며 read-only 분석 경로만 반복 측정한다(ms 수치는 시스템 부하에 따라 달라진다). fuzz-lite(v0.2.6)는 시드 고정 난수 입력으로 파서가 패닉하지 않음을 확인하는 회귀 테스트다(커버리지 기반 fuzzing은 아니다). soak은#[ignore]테스트라 기본cargo test에 포함되지 않는다.packaging/install.ps1(v0.2.6)은 릴리스 zip을%LOCALAPPDATA%\Programs\XMem에 풀고 시작 메뉴 바로가기를 만드는 사용자 단위 포터블 설치 스크립트다(관리자 불필요, MSI/서명 없음).uninstall.ps1은 설치 폴더·바로가기만 제거하며 사용자 데이터(%APPDATA%\XMem,Documents\XMem)는 남긴다.
docs/architecture.md— 설계 스펙 (2계층 구조, Data Model, Windows API 계획, Safety)docs/windows-memory.md— Windows 가상 메모리 기초 (state/type/protection, VirtualQueryEx)docs/vad.md— VAD 개념과 user-mode 근사(VirtualQueryEx)의 한계docs/pe.md— PE 구조와 메모리 PE 분류 (xmem-pe)docs/detection.md— Evidence 기반 Detection (XMEM-001~005)docs/experiments.md— 실험 방법론과 안전 원칙docs/format.md— Snapshot v1 / Minidump / Report / JSON envelope 포맷docs/gui-design.md— GUI 설계 스펙 (화면 구조, 디자인 시스템, 권한/취소 규칙)docs/brand/brand-guidelines.md— 로고(Map Tile) 사용 가이드 (색·최소 크기·Do/Don't)docs/future-work.md— v0.2.6 기준 기능 문제·부족 목록과 우선순위docs/plans/— 마일스톤 실행 계획
| Milestone | 내용 | 상태 |
|---|---|---|
| M1 | Workspace, CLI 골격, Core Data Model, Error Model, Logging, Windows 추상화 | 완료 |
| M2 | Process (process list / process info) |
완료 |
| M3 | Virtual Memory (memory map) |
완료 |
| M4 | Memory Scanner (패턴 엔진, chunked read, 필터) | 완료 |
| M5 | Module / Thread + 주소 상관관계 | 완료 |
| M6 | PE 분석 (xmem-pe, 메모리 PE artifact 탐지, modules --pe) |
완료 |
| M7 | Snapshot 생성 / Diff | 완료 |
| M8 | Detection Engine (XMEM-001~005, detect, Snapshot findings/diff) |
완료 |
| M9 | Minidump 생성 / 분석 | 완료 |
| M10 | Research Lab (Test Target + Ground Truth) | 완료 |
| M11 | Experiment 자동화 (TargetGuard, 4개 실험, Baseline→Post 파이프라인) | 완료 |
| M12 | 완성도 (report JSON/Markdown, 자원 모니터링 RSS, 문서 6종, UX) |
완료 |
| M13 | GUI (xmem-gui: egui 단일 exe, 분석 전체 탭, 관리자 재시작, 가이드, 로그) |
완료 |
| v0.1.2 | 상세 뷰어 (맵/모듈/스레드 상세 패널, ALLOC 컬럼, 디스크/메모리 PE 비교, 스레드 시간, 오류 라벨) | 완료 |
| v0.1.3 | 가이드 개편 (빠른 시작·탭별 안내·검색·용어 사전·오류 대처, 첫 실행 시 가이드 자동 열림) | 완료 |
| v0.1.4 | 내용 영역 크기 조절 (hex 뷰어·검색 미리보기·diff·findings·로그 패널을 마우스로 조절) | 완료 |
| v0.1.5 | 가독성 개선 (스크롤바가 내용을 덮지 않음, 내용 영역 전용 테두리 상자, 표 행 겹침 수정) | 완료 |
| v0.1.6 | 표/패널 사용성 수정 (열 구분선 제거, 셀 한 줄 고정, 행 클릭 복구, 상세 패널 겹침 수정) | 완료 |
| v0.1.7 | UI/UX 후속 수정 (실패 표시·작업 취소·Enter 제출·로그 가독성·폰트 폴백 등 14건) | 완료 |
| v0.1.8 | 보류 항목 해소 (상세 재시도, 비동기 페이지 로드, 표 가로 스크롤, 탐지 취소, 행 키보드 포커스) | 완료 |
| v0.1.9 | 맵/프로세스 정밀 수정 (클릭 밴드 클립, 태스크 리셋, 팝업 레이어 가드, 헤더 레이아웃, 목록 스크롤 복구 등) | 완료 |
| v0.2.0 | 기능 갭 Batch A (경로 변환, 실패 사유 집계, 모듈 arch, 덤프/모듈 안내, 좁은 창 스크롤, 방향키, 취소 확대, JSON/CSV 내보내기, PPL 비목표) | 완료 |
| v0.2.1 | 접근 권한 표시·필터 (접근 열, 접근 가능만 보기, 아키텍처 필터, CLI --accessible-only, 테스트 플레이크 수정) | 완료 |
| v0.2.2 | 필터 확장 + 감사 수정 (맵 14종·프로세스·모듈·스레드·탐지·diff 필터, GUI 필터 팝업·초기화, GUI·CLI 동등성 테스트, 보호 마스크 X, UI/UX 결함 18건 수정, forensics 테스트 안정화) | 완료 |
| v0.2.3 | 상세 패널 펼침 (영역 상세가 창 높이 60%로 열림, hex가 남은 공간을 자동으로 채워 드래그 불필요) | 완료 |
| v0.2.4 | 기능 갭 Batch B (스캔 진행률, 덤프 진행률, 해시 예산 옵션, 위험도 스코어, 언로드 모듈 후보, 실험 3종·이력/회귀) | 완료 |
| v0.2.5 | Batch C (탐지 정책 --rules·억제 목록, MemoryImage .xmemimg image create/info/analyze/scan, minidump XMEM-004 컨텍스트 RIP·출처, XMEM-001/003 할당 단위 정밀화) |
완료 |
| v0.2.6 | Batch D (숨김 bench, fuzz-lite 4종, soak 테스트, image diff 바이트 수준 diff, GUI 로그 필터·파일 저장, GUI 맵 주소 점프, 포터블 설치 스크립트) |
완료 |
MIT — LICENSE