
خادم MCP للتباين الثنائي الآلي.
Diaphora MCP هو خادم MCP (بروتوكول سياق النموذج) للمقارنة الثنائية الآلية. يربط بين Diaphora (محرك المقارنة) و IDA Pro (مفكك التجميع) عبر بروتوكول MCP، مما يسمح للوكلاء الذكيين (مثل 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 (ساعتين).
يستخدم Codex عادةً خادمي MCP متكاملين:
diaphora-mcp — هذا المشروع: التصدير، مقارنة Diaphora، وتحليل النتائج؛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 → مقارنة → تقرير ملخص
┃ 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. تحليل أمني لنتائج المقارنة
┃ 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 للحصول على نص كامل خطوة بخطوة لجلسة حقيقية مع Diaphora MCP — من تصدير قاعدتي بيانات IDB إلى مقارنة الدوال الفردية. متوفر أيضاً باللغة الروسية.
إليك لمحة سريعة عما يعيده الخادم:
الإدخال — مقارنة ملفي SQLite3 DLL (2015 مقابل 2023):
{"idb1_path": "old.i64", "idb2_path": "new.i64", "use_decompiler": false}
الإخراج — ملخص بعد التصدير + المقارنة:
{
"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 # المقارنة وقارئ نتائج .diaphora
│ │ ├── analysis.py # البحث عن الدوال، المقارنة، التفسير
│ │ ├── security.py # مطابقة الكلمات الرئيسية، كشف التصحيحات
│ │ ├── ranking.py # ترتيب الأهمية
│ │ ├── graph.py # رسم الاستدعاءات، أشجار BFS، السبب الجذري
│ │ ├── metadata.py # إعداد البيانات الوصفية (الأسماء، التعليقات)
│ │ └── report.py # إنشاء تقرير التصحيح الكامل
│ └── utils/
│ ├── sqlite.py # مساعدات SQLite
│ ├── format.py # مقارنة الكود الزائف، استخراج متجه الميزات
│ └── log.py # أدوات تسجيل التصدير
├── _diaphora_headless.py # idat.exe -S غلاف رقيق
└── logs/ # سجلات التصدير الآلية (تُنشأ ديناميكياً)
| الأداة | الوصف |
|---|---|
export_idb_to_diaphora | يصدر قاعدة بيانات .i64/.idb إلى تنسيق SQLite باستخدام IDA بدون واجهة |
batch_export_and_diff | مسار كامل: تصدير أساسي → تصدير ثانوي → مقارنة → ملخص |
| الأداة | الوصف |
|---|---|
diff_diaphora_dbs | يقارن بين قاعدتي بيانات Diaphora SQLite تم تصديرهما |
get_diff_results | يقرأ ملف المقارنة .diaphora مع إمكانية التصفية |
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 | يهيئ الأسماء والتعليقات والنماذج الأولية للنقل المجمع |
يتضمن المشروع تكاملاً مدمجاً مع جلسات IDA Pro GUI النشطة، مما يتيح التصدير الفوري مباشرة من نوافذ IDA النشطة دون تعارضات في إغلاق قاعدة البيانات.
plugins/ الخاص بـ IDA Pro. سيبدأ خادم XML-RPC في الخلفية على المنفذ 28652 كلما بدأ IDA.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 في تكوين 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 أثناء العمل، تحقق من الأمثلة التالية:
إذا كنت مساعد برمجة ذكي (مثل Claude Code) يستخدم هذا البروتوكول، ضع في اعتبارك قواعد التوافق التالية:
أنماط التصدير عبر GUI مقابل بدون واجهة:
ida_mcp.py) ينتج مخططاً مخصصاً يحتوي على جداول مثل calls، strings، structures، لكن لا يحتوي على جدول program.idat.exe) ينتج مخطط Diaphora الرسمي الذي يحتوي على جدول program.diff_diaphora_dbs) يتطلب المخطط الرسمي. قم دائماً بالتصدير بدون واجهة إذا كنت تنوي مقارنة/تمييز قواعد البيانات.قواعد البيانات المؤمنة في GUI:
تجنب تعارض أسماء قواعد البيانات:
<basename>.diaphora.sqlite.<basename>.sqlite لتصديرات Diaphora، حيث يتعارض ذلك مع قاعدة البيانات المخبأة الداخلية التي ينشئها المشرف .تجاوزت تركيبات IDA Pro 9.3 المختبرة مجموعة اختبارات الانحدار: 16 passed, 1 xpassed. تم أيضاً التحقق من تصدير مرحلي حقيقي ومقارنة Diaphora لملفي SQLite3 DLL. لا تزال قواعد البيانات الكبيرة أو المفتوحة عبر GUI تتطلب قفلاً حراً لـ 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 | مترجم 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 | يسترجع البيانات الوصفية العامة لقاعدة البيانات |
ida-pro-mcp