
Microsoft Windows 바이너리의 심볼, 타입 및 시스템 호출 정보를 OS의 여러 버전 간에 비교할 수 있는 도구로, 웹 UI 및/또는 LLM을 사용합니다.
WinDiff는 오픈소스 웹 기반 도구로, Microsoft Windows 바이너리의 심볼, 타입 및 시스템 콜 정보를 다양한 운영 체제 버전에서 탐색하고 비교할 수 있게 해줍니다. 바이너리 데이터베이스는 최신 Windows 업데이트(Insider Preview 포함)의 정보를 포함하도록 자동으로 업데이트됩니다.
이 도구는 ntdiff에서 영감을 받았으며, Winbindex의 도움으로 가능해졌습니다.
WinDiff는 두 부분으로 구성됩니다: Rust로 작성된 CLI 도구와 Next.js 프레임워크를 사용하는 TypeScript로 작성된 웹 프론트엔드입니다.
CLI 도구는 구성 파일로부터 압축된 JSON 데이터베이스를 생성하는 데 사용되며, 필요한 PE(및 PDB)를 찾고 다운로드하기 위해 Winbindex에 의존합니다. 타입은 resym을 사용하여 재구성됩니다. CLI 도구의 목적은 새로운 Windows 버전이 출시될 때 데이터베이스를 쉽게 업데이트하고 재생성할 수 있도록 하는 것입니다. CLI 도구의 코드는 windiff_cli 디렉토리에 있습니다.
프론트엔드는 CLI 도구가 생성한 데이터를 사용자 친화적인 방식으로 시각화하는 데 사용됩니다. 프론트엔드는 ntdiff와 동일한 원칙을 따르며, 특정 Microsoft Windows 버전에 대한 공식 Microsoft PE 및 PDB에서 추출된 정보를 탐색하고, 이 정보를 버전 간에 비교할 수 있도록 합니다. 프론트엔드의 코드는 windiff_frontend 디렉토리에 있습니다.
예약된 GitHub 작업이 매일 Winbindex에서 새로운 업데이트를 가져와 WinDiff 라이브 버전을 생성하는 데 사용되는 구성 파일을 업데이트합니다. 현재 (무료 요금제의) 저장소 및 컴퓨팅 제한으로 인해 라이브 버전에서는 1년 미만의 KB 및 Insider Preview 업데이트만 유지됩니다. 물론 필요한 경우 이러한 제한 없이 직접 로컬 버전의 WinDiff를 다시 빌드할 수 있습니다. 자세한 내용은 다음 섹션을 참조하세요.
참고: Winbindex는 인덱싱된 모든 파일에 대해 100% 고유 다운로드 링크를 제공하지 않으므로, 일부 PE의 정보가 WinDiff에서 제공되지 않을 수 있습니다. 하지만 해당 PE가 VirusTotal에 등록되면 Winbindex는 고유 다운로드 링크를 제공할 수 있으며, 그러면 해당 정보가 자동으로 WinDiff에 통합됩니다.
WinDiff의 전체 빌드는 ci/build_frontend.sh에 "자체 문서화"되어 있으며, 이는 WinDiff 라이브 버전을 빌드하는 데 사용되는 빌드 스크립트입니다. 내용은 다음과 같습니다:
# 프로젝트 루트 폴더 확인
PROJECT_ROOT=$(git rev-parse --show-toplevel)
# 데이터베이스 생성
cd "$PROJECT_ROOT/windiff_cli"
cargo run --release "$PROJECT_ROOT/ci/db_configuration.json" "$PROJECT_ROOT/windiff_frontend/public/"
# 프론트엔드 빌드
cd "$PROJECT_ROOT/windiff_frontend"
npm ci
npm run build
WinDiff 라이브 버전의 데이터를 생성하는 데 사용되는 구성 파일은 ci/db_configuration.json에 있습니다. 직접 수정하거나 자신만의 파일을 사용할 수 있습니다. 라이브 구성에서 추적할 새 바이너리를 추가하는 PR은 환영합니다.
이 저장소에는 에이전트 스킬이 포함되어 있어 WinDiff를 자동화된 보안 연구 도우미로 전환합니다. 직접 diff UI를 클릭하는 대신, Claude Code에게 두 Windows 버전을 비교하고 변경 사항과 그 중요성을 설명하도록 요청할 수 있습니다.
이 스킬은 .claude/skills/windiff-version-diff-analysis/에 있습니다. 이 저장소를 Claude Code에서 열면 자동으로 로드되며, 다음과 같은 요청에서 작동합니다:
ntoskrnl.exe를 비교하고 새로운 점을 알려줘."win32k.sys / ci.dll에서 무엇이 변경되었나?"두 버전이 주어지면 스킬은 windiff_cli를 구동하여 데이터베이스를 생성하고, 이를 비교한 후 원시 심볼/타입/시스템 콜 델타를 Windows 내부 지식(API 접두사, 구성 요소 역할)을 사용하여 해석한 보고서를 생성합니다. 이 보고서는 안티멀웨어/EDR 개발자, 안티치트 개발자, 취약점 연구자라는 세 가지 대상을 위해 구성됩니다. 새로운 시스템 콜, 새로운 완화 플래그(익명 비트필드 구조체 안에 숨겨진 비트를 포함하며, 부모인 _EPROCESS::MitigationFlags2Values 등에 연결됨), 새로운 ETW/위협 인텔리전스 텔레메트리 및 커널 콜백, 코드 무결성 변경, 완전히 새로운 구성 요소를 강조합니다.
다음은 Claude Opus 4.7이 "25H2와 26H1 사이의 ntoskrnl.exe를 비교하고 새로운 점을 알려줘. 보고서를 마크다운 파일로 작성해줘" 프롬프트에 대해 생성한 보고서입니다: ntoskrnl_25H2_to_26H1.md
스킬의 핵심 diff 로직은 종속성이 없는 독립형 Python 스크립트로, windiff_cli로 생성된 모든 데이터베이스에 대해 단독으로 사용할 수 있습니다:
# 데이터베이스 디렉토리에서 사용 가능한 OS 버전/바이너리 목록 보기
python3 .claude/skills/windiff-version-diff-analysis/scripts/windiff_diff.py \
windiff_frontend/public --list
# 두 OS 버전 간의 하나의 바이너리 비교 ("version_update_architecture" 접미사 사용)
python3 .claude/skills/windiff-version-diff-analysis/scripts/windiff_diff.py \
windiff_frontend/public ntoskrnl.exe 21H2_BASE_amd64 22H2_BASE_amd64
사람이 읽을 수 있는 요약은 stderr로, 구조화된 JSON(추가/제거된 내보내기, 심볼, 모듈, 시스템 콜, 그리고 해결된 타입/비트필드 변경 사항)은 stdout으로 출력합니다. 전체 워크플로우 및 참고 자료는 스킬의 SKILL.md를 참조하세요.