
سطر أوامر بايثون Ghidra MCP
pyghidra-mcp هو خادم بروتوكول سياق النموذج (MCP) يعمل من سطر الأوامر، يجلب القوة التحليلية الكاملة لـ Ghidra، وهي مجموعة قوية لهندسة البرمجيات العكسية (SRE)، إلى عالم الوكلاء الأذكياء والأدوات القائمة على نماذج اللغة الكبيرة (LLM).
يعمل كجسر بين ProgramAPI و FlatProgramAPI الخاصين بـ Ghidra إلى بايثون باستخدام pyghidra و jpype، ثم يعرض هذه الوظائف عبر بروتوكول سياق النموذج.
MCP هو واجهة موحدة تسمح لنماذج اللغة وأدوات التطوير (مثل VS Code) والوكلاء المستقلين بالوصول إلى سياق منظم، واستدعاء الأدوات، والتعاون بذكاء. فكر في MCP على أنه الجسر بين أدوات التحليل القوية ونظام LLM البيئي.
مع pyghidra-mcp، يصبح Ghidra خلفية ذكية - جاهزة للاستجابة لاستعلامات غنية بالسياق، وأتمتة مهام هندسة عكسية عميقة، والتكامل مع سير العمل المعزز بالذكاء الاصطناعي.
يدعم pyghidra-mcp الآن وضعين للتشغيل:
headless للتحليل والأتمتة عبر CLI--gui، الذي يطلق Ghidra عبر pyghidra-mcp ويشارك حالة البرنامج الحية مع واجهة المستخدم الرسومية قيد التشغيل[!ملاحظة] هذا المشروع التجريبي قيد التطوير النشط. نحن نرحب بتعليقاتك، وتقارير الأخطاء، وطلبات الميزات، والمساهمات البرمجية.
نعم، ghidra-mcp الأصلي رائع. لكن pyghidra-mcp يتبع نهجًا مختلفًا:
--gui عندما تحتاج إلى تنقل وتحرير حي في الواجهة.هذا المشروع يوفر تجربة قائمة على بايثون أولاً مُحسّنة للتطوير المحلي والبيئات بدون واجهة رسومية وسير عمل قابل للاختبار.
flowchart LR subgraph Clients["Clients"] Agent["MCP host / agent"] Cli["pyghidra-mcp-cli"] User["Ghidra user"] end
subgraph Process["pyghidra-mcp process"]
Transport["stdio or streamable-http"]
Tools["MCP tools"]
Context["PyGhidra context"]
end
Project["Ghidra project<br/>.gpr / .rep"]
Artifacts["MCP artifacts<br/>ChromaDB + GZF cache"]
Gui["Ghidra GUI / CodeBrowser<br/>only with --gui"]
Agent -->|"stdio or HTTP"| Transport
Cli -->|"HTTP only"| Transport
Transport --> Tools
Tools --> Context
Context --> Project
Context --> Artifacts
Context -.-> Gui
User -.-> Gui
Gui -.-> Project
### اختيار الوضع```mermaid
flowchart TD
Start["What do you need?"]
Start --> Headless["Agent or automation only"]
Start --> GuiNeed["Live Ghidra GUI control"]
Start --> Terminal["Interactive terminal client"]
Headless --> Stdio["pyghidra-mcp -t stdio<br/>or -t streamable-http"]
GuiNeed --> GuiMode["pyghidra-mcp --gui<br/>--transport streamable-http<br/>--project-path project.gpr"]
Terminal --> HttpServer["Start pyghidra-mcp<br/>--transport streamable-http"]
HttpServer --> CliMode["Run pyghidra-mcp-cli commands"]
stdio لمضيفي MCP المحليين، أو streamable-http عندما يحتاج عدة عملاء إلى نفس مشروع Ghidra طويل الأمد.pyghidra-mcp بتشغيل Ghidra، وفتح المشروع، وكشف أدوات إضافية لتوجيه CodeBrowser في نفس JVM.pyghidra-mcp-cli هو عميل HTTP. ابدأ خادم streamable-http أولاً، ثم أصدر أوامر طرفية ضد ذلك الخادم الجاري.subgraph Transports
Stdio["stdio"]
Http["streamable-http"]
Sse["sse legacy"]
end
subgraph Server["pyghidra-mcp server"]
FastMcp["FastMCP tool server"]
Context["PyGhidra context"]
Indexing["background analysis and Chroma indexing"]
subgraph Tools["MCP tools"]
Analysis["decompile, xrefs, bytes, callgraph"]
Search["symbols, strings, code"]
ProjectOps["import, delete, metadata, list binaries"]
Edits["rename function, rename variable, set type, set prototype, set comment"]
GuiOnly["GUI only: open program, goto, list open programs, set current program"]
end
end
subgraph GhidraRuntime["Ghidra runtime"]
PyGhidra["pyghidra"]
Jpype["JPype shared JVM"]
Project["Ghidra project"]
Programs["program databases"]
CodeBrowser["Ghidra GUI / CodeBrowser"]
end
Agent --> Stdio
Agent --> Http
Automation --> Stdio
Automation --> Http
Automation --> Sse
Cli --> Http
Stdio --> FastMcp
Http --> FastMcp
Sse --> FastMcp
FastMcp --> Context
Context --> PyGhidra
PyGhidra --> Jpype
Jpype --> Project
Project --> Programs
Context --> Indexing
Indexing --> Search
FastMcp --> Tools
Tools --> Context
GuiOnly -.-> CodeBrowser
Context -.-> CodeBrowser
</details>
## المحتويات
- [PyGhidra-MCP - خادم بروتوكول سياق نموذج Ghidra](#pyghidra-mcp---ghidra-model-context-protocol-server)
- [نظرة عامة](#overview)
- [هل هناك أداة MCP أخرى لـ Ghidra؟](#yet-another-ghidra-mcp)
- [رسوم بيانية للإعداد](#setup-diagrams)
- [كيفية اتصال المكونات](#how-the-pieces-connect)
- [اختيار وضع التشغيل](#choosing-a-mode)
- [المحتويات](#contents)
- [بدء الاستخدام](#getting-started)
- [مُحسّن للوكلاء](#optimized-for-agents)
- [عميل واجهة الأوامر](#cli-client)
- [التثبيت](#installation)
- [بداية سريعة مع واجهة الأوامر](#quick-start-with-cli)
- [إنشاء المشاريع وإدارتها وفتح المشاريع الحالية](#project-creation-management-and-opening-existing-projects)
- [إنشاء مشاريع جديدة](#creating-new-projects)
- [هيكل المشروع المستقل](#self-contained-project-structure)
- [إنشاء مشروع أساسي](#basic-project-creation)
- [إنشاء مشروع مخصص](#custom-project-creation)
- [إنشاء مشاريع متعددة ذات صلة](#creating-multiple-related-projects)
- [فتح مشاريع Ghidra الحالية](#opening-existing-ghidra-projects)
- [الفتح عبر ملف .gpr](#opening-by-gpr-file)
- [وضع الواجهة الرسومية](#gui-mode)
- [الإعدادات الافتراضية للبدء والمشاريع الكبيرة](#startup-defaults-and-large-projects)
- [التطوير](#development)
- [الإعداد](#setup)
- [الاختبار والجودة](#testing-and-quality)
- [API](#api)
- [الأدوات](#tools)
- [العمليات الدفعية](#batch-operations)
- [أدوات القراءة / التحليل](#read--analysis-tools)
- [عمليات المشروع](#project-operations)
- [أدوات التعديل / التغيير](#edit--mutation-tools)
- [أدوات التحكم في الواجهة الرسومية (فقط `--gui`)](#gui-control-tools---gui-only)
- [الاستخدام](#usage)
- [تعيين الملفات الثنائية باستخدام Docker](#mapping-binaries-with-docker)
- [الاستخدام مع OpenWeb-UI و MCPO](#using-with-openweb-ui-and-mcpo)
- [مع `uvx`](#with-uvx)
- [مع Docker](#with-docker)
- [الإدخال/الإخراج القياسي (stdio)](#standard-inputoutput-stdio)
- [Python](#python)
- [Docker](#docker)
- [HTTP قابل للتيار](#streamable-http)
- [Python](#python-1)
- [Docker](#docker-1)
- [أحداث يرسلها الخادم (SSE)](#server-sent-events-sse)
- [Python](#python-2)
- [Docker](#docker-2)
- [التكاملات](#integrations)
- [Claude Desktop](#claude-desktop)
- [الإلهام](#inspiration)
- [المساهمة والمجتمع والتشغيل من المصدر](#contributing-community-and-running-from-source)
- [سير عمل المساهم](#contributor-workflow)
## بدء الاستخدام
قم بتشغيل [حزمة Python](https://pypi.org/p/pyghidra-mcp) كأمر واجهة أوامر باستخدام [`uv`](https://docs.astral.sh/uv/guides/tools/):```bash
uvx pyghidra-mcp # Creates pyghidra_mcp_projects directory by default
لإطلاق و التحكم في واجهة Ghidra الرسومية المباشرة من MCP، استخدم --gui مع streamable-http:```bash
uvx pyghidra-mcp
--gui
--transport streamable-http
--host 127.0.0.1
--port 8000
--project-path /absolute/path/to/ghidra-projects
--project-name my_project
> [!IMPORTANT]
> `--gui` يقوم بتشغيل Ghidra من خلال `pyghidra-mcp`. لا يربط بـ Ghidra خارجي قيد التشغيل بالفعل.
أو، قم بتشغيله كـ [حاوية Docker](https://ghcr.io/clearbluejar/pyghidra-mcp):```bash
docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp -t stdio
يحافظ pyghidra-mcp على سطح MCP ضيقًا عن قصد بحيث ينفق عملاء الوكلاء عددًا أقل من الرموز على اكتشاف الأدوات واختيار الوسائط.
open_program_in_gui و list_open_programs و set_current_program و goto فقط عند بدء تشغيل الخادم بـ --gui.pyghidra-mcp-cli يوفر عميل سطر أوامر مباشر عبر HTTP مع أوامر مجمعة لسير العمل الشائعة للتحرير والتحليل.يحافظ هذا على الخادم الافتراضي قابلاً للاستخدام لوكلاء LLM وتكاملات بيئات التطوير المتكاملة والأتمتة دون كشف سطح أدوات غير ضروري أو عناصر تحكم خاصة بواجهة المستخدم الرسومية فقط في الجلسات بدون واجهة رسومية.
لتجربة سطر أوامر أكثر تفاعلية، يمكنك استخدام حزمة pyghidra-mcp-cli المنفصلة، التي توفر واجهة سهلة الاستخدام للتفاعل مع خادم pyghidra-mcp قيد التشغيل.
قم بتثبيت عميل سطر الأوامر باستخدام uv (موصى به):```bash
uvx pyghidra-mcp-cli
أو قم بالتثبيت باستخدام pip:```bash
pip install pyghidra-mcp-cli
2. **استخدم واجهة CLI** (في محطة طرفية أخرى):```bash
# List available binaries
pyghidra-mcp-cli list binaries
# Decompile a function
pyghidra-mcp-cli decompile --binary ls main
# Decompile with callees, referenced strings, and cross-references
pyghidra-mcp-cli decompile --binary ls main --callees --strings --xrefs
# Search for symbols (supports regex patterns)
pyghidra-mcp-cli search symbols --binary ls printf -l 10
[!NOTE] يتصل واجهة سطر الأوامر (CLI) بـ pyghidra-mcp عبر HTTP لتجنب وقت بدء التشغيل الذي يتراوح بين 10-60 ثانية لإنشاء عملية Ghidra جديدة لكل أمر. راجع CLI README للحصول على التوثيق الكامل.
يمكنك إنشاء مشاريع جديدة بعدة طرق، حسب سير عملك:
يقوم pyghidra-mcp بإنشاء هيكل مشروع مستقل ذاتيًا حيث يكون لكل مشروع مشروع Ghidra خاص به وملفات pyghidra-mcp. يضمن ذلك العزلة الكاملة وسهولة إدارة المشروع.
pyghidra-mcp
$ tree pyghidra_mcp_projects/ pyghidra_mcp_projects/ ├── my_project.gpr ├── my_project-pyghidra-mcp │ ├── chromadb │ └── gzfs └── my_project.rep
#### إنشاء مشروع مخصص```bash
# Create project with custom name and location
pyghidra-mcp --project-path ~/analysis/malware_study --project-name malware_analysis
$ tree ~/analysis/
/home/vscode/analysis/
└── malware_study
├── malware_analysis.gpr
├── malware_analysis-pyghidra-mcp
│ ├── chromadb
│ └── gzfs
└── malware_analysis.rep
mkdir ~/reverse_engineering_workspace
pyghidra-mcp --project-path ~/reverse_engineering_workspace/suspicious_binaries --project-name suspicious_analysis
pyghidra-mcp --project-path ~/reverse_engineering_workspace/packed_malware --project-name packed_analysis
### فتح مشاريع Ghidra الموجودة
إذا كان لديك مشاريع Ghidra موجودة (ملفات `.gpr`)، يمكنك فتحها مباشرة باستخدام `pyghidra-mcp`:
#### الفتح عبر ملف `.gpr````bash
# Open existing Ghidra project (project name derived from filename)
pyghidra-mcp --project-path ~/existing/ghidra/my_research.gpr
# Result: ~/existing/ghidra/my_research-pyghidra-mcp/
# └── chromadb/, gzfs/ (pyghidra-mcp additions)
استخدم وضع واجهة المستخدم الرسومية عندما تريد أن تعمل إجراءات MCP على نفس كائنات البرنامج الحية التي يعرضها Ghidra.
--gui استخدام --transport streamable-http (أو --transport http كاسم مستعار)--project-path دليل مشروع بالإضافة إلى --project-name، أو ملف .gpr موجود. يتم إنشاء المشاريع المفقودة تلقائيًا.pyghidra-mcp، الذي يحافظ على معاملات واجهة المستخدم الرسومية و MCP في نفس JVM--guiمثال:
pyghidra-mcp --gui --transport streamable-http --project-path /path/to/project --project-name MyProject
``````bash
pyghidra-mcp \
--gui \
--transport streamable-http \
--project-path /absolute/path/to/my_research.gpr
الوضع الرسومي هو الاختيار الصحيح عندما تريد:
pyghidra-mcp لا يتطلب --wait-for-analysis افتراضيًا. يمكن للخادم بدء التشغيل بينما يستمر التحليل وفهرسة MCP في الخلفية.
هذا مهم للمشاريع الكبيرة:
--wait-for-analysis متاح عندما تريد مشروعًا محللًا بالكامل قبل تقديم الطلباتالقيود الحالية:
search_strings أو search_code الدلالية تنتظر فهرسة MCPعمليًا:
--no-wait-for-analysis--wait-for-analysisيستخدم هذا المشروع Makefile لتبسيط التطوير والاختبار. يُستخدم ruff للتحقق من الصياغة وتنسيق الكود، وتُستخدم خطافات pre-commit لضمان جودة الكود.
تثبيت uv: إذا لم يكن لديك uv مثبتًا، يمكنك تثبيته باستخدام pip:
pip install uv
أو اتبع دليل تثبيت uv الرسمي: https://docs.astral.sh/uv/install/
إنشاء بيئة افتراضية وتثبيت التبعيات:
make dev-setup
source ./.venv/bin/activate
تعيين متغير بيئة Ghidra: قم بتنزيل وتثبيت Ghidra، ثم عيّن متغير البيئة GHIDRA_INSTALL_DIR إلى دليل تثبيت Ghidra الخاص بك.
# For Linux / Mac
export GHIDRA_INSTALL_DIR="/path/to/ghidra/"
# For Windows PowerShell
[System.Environment]:https://raw.githubusercontent.com/clearbluejar/pyghidra-mcp/HEAD/:SetEnvironmentVariable(%27GHIDRA_INSTALL_DIR%27,%27C:%5Cpath%5Cto%5Cghidra%27)
يوفر Makefile عدة أهداف للاختبار وضمان الجودة:
make run: تشغيل خادم MCP.make test: تشغيل مجموعة الاختبارات الكاملة (وحدة وتكامل).make test-unit: تشغيل اختبارات الوحدة.make test-integration: تشغيل اختبارات التكامل.make test-integration-fast: تشغيل اختبار الدخان الخفيف للتكامل المستخدم بواسطة pre-commit.make test-integration-gui: تشغيل اختبارات تكامل الواجهة الرسومية. يتطلب تثبيت Ghidra يعمل ودعم واجهة رسومية.make lint: التحقق من نمط الكود باستخدام ruff.make format: تنسيق الكود باستخدام ruff.make typecheck: تشغيل فحوصات ثابتة خفيفة باستخدام ruff.make check: تشغيل جميع فحوصات الجودة.make dev: تشغيل سير عمل التطوير (تنسيق وفحص).make build: بناء حزم التوزيع.make clean: تنظيف مخرجات البناء وذاكرة التخزين المؤقت.التقسيم الموصى به:
ruff وpyright واختبارات الوحدة واختبار دخان تكامل خفيف واحدXvfb، وتغطية CLI، واختبارات دخان على macOS الحاليتمكين LLMs من تنفيذ الإجراءات وإجراء العمليات الحسابية المحددة والتفاعل مع الخدمات الخارجية.
تقبل decompile_function وlist_xrefs هدفًا واحدًا أو قائمة من الأهداف، مما يقلل من الرحلات ذهابًا وإيابًا عند تحليل سلاسل الاستدعاء أو رموز متعددة في وقت واحد.```jsonc
// Decompile three functions in one call, with callees and xrefs attached
{
"binary_name": "firmware.bin",
"name_or_address": ["main", "init_hardware", "0x08001234"],
"include_callees": true,
"include_xrefs": true
}
// Get cross-references for multiple symbols at once { "binary_name": "firmware.bin", "name_or_address": ["malloc", "free", "realloc"] }
يتم إرجاع الأخطاء لكل عنصر في نفس السطر (لا تزال الأهداف الأخرى تنجح):```jsonc
[
{"name": "main", "code": "void main() { ... }", "callees": ["init_hardware"], "xrefs": [...]},
{"name": "0xdeadbeef", "code": "", "error": "Function or symbol '0xdeadbeef' not found."}
]
search_code(binary_name: str, query: str, limit: int = 5, offset: int = 0, search_mode: str = "semantic", include_full_code: bool = True, preview_length: int = 500, similarity_threshold: float = 0.0): ابحث في الكود الزائف المفكك باستخدام البحث المتجه الدلالي أو المطابقة الحرفية.
list_xrefs(binary_name: str, name_or_address: str | list[str]): قائمة المراجع المتقاطعة لدالة (دوال) أو رمز (رموز) أو عنوان (عناوين). يقبل هدفًا واحدًا أو قائمة للبحث الدفعي.
gen_callgraph(binary_name: str, function_name: str, direction: str = "calling", display_type: str = "flow", condense_threshold: int = 50, top_layers: int = 3, bottom_layers: int = 3, max_run_time: int = 120): يُنشئ رسمًا بيانيًا للاستدعاءات بصيغة MermaidJS لدالة محددة. يدعم كلا اتجاهي "calling" (الدوال التي يستدعيها الهدف) و"called" (الدوال التي تستدعي الهدف) مع أنواع عرض متعددة.
decompile_function(binary_name: str, name_or_address: str | list[str], include_callees: bool = False, include_strings: bool = False, include_xrefs: bool = False, timeout_sec: int = 30): فك ترجمة دالة (دوال) بالاسم أو العنوان. يقبل هدفًا واحدًا أو قائمة للفك الدفعي. تُرفق علامات الاستجابة الغنية بالمستدعين والسلاسل و/أو المراجع المتقاطعة بكل نتيجة. timeout_sec يُطبق لكل هدف ويُحدد كل محاولة فك بشكل مستقل.
list_exports(binary_name: str, query: str = ".*", offset: int = 0, limit: int = 25): يسرد جميع الدوال والرموز المصدرة من ملف ثنائي محدد (التعبير النمطي مدعوم للاستعلام).
list_imports(binary_name: str, query: str = ".*", offset: int = 0, limit: int = 25): يسرد جميع الدوال والرموز المستوردة لملف ثنائي محدد (التعبير النمطي مدعوم للاستعلام).
read_bytes(binary_name: str, address: str, size: int = 32): يقرأ البايتات الخام من الذاكرة في عنوان محدد. قد تتضمن العناوين السداسية العشرية البادئة 0x أو تحذفها.
search_strings(binary_name: str, query: str, limit: int = 100): يبحث عن السلاسل داخل ملف ثنائي.
search_symbols_by_name(binary_name: str, query: str, functions_only: bool = False, offset: int = 0, limit: int = 25): يبحث عن الرموز داخل ملف ثنائي بالاسم. يدعم أنماط التعبير النمطي (مثل ^main$, func.*one) مع مطابقة غير حساسة لحالة الأحرف، أو استعلامات النص الجزئي البسيطة. عيّن functions_only=True لاستبعاد التصنيفات والمتغيرات والرموز الأخرى غير الدوال.
import_binary(binary_path: str): يستورد ملفًا ثنائيًا من مسار محدد إلى مشروع Ghidra الحالي. إذا كان المسار دليلاً، فسيقوم بفحص واستيراد جميع ملفات الثنائيات المدعومة بشكل متكرر، مع الحفاظ على هيكل الدليل داخل مشروع Ghidra.
list_project_binaries(): يسرد الملفات الثنائية في مشروع Ghidra الحالي. في وضع الواجهة الرسومية، يشمل ذلك الملفات الثنائية للمشروع الموجودة على القرص حتى لو لم تكن مفتوحة حاليًا في CodeBrowser.
list_project_binary_metadata(binary_name: str): يسترجع بيانات وصفية مفصلة لملف ثنائي محدد، بما في ذلك المعمارية والمترجم وتنسيق الملف القابل للتنفيذ ومقاييس التحليل وتجزئات الملف.
delete_project_binary(binary_name: str): يحذف ملفًا ثنائيًا (برنامجًا) من مشروع Ghidra.
rename_function(binary_name: str, name_or_address: str, new_name: str): يعيد تسمية دالة بالاسم أو العنوان. في وضع الواجهة الرسومية، يعمل هذا كمعاملة مباشرة في Ghidra ويُحدّث البرنامج المفتوح.
rename_variable(binary_name: str, function_name_or_address: str, variable_name: str, new_name: str): يعيد تسمية معامل دالة أو متغير محلي بالاسم الدقيق داخل دالة محددة. إذا كان الاسم مفقودًا أو غامضًا داخل تلك الدالة، ترجع الأداة خطأ بدلاً من التخمين. في وضع الواجهة الرسومية، يعمل هذا كمعاملة مباشرة في Ghidra ويُحدّث البرنامج المفتوح.
set_variable_type(binary_name: str, function_name_or_address: str, variable_name: str, type_name: str): يحدد نوع البيانات لمعامل دالة أو متغير محلي بالاسم الدقيق داخل دالة محددة. إذا كان الاسم مفقودًا أو غامضًا داخل تلك الدالة، ترجع الأداة خطأ بدلاً من التخمين. يتم تحليل type_name باستخدام محلل أنواع Ghidra مقابل مدير أنواع البرنامج.
set_function_prototype(binary_name: str, function_name_or_address: str, prototype: str): يحدد نموذج دالة من سلسلة توقيع كاملة. تشغل الأداة دائمًا النموذج عبر محلل التوقيع الأصلي في Ghidra وتعيد خطأ المحلل أو التطبيق إذا كان النموذج غير صالح.
set_comment(binary_name: str, target: str, comment: str, comment_type: str): يحدد تعليق دالة/مفكك أو تعليق قائمة. يمكن أن تكون أهداف تعليق القائمة عناوين أو رموزًا أو دوالاً. قيم comment_type المدعومة هي decompiler، plate، pre، eol، post، و repeatable.
--gui)هذه الأدوات متاحة فقط عند بدء pyghidra-mcp مع --gui وتتحكم في ما تعرضه الواجهة الرسومية بدلاً من تعديل بيانات المشروع مباشرة:
list_open_programs(): يسرد البرامج المفتوحة حاليًا في واجهة Ghidra الرسومية.open_program_in_gui(binary_name: str, new_window: bool = True): يفتح ملفًا ثنائيًا للمشروع في CodeBrowser. افتراضيًا، يفتح نافذة CodeBrowser جديدة. عيّن new_window=false لإعادة استخدام CodeBrowser مرئي عند الإمكان.set_current_program(binary_name: str): يجعل برنامجًا مفتوحًا هو البرنامج النشط/الحالي في سياق أداة الواجهة الرسومية الرئيسية.goto(binary_name: str, target: str, target_type: str): يوجه واجهة Ghidra الرسومية إلى عنوان أو دالة. يجب أن تكون target_type إما address أو function.تم نشر هذه الحزمة من بايثون على PyPI باسم pyghidra-mcp ويمكن تثبيتها وتشغيلها باستخدام pip، pipx، uv، poetry، أو أي مدير حزم بايثون.```text $ uvx pyghidra-mcp --help Usage: pyghidra-mcp [OPTIONS] [INPUT_PATHS]...
PyGhidra Command-Line MCP server
Options: -v, --version Show version and exit. -t, --transport [stdio|streamable-http|sse|http] Transport protocol. SSE is deprecated; use streamable-http instead. [default: stdio] -p, --port INTEGER Port for HTTP-based transports. [default: 8000] -o, --host TEXT Host for HTTP-based transports. [default: 127.0.0.1] --project-path PATH Directory for a pyghidra-mcp project or an existing Ghidra .gpr file. [default: pyghidra_mcp_projects] --project-name TEXT Ghidra project name. Ignored for .gpr paths. [default: my_project] --threaded / --no-threaded Allow threaded analysis. [default: threaded] --max-workers INTEGER Number of analysis workers; 0 means CPU count. [default: 0] --wait-for-analysis / --no-wait-for-analysis Wait for initial analysis before starting. [default: no-wait-for-analysis] --gui / --no-gui Launch Ghidra GUI in-process and serve MCP against GUI-open programs. Cannot attach to an already-running external Ghidra process. [default: no-gui] --list-project-binaries List ingested project binaries and exit. --delete-project-binary TEXT Delete a project binary by name and exit. --force-analysis / --no-force-analysis Force a new binary analysis each run. [default: no-force-analysis] --verbose-analysis / --no-verbose-analysis Verbose logging for analysis. [default: no-verbose-analysis] --no-symbols / --with-symbols Turn off symbols for analysis. [default: with-symbols] --sym-file-path PATH Single PDB symbol file for one binary. -s, --symbols-path PATH Local symbols directory. --gdt PATH Path to GDT files. May be specified multiple times. --program-options PATH JSON file with Ghidra program options. --gzfs-path PATH Location to store GZFs of analyzed binaries. -h, --help Show this message and exit.
### ربط البرامج الثنائية مع Docker
عند استخدام حاوية Docker، يمكنك ربط دليل محلي يحتوي على برامجك الثنائية في مساحة عمل الحاوية. يتيح ذلك لـ `pyghidra-mcp` تحليل ملفاتك.```bash
# Create and populate the new directory
mkdir -p ./binaries
cp /path/to/your/binaries/* ./binaries/
# Run the Docker container with volume mapping
docker run -i --rm \
-v "$(pwd)/binaries:/binaries" \
ghcr.io/clearbluejar/pyghidra-mcp \
/binaries/*
يمكنك دمج pyghidra-mcp مع OpenWeb-UI باستخدام MCPO، وهو وكيل تحويل MCP إلى OpenAPI. يتيح ذلك عرض أدوات pyghidra-mcp من خلال واجهة RESTful قياسية، مما يجعلها في متناول الواجهات الويب والأدوات الأخرى.
uvxيمكنك تشغيل pyghidra-mcp و mcpo معًا باستخدام uvx:```bash
uvx mcpo --
pyghidra-mcp /bin/ls
#### مع Docker
يمكنك دمج mcpo مع Docker:```bash
uvx mcpo -- docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp /bin/ls
يتيح نقل stdio الاتصال عبر تيارات الإدخال والإخراج القياسية. هذا مفيد بشكل خاص للتكاملات المحلية وأدوات سطر الأوامر. راجع المواصفات لمزيد من التفاصيل.
pyghidra-mcp
بشكل افتراضي، سيتم تشغيل حزمة Python في وضع `stdio`. نظرًا لأنها تستخدم تدفقات الإدخال والإخراج القياسية، سيبدو أن الأداة معلقة بدون أي مخرجات، ولكن هذا متوقع.
#### Docker
تم نشر هذا الخادم في GitHub's Container Registry ([ghcr.io/clearbluejar/pyghidra-mcp](http://ghcr.io/clearbluejar/pyghidra-mcp))```
docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp -t stdio
بشكل افتراضي، يبدأ حاوية Docker خادم streamable-http، لذا قم بتضمين -t stdio بعد اسم الصورة وشغّلها باستخدام -i لوضع الإدخال/الإخراج التفاعلي.
يتيح Streamable HTTP الاستجابات المتدفقة عبر JSON RPC عبر طلبات HTTP POST. اطلع على المواصفات لمزيد من التفاصيل.
بشكل افتراضي، يستمع الخادم على http://127.0.0.1:8000/mcp لاتصالات العملاء. استخدم --host / --port أو متغيرات البيئة MCP_HOST / MCP_PORT لتغيير عنوان الربط. يجب أن يكون الخادم قيد التشغيل ليتمكن العملاء من الاتصال به.
pyghidra-mcp -t streamable-http
افتراضيًا، سيتم تشغيل حزمة Python في وضع `stdio`، لذلك ستحتاج إلى تضمين `-t streamable-http`.
يستخدم وضع واجهة المستخدم الرسومية هذا النقل:```bash
pyghidra-mcp \
--gui \
--transport streamable-http \
--project-path /absolute/path/to/my_project.gpr
docker run -p 8000:8000 ghcr.io/clearbluejar/pyghidra-mcp
### أحداث يرسلها الخادم (SSE)
> [!تحذير]
> يعتبر مجتمع MCP أن هذا البروتوكول الناقل قديم ويُستخدم للتوافق مع الإصدارات السابقة. يُوصى باستخدام [HTTP القابل للبث](#streamable-http) كبديل.
يتيح نقل SSE إرسال تيارات من الخادم إلى العميل باستخدام أحداث يرسلها الخادم للاتصال من العميل إلى الخادم ومن الخادم إلى العميل. راجع [المواصفات](https://modelcontextprotocol.io/docs/concepts/transports#server-sent-events-sse) لمزيد من التفاصيل.
افتراضيًا، يستمع الخادم على [http://127.0.0.1:8000/sse](http://127.0.0.1:8000/sse) لاتصالات العميل. استخدم `--host` / `--port` أو متغيرات البيئة `MCP_HOST` / `MCP_PORT` لتغيير عنوان الربط. _يجب أن يكون الخادم قيد التشغيل حتى يتمكن العملاء من الاتصال به._
#### Python```bash
pyghidra-mcp -t sse
بشكل افتراضي، ستشغل حزمة Python في وضع stdio، لذا ستحتاج إلى تضمين -t sse.
docker run -p 8000:8000 ghcr.io/clearbluejar/pyghidra-mcp -t sse
## التكاملات
> [!NOTE]
> هذا القسم قيد التطوير. سنضيف قريبًا أمثلة لتكاملات محددة.
### Claude Desktop
أضف كتلة JSON التالية إلى ملف `claude_desktop_config.json` الخاص بك:```json
{
"mcpServers": {
"pyghidra-mcp": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/clearbluejar/pyghidra-mcp",
"pyghidra-mcp",
"--project-path",
"/tmp/pyghidra", // or path to writeable directory
"/bin/ls" //
],
"env": {
"GHIDRA_INSTALL_DIR": "/path/to/ghidra/ghidra_12.0_PUBLIC"
}
}
}
}
استلهم هذا المشروع في تنفيذه وتصميمه من هذه المشاريع الرائعة:
نعتقد أن مستقبل الهندسة العكسية هو وكالي وسياقي وقابل للتوسع.
pyghidra-mcp هي خطوة نحو هذا المستقبل — مما يجعل مشاريع Ghidra الكاملة متاحة للوكلاء الذكاء الاصطناعي وخطوط الأتمتة.
نحن نطور المشروع بنشاط ونرحب بالملاحظات والمشكلات والمساهمات.
[!NOTE] نحن نحب ملاحظاتك وتقارير الأخطاء وطلبات الميزات والكود الخاص بك.
إذا كنت تضيف أداة أو تكاملاً جديدًا، إليك سير العمل الموصى به:
feature/ للإشارة إلى قدرة جديدة.pyghidra/tools/.StdioClient. ضعه في tests/integration/.tests/integration/test_concurrent_streamable_client.py.make test و make format لضمان اجتياز تغييراتك لجميع الاختبارات والامتثال لقواعد التنسيق.يضمن هذا الاتساق عبر قاعدة الكود ويساعدنا في الحفاظ على أدوات قوية وقابلة للتوسع لسير عمل الهندسة العكسية.
مصنوع بـ ❤️ بواسطة فريق PyGhidra-MCP