IDA Pro MCP
요약
IDA Pro MCP는 Model Context Protocol(MCP) 서버를 활용하여 IDA Pro에서 비디오 및 바이너리 프롬프트를 이용한 'vibe reversing' 기능을 구현합니다. 이 기능은 다양한 AI 코딩 도구와 연동할 수 있도록 설계되었으며, Python 3.11 이상과 최신 버전의 IDA Pro가 필요합니다.
핵심 포인트
- MCP 서버를 통해 IDA Pro에서 vibe reversing 가능
- Amazon Q Developer CLI 등 다수의 AI 클라이언트 지원
- Python 3.11 이상 및 IDA Pro 8.3+ 필수 요구 사항
- bcp-reversing-dataset을 활용한 바이너리/비디오 프롬프트 제공
IDA Pro MCP
[!IMPORTANT]
대신 Official Hex-Rays IDA MCP Server 사용을 권장합니다!자세한 내용은 announcement blog post를 확인하세요.
간단한 MCP Server로 IDA Pro에서 vibe reversing을 허용합니다.
바이너리 및 비디오 프롬프트는 mcp-reversing-dataset 리포지토리에 있습니다.
사전 요구 사항 (Prerequisites)
-
Python (3.11 이상)
- 최신 Python 버전으로 전환하려면
idapyswitch를 사용하세요.
- 최신 Python 버전으로 전환하려면
-
IDA Pro (8.3 이상, 9 권장), IDA Free는 지원하지 않습니다
-
지원되는 MCP Client (마음에 드는 것을 하나 선택하세요)
-
다른 MCP 클라이언트: 사용하려는 클라이언트에 대한 JSON 설정을 얻으려면
ida-pro-mcp --config를 실행하세요.
참고: 이 기능을 사용하려면 idalib이 전역적으로 활성화되어 있고 uv가 설치되어 있어야 합니다:
# windows
uv run "C:\Program Files\IDA Professional 9.3\idalib\python\py-activate-idalib.py"
# macos
...
설치 (Claude Code)
Claude Code에서 최신 IDA Pro MCP를 설치하려면:
claude plugin marketplace add mrexodia/claude-marketplace
claude plugin uninstall ida-pro-mcp@mrexodia
claude plugin install ida-pro-mcp@mrexodia
설치 (Codex)
Codex에서 최신 IDA Pro MCP를 설치하려면:
codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia
설치 (Kimi Code)
Kimi Code에서 최신 IDA Pro MCP를 설치하려면, 채팅창에 다음 슬래시 명령어를 실행하세요:
/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main
/reload
이렇게 하면 idalib MCP 서버와 idapython 스킬이 설치됩니다. 플러그인은 $KIMI_CODE_HOME/plugins/managed/에 복사되므로, uv가 PATH에 있어야 합니다. 설치 후 첫 세션은 서버가 응답하기 전에 uv가 종속성을 해결해야 하므로 더 느립니다.
설치 (GUI)
참고: MCP 플러그는 더 이상 권장되지 않으며 결국 사용이 중단될 예정입니다. 대신 idalib-mcp를 사용하세요.
IDA GUI에서 수동으로 MCP 서버를 구성하려면:
pip uninstall ida-pro-mcp
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip
MCP 서버를 구성하고 IDA 플러그인을 설치하세요:
ida-pro-mcp --install
중요: 설치가 적용되려면 IDA와 MCP 클라이언트를 완전히 재시작해야 합니다. 일부 클라이언트(예: Claude)는 백그라운드에서 실행되며 트레이 아이콘에서 종료해야 합니다.
Prompt Engineering
LLM은 환각(hallucinations)을 일으키기 쉽고 프롬프팅에 구체적이어야 합니다. 특히 정수와 바이트 간의 변환을 리버스 엔지니어링하는 것은 매우 까다롭습니다. 아래는 최소한의 예시 프롬프트이므로, 다른 프롬프트로 좋은 결과를 얻었다면 자유롭게 토론을 시작하거나 이슈를 열어주세요:
Your task is to analyze a crackme in IDA Pro. You can use the MCP tools to retrieve information. In general use the following strategy:
- Inspect the decompilation and add comments with your findings
...
이 프롬프트는 첫 번째 실험일 뿐이니, 출력을 개선할 방법을 찾았다면 공유해주세요!
@can1357가 작성한 또 다른 프롬프트:
Your task is to create a complete and comprehensive reverse engineering analysis. Reference AGENTS.md to understand the project goals and ensure the analysis serves our purposes.
Use the following systematic methodology:
...
프롬프팅에 대해 논의하고 실제 악성코드 분석을 보여주는 라이브 스트림:
LLM 정확도 향상을 위한 팁
대규모 언어 모델(LLMs)은 강력한 도구이지만, 때로는 복잡한 수학 계산에 어려움을 겪거나
SSE 서버를 실행하여 사용자 인터페이스에 연결할 수 있습니다.
uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse
idalib을 설치한 후에는 헤드리스(headless) MCP 서버도 실행할 수 있습니다. 초기 바이너리를 사용하여 시작할 수 있습니다:
uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable
또는 바이너리 없이 시작하고 나중에 idb_open(...)으로 임의 파일을 열 수 있습니다:
uv run idalib-mcp --host 127.0.0.1 --port 8745
stdio 기반 클라이언트를 사용하려면 다음을 사용하십시오:
uv run idalib-mcp --stdio
데이터베이스 워커는 영구적입니다. 각 워커는 자신을 생성한 슈퍼바이저(supervisor)보다 오래 지속되는 분리된 프로세스로 실행됩니다. 새로운 슈퍼바이저(stdio 또는 HTTP를 통해)가 이 호스트의 워커에서 이미 열려 있는 바이너리에 대해 idb_open을 호출하면, 슈퍼바이저는 해당 워커를 투명하게 채택합니다. 활성화할 별도의
prefer_headless(기본값): idalib 워커를 시작하거나 이미 파일을 열고 있는 워커를 채택합니다.force_headless: 동일하지만, 파일이 열려 있더라도 실행 중인 GUI는 절대 채택하지 않습니다.prefer_gui: 파일에 대해 실행 중인 GUI를 채택하고; 그렇지 않으면 idalib 워커를 시작합니다.force_gui: 파일에 대해 실행 중인 GUI를 채택하고; 그렇지 않으면 새로운 IDA GUI 프로세스를 실행합니다.
모든 도구 호출은 명시적인 database 인수를 가져야 합니다. 암묵적인 "현재 데이터베이스"는 없으며, 호출자는 작업하려는 세션의 이름을 지정해야 합니다.
uv run idalib-mcp --stdio --max-workers 4
일반적인 흐름:
idb_open("/path/to/binary_a.exe", preferred_session_id="binary_a")
idb_open("/path/to/library.dll", preferred_session_id="library")
...
database는 idb_open에 의해 반환되거나 (idb_list에서 표시되는) 세션 ID여야 합니다. 파일 이름이나 경로는 허용되지 않습니다.
관리 도구 (Management tools)
idb_open(input_path, mode="prefer_headless", run_auto_analysis=True, build_caches=True, init_hexrays=True, preferred_session_id=""): 바이너리를 열고, 서브시스템(문자열 캐시, Hex-Rays)을 초기화하며 세션 ID를 반환합니다. 만약 해당 경로에 대해 호스트에서 워커 또는 GUI가 이미 실행 중이라면, 그 인스턴스가 채택되며preferred_session_id는 무시됩니다.idb_list(): 열려 있는 세션과 실행 중인 GUI IDA 인스턴스를 나열합니다. 각 항목은adopted(이 슈퍼바이저가 관리하는 경우 True,idb_open을 통해 아직 열리지 않은 발견된 GUI/워커의 경우 False),backend(worker또는gui),is_active, 그리고 프로세스 ID를 가집니다.idb_close(database, save=True): 세션을 저장하고(선택 사항), 등록 해제하며, 소유한 워커를 종료하여--max-workers방향으로 슬롯을 확보합니다. 채택된 GUI/워커 인스턴스는 종료되지 않고 분리됩니다(detached).idb_save(session_id, path=""): 세션의 IDB를 디스크에 저장합니다. 일반 워커 도구(database=<id>주입)로 전달되며, 두 백엔드 모두 동일한 시그니처를 가집니다.- 데이터베이스별 상태 확인:
server_health(database=<id>)를 호출합니다 (전달됨).idb_list()는 슈퍼바이저의 TCP/RPC 프로브로부터is_active를 보고합니다.
Worker 제어:
--max-workers N: 최대 동시 데이터베이스 워커 수 (0= 무제한, 기본값4).IDA_MCP_MAX_WORKERS:--max-workers의 환경 기본값.
번들된 Codex 플러그인은 런타임의 IDA_MCP_* 구성 변수를 Codex 호스트 환경에서 전달합니다:
- 용량 및 생명 주기:
IDA_MCP_MAX_WORKERS,IDA_MCP_OPEN_TIMEOUT,IDA_MCP_WEDGED_GRACE_SEC,IDA_MCP_WORKER_CALL_TIMEOUT. - 상태 확인(Health probes):
IDA_MCP_HEALTH_TCP_TIMEOUT,IDA_MCP_HEALTH_RPC_TIMEOUT,IDA_MCP_HEALTH_RETRIES,IDA_MCP_HEALTH_RETRY_BACKOFF. - 워커 동작:
IDA_MCP_TOOL_TIMEOUT_SEC,IDA_MCP_ANALYSIS_PROMPT,IDA_MCP_URL. - 요청 로깅:
IDA_MCP_LOG_REQUESTS,IDA_MCP_LOG_SKIP_METHODS.
MCP 리소스
**리소스(Resources)**는 MCP의 철학을 따르는 탐색 가능한 상태(읽기 전용 데이터)를 나타냅니다.
핵심 IDB 상태:
ida://idb/metadata- IDB 파일 정보 (경로, 아키텍처, 베이스 주소, 크기, 해시)ida://idb/segments- 권한이 지정된 메모리 세그먼트ida://idb/entrypoints- 진입점 (main, TLS 콜백 등)
UI 상태:
ida://cursor- 현재 커서 위치 및 함수ida://selection- 현재 선택 범위
타입 정보:
ida://types- 모든 로컬 타입ida://structs- 모든 구조체/유니언ida://struct/{name}- 필드를 포함하는 구조체 정의
조회(Lookups):
-
ida://import/{name}- 이름별 임포트 상세 정보 -
ida://export/{name}- 이름별 익스포트 상세 정보 -
ida://xrefs/from/{addr}- 주소로부터의 크로스 레퍼런스(Cross-references) -
lookup_funcs(queries): 주소 또는 이름으로 함수를 가져옵니다 (자동 감지, 목록 또는 쉼표로 구분된 문자열 허용). -
int_convert(inputs): 숫자를 다양한 형식(십진수, 16진수, 바이트, ASCII, 이진수)으로 변환합니다. -
list_funcs(queries): 함수 목록을 나열합니다 (페이지네이션, 필터링). -
list_globals(queries): 전역 변수 목록을 나열합니다 (페이지네이션, 필터링). -
imports(offset, count): 모듈 이름과 함께 모든 가져온 심볼을 나열합니다 (페이지네이션). -
decompile(addr): 주어진 주소의 함수를 디컴파일합니다. -
disasm(addr): 전체 세부 정보(인수, 스택 프레임 등)와 함께 함수를 디스어셈블합니다. -
xrefs_to(addrs): 주소에 대한 모든 크로스 레퍼런스를 가져옵니다. -
xrefs_to_field(queries): 특정 구조체 필드에 대한 크로스 레퍼런스를 가져옵니다. -
callees(addrs): 주어진 주소의 함수가 호출하는 함수를 가져옵니다.
수정 작업 (Modification Operations)
add_bookmark(addr, name, prefix): 주소에 IDA 북마크를 추가하거나 교체합니다. 접두사 없이 설정하려면prefix=''로 지정합니다.set_comments(items): 디스어셈블리 및 디컴파일 뷰 모두에서 주소에 주석을 설정합니다.patch_asm(items): 주소의 어셈블리 명령어를 패치합니다.declare_type(decls): 로컬 타입 라이브러리에 C 타입을 선언합니다.define_func(items): 주소에 함수를 정의합니다. 명시적인 경계가 필요한 경우 선택적으로end를 지정할 수 있습니다.define_code(items): 바이트를 주소의 코드 명령어(instruction)로 변환합니다.undefine(items): 주소의 항목을 정의 해제하고, 원시 바이트(raw bytes)로 되돌립니다. 선택적으로end또는size를 지정할 수 있습니다.
메모리 읽기 작업 (Memory Reading Operations)
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Python (weekly)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기