
자동 바이너리 비교를 위한 MCP 서버
Diaphora MCP는 바이너리 자동 diffing을 위한 MCP(Model Context Protocol) 서버입니다. MCP 프로토콜을 통해 Diaphora(diff 엔진)와 IDA Pro(디스어셈블러)를 연결하여 AI 에이전트(예: Claude Code)가 바이너리 파일 비교, 보안 패치 탐색, 변경 분석을 수행할 수 있게 합니다.
.i64 / .idb 데이터베이스를 Diaphora SQLite 형식으로 변환합니다(idat.exe 헤드리스 모드 사용)idat.exe 필요)git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
패키지는 자동으로 IDA Pro와 Diaphora를 표준 설치 위치에서 찾으려고 시도합니다. 찾지 못한 경우 다음 환경 변수를 설정할 수 있습니다:
Claude Code의 경우 ~/.claude.json(또는 MCP 클라이언트의 해당 설정 파일)에서 지정할 수 있습니다:
{
"mcpServers": {
"diaphora": {
"command": "python",
"args": ["path/to/repo/diaphora_mcp_server.py"],
"env": {
"IDAT_PATH": "C:\\Program Files\\IDA Pro 9.3\\idat.exe",
"DIAPHORA_DIR": "C:\\Program Files\\IDA Pro 9.3\\plugins\\diaphora-3.4.1"
},
"timeout": 7200
}
}
}
참고: 매우 큰 바이너리(>100 MB)의 경우
timeout을 최소 7200(2시간)으로 설정하세요.
Codex는 일반적으로 두 개의 보완 MCP 서버를 사용합니다:
diaphora-mcp — 이 프로젝트: 내보내기, Diaphora diff, 결과 분석;ida-pro-mcp — 업스트림 IDA 검사 서버: idb_open, 역컴파일, 주소 수준 분석.idalib-mcp는 ida-pro-mcp의 헤드리스 백엔드이며, 별도의 Diaphora 서버가 아닙니다. 설치 후 Codex를 재시작합니다:
uv run ida-pro-mcp --install codex --transport streamable-http --scope global --ida-rpc http://127.0.0.1:8745/mcp
이 프로젝트의 경우 stdio 설정으로 충분합니다:
[mcp_servers.diaphora-mcp]
command = "python"
args = ["D:\\path\\to\\diaphora-mcp\\diaphora_mcp_server.py"]
startup_timeout_sec = 120
IDA Pro는 먼저 바이너리를 분석하여 .i64 또는 .idb 파일을 생성해야 합니다. 그 후:
┃ export_idb_to_diaphora(idb_path="old_version.i64")
┃ export_idb_to_diaphora(idb_path="new_version.i64")
또는 한 명령으로 전체 파이프라인 실행:
┃ batch_export_and_diff(idb1="old.i64", idb2="new.i64")
.i64를 결과 도구에 직접 전달하지 마십시오. 이는 IDA 데이터베이스일 뿐 SQLite가 아닙니다. 먼저 내보내십시오.
┃ # 1. 전체 파이프라인: 두 개의 .i64 내보내기 → diff → 요약 보고서
┃ batch_export_and_diff(idb1="v1.0.i64", idb2="v1.1.i64")
┃ # 2. 데이터베이스가 이미 내보내진 경우
┃ diff_diaphora_dbs(db1="v1.0.sqlite", db2="v1.1.sqlite")
┃ # 3. diff 결과 보안 분석
┃ analyze_diff_results(results_path="v1.0_vs_v1.1.diaphora")
┃ # 4. 변경 사항 중요도 순위
┃ rank_changes(results_path="v1.0_vs_v1.1.diaphora", top_n=20)
┃ # 5. 근본 원인 변경 찾기
┃ find_patch_root(results_path="v1.0_vs_v1.1.diaphora")
┃ # 6. 보안 패치 감지
┃ detect_security_patches(results_path="v1.0_vs_v1.1.diaphora")
┃ # 7. 전체 보고서 생성
┃ summarize_patch(results_path="v1.0_vs_v1.1.diaphora")
전체 단계별 기록은 **examples/basic-session.md**를 참조하십시오. 두 개의 IDB 데이터베이스 내보내기부터 개별 함수 비교까지의 실제 Diaphora MCP 세션을 보여줍니다. 러시아어 버전도 있습니다.
다음은 서버가 반환하는 내용의 미리보기입니다:
입력 — 두 개의 SQLite3 DLL 비교(2015 vs 2023):
{"idb1_path": "old.i64", "idb2_path": "new.i64", "use_decompiler": false}
출력 — 내보내기 + diff 후 요약:
{
"best_matches": 60,
"partial_matches": 993,
"multimatches": 52,
"unmatched_primary": 2647
}
세션은 6개의 MCP 도구 호출을 진행하며, 각 단계의 정확한 JSON 입/출력과 에이전트의 추론을 함께 보여줍니다.
┃ # 데이터베이스 내보내기 정보 가져오기
┃ get_export_info(db_path="app.sqlite")
┃ # 함수 검색
┃ search_export_db(db_path="app.sqlite", name_pattern="%crypt%", min_instructions=50)
┃ # 의사 코드 검색
┃ get_function_pseudocode(db_path="app.sqlite", address="401000")
diaphora-mcp/
├── diaphora_mcp_server.py # 메인 진입점
├── diaphora_mcp/
│ ├── diaphora_mcp_server.py # MCP 도구 등록
│ ├── config.py # 경로 설정 및 자동 감지
│ ├── models.py # 상수 및 모델
│ ├── core/
│ │ ├── export.py # 헤드리스 내보내기, 배치 파이프라인
│ │ ├── diff.py # Diff 및 .diaphora 결과 리더
│ │ ├── analysis.py # 함수 검색, 비교, 설명
│ │ ├── security.py # 키워드 매칭, 패치 감지
│ │ ├── ranking.py # 중요도 순위
│ │ ├── graph.py # 호출 그래프, BFS 호출 트리, 근본 원인
│ │ ├── metadata.py # 메타데이터 준비(이름, 주석)
│ │ └── report.py # 전체 패치 보고서 생성
│ └── utils/
│ ├── sqlite.py # SQLite 도우미
│ ├── format.py # 의사 코드 diff, 특징 벡터 추출
│ └── log.py # 내보내기 로깅 유틸리티
├── _diaphora_headless.py # idat.exe -S 씬 래퍼
└── logs/ # 자동 내보내기 로그 (동적 생성)
| 도구 | 설명 |
|---|---|
export_idb_to_diaphora | .i64/.idb 데이터베이스를 IDA 헤드리스를 사용하여 SQLite 형식으로 내보내기 |
batch_export_and_diff | 전체 파이프라인: 기본 내보내기 → 보조 내보내기 → diff → 요약 |
| 도구 | 설명 |
|---|---|
diff_diaphora_dbs | 두 개의 내보내진 Diaphora SQLite 데이터베이스 diff |
get_diff_results | 필터링으로 .diaphora diff 파일 읽기 |
get_diff_summary | 일치 통계 반환 |
| 도구 | 설명 |
|---|---|
detect_security_patches | 보안 수정 사항 감지(경계 검사, 메모리 안전, 안티디버그 등) |
| 도구 | 설명 |
|---|---|
rank_changes | 변경된 함수를 중요도별로 순위 지정(0-100 점수) |
| 도구 | 설명 |
|---|---|
get_changed_callgraph | 함수의 들어오고 나가는 호출 비교 |
compare_call_path | 함수에서 호출 그래프 탐색(BFS 호출 경로 비교, 최대 N 레벨) |
find_patch_root | 호출 연쇄를 유발하는 근본 원인 함수 감지 |
| 도구 | 설명 |
|---|---|
performance_report | 집계된 메모리, 캐시 및 연결 통계 반환 |
| 도구 | 설명 |
|---|---|
transfer_metadata | 대량 전송을 위한 이름, 주석, 프로토타입 준비 |
이 프로젝트는 실행 중인 GUI IDA Pro 세션과의 통합을 내장하여, 데이터베이스 잠금 충돌 없이 활성 IDA 창에서 직접 즉시 내보내기가 가능합니다.
plugins/ 디렉터리에 복사하면, IDA가 시작될 때 백그라운드 XML-RPC 서버가 포트 28652에서 자동 시작됩니다.export_idb_to_diaphora를 호출하면 MCP 서버가 포트 28652를 확인합니다. 활성 세션이 있으면 GUI에서 직접 내보내기를 실행합니다. 그렇지 않으면 idat.exe를 통한 헤드리스 백그라운드 실행으로 자동 대체됩니다.브리지 구성에 대한 자세한 지침은 GUI_INSTRUCTIONS.md를 참조하십시오.
매우 큰 프로젝트를 처리할 때 Diaphora MCP는 특정 최적화를 적용합니다:
100000으로 증가합니다(sys.setrecursionlimit). 큰 호출 그래프 탐색 중 크래시를 방지합니다.diaphora_config.py에서 COMMIT_AFTER_EACH_GUI_UPDATE = False로 설정하면 디스크 쓰기가 줄어 GUI 내보내기 속도가 2~3배 빨라집니다.EXPORTING_USE_MICROCODE = False in Diaphora 설정).analyze_diff_results, compare_functions, find_function_match와 같은 도구는 주소와 경로를 포함한 ida_pro_mcp 블록을 반환합니다. 이 정보는 ida-pro-mcp 도구에 직접 전달할 수 있습니다:
┃ # 1. Diaphora가 의심스러운 함수를 찾음
┃ analyze_diff_results(results_path="diff.diaphora")
┃ → addr1="401000", db1="old.sqlite"
┃ # 2. IDA Pro MCP가 역컴파일
┃ decompile_function(address="401000")
Diaphora MCP의 실제 작동을 보려면 다음 예시를 확인하십시오:
이 프로토콜을 사용하는 AI 코딩 어시스턴트(예: Claude Code)라면 다음 호환성 규칙을 염두에 두십시오:
GUI vs. 헤드리스 내보내기 스키마:
ida_mcp.py 플러그인)을 통한 내보내기는 calls, strings, structures 테이블을 포함하지만 program 테이블이 없는 사용자 정의 스키마를 생성합니다.idat.exe 사용)는 program 테이블을 포함하는 공식 Diaphora 스키마를 생성합니다.diff_diaphora_dbs)은 공식 스키마를 필요로 합니다. 데이터베이스를 비교/차이 분석하려면 항상 헤드리스로 내보내십시오.GUI에서 잠긴 데이터베이스:
데이터베이스 이름 충돌 방지:
<basename>.diaphora.sqlite입니다.<basename>.sqlite를 사용하지 마십시오. 이는 ida-pro-mcp 감독자가 생성하는 내부 캐시 데이터베이스와 충돌합니다.확인된 IDA Pro 9.3 픽스처는 회귀 테스트 스위트를 통과합니다: 16 passed, 1 xpassed. 두 SQLite3 DLL의 실제 스테이징 내보내기 및 Diaphora diff도 확인되었습니다. 대규모 또는 GUI에서 열린 IDB는 여전히 무료 IDA 잠금, 유효한 DIAPHORA_OUTPUT_ROOT, 충분히 큰 MCP 클라이언트 시간 초과가 필요합니다.
MIT
| 변수 | 설명 | 예시 |
|---|
IDAT_PATH | idat.exe의 전체 경로 | C:\Program Files\IDA Pro 9.3\idat.exe |
DIAPHORA_DIR | diaphora.py가 있는 폴더 | C:\Program Files\IDA Pro 9.3\plugins\diaphora-3.4.1 |
DIAPHORA_OUTPUT_ROOT | 새 내보내기 파일이 허용되는 루트 디렉터리 | D:\\diaphora-outputs |
DIAPHORA_PYTHON | diff에 사용할 Python 인터프리터 | /usr/bin/python3 (기본값: sys.executable) |
| 도구 | 설명 |
|---|
analyze_diff_results | 보안 키워드 및 필터를 사용하여 결과 검사 |
compare_functions | 두 데이터베이스에서 함수의 나란히 비교 |
find_function_match | 신뢰도 지표와 함께 두 번째 바이너리에서 함수 일치 찾기 |
explain_similarity | 유사성 요소(니모닉, CFG, 상수, 프로토타입, 해시) 분석 |
detect_behavior_change | 함수 로직 변경에 대한 자연어 요약 제공 |
summarize_patch | 포괄적인 업데이트 보고서 생성 |
search_export_db | 이름/명령어/복잡성으로 내보내진 함수 검색 |
get_function_pseudocode | 함수의 의사 코드 및 메타데이터 가져오기 |
get_export_info | 일반 데이터베이스 메타데이터 검색 |