
diaphora-mcp v1.0.5
خادم MCP للتباين الثنائي الآلي.
Diaphora MCP
Diaphora MCP هو خادم MCP (بروتوكول سياق النموذج) للمقارنة الثنائية الآلية. يربط بين Diaphora (محرك المقارنة) و IDA Pro (مفكك التجميع) عبر بروتوكول MCP، مما يسمح للوكلاء الذكيين (مثل Claude Code) بإجراء مقارنة الملفات الثنائية، والعثور على التصحيحات الأمنية، وتحليل التغييرات.
الميزات
- التصدير: يحول قواعد بيانات
.i64/.idbالتي تم تحليلها إلى تنسيق Diaphora SQLite (عبر وضعidat.exeبدون واجهة) - المقارنة: يقارن بين قاعدتي بيانات تم تصديرهما، ويصفّي النتائج حسب نوع المطابقة والنسبة
- تحليل الثغرات: يبحث عن التغييرات ذات الصلة بالأمان باستخدام مطابقة الكلمات الرئيسية والإرشادات الاستدلالية
- كشف التصحيحات: يكتشف تلقائياً عمليات التحقق الجديدة من الحدود، والتحقق من القيم الفارغة، ومعالجة الأخطاء، والتغييرات في التشفير
- الترتيب: يرتب الدوال المتغيرة حسب الأهمية بناءً على CFG، والقفزات المعقدة، والمؤشرات الأمنية
- رسم بياني للاستدعاءات: يقارن مسارات الاستدعاء (BFS، حتى N مستويات)، ويكشف تغييرات السبب الجذري في تسلسلات الاستدعاء
- نقل البيانات الوصفية: يهيئ الأسماء والتعليقات والنماذج الأولية للنقل بين قواعد البيانات
- التكامل مع IDA Pro MCP: جميع الأدوات تُرجع العناوين ومسارات قواعد البيانات الجاهزة للإرسال مباشرة إلى أدوات IDA Pro MCP
التثبيت
1. المتطلبات
- Python 3.10+
- IDA Pro 8.x / 9.x (للتصدير بدون واجهة عبر
idat.exe) - إضافة Diaphora المثبتة في IDA
- Claude Code (أو أي عميل متوافق مع MCP)
2. تثبيت الحزمة
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
3. إعداد المسارات
يحاول الحزمة العثور تلقائياً على IDA Pro و Diaphora في مواقع التثبيت القياسية. إذا لم يتم العثور عليهما، يمكنك تعيين متغيرات البيئة التالية:
| المتغير | الوصف | مثال |
|---|---|---|
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) |
بالنسبة لـ 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 (ساعتين).
3.1. Codex و IDA MCP بدون واجهة
يستخدم 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
4. تحضير قواعد البيانات للمقارنة
يجب على 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/ # سجلات التصدير الآلية (تُنشأ ديناميكياً)
مرجع أدوات MCP (21 أداة)
التصدير
| الأداة | الوصف |
|---|---|
export_idb_to_diaphora | يصدر قاعدة بيانات .i64/.idb إلى تنسيق SQLite باستخدام IDA بدون واجهة |
batch_export_and_diff | مسار كامل: تصدير أساسي → تصدير ثانوي → مقارنة → ملخص |
المقارنة
| الأداة | الوصف |
|---|---|
diff_diaphora_dbs | يقارن بين قاعدتي بيانات Diaphora SQLite تم تصديرهما |
get_diff_results | يقرأ ملف المقارنة .diaphora مع إمكانية التصفية |
get_diff_summary | يعيد إحصائيات المطابقة |
التحليل
| الأداة | الوصف |
|---|---|
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 | يسترجع البيانات الوصفية العامة لقاعدة البيانات |
الأمان
| الأداة | الوصف |
|---|---|
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 (جسر XML-RPC)
يتضمن المشروع تكاملاً مدمجاً مع جلسات IDA Pro GUI النشطة، مما يتيح التصدير الفوري مباشرة من نوافذ IDA النشطة دون تعارضات في إغلاق قاعدة البيانات.
- البدء التلقائي: انسخ diaphora_gui_listener.py إلى دليل
plugins/الخاص بـ IDA Pro. سيبدأ خادم XML-RPC في الخلفية على المنفذ28652كلما بدأ IDA. - التصدير الذكي: عند استدعاء
export_idb_to_diaphora، يتحقق خادم MCP من المنفذ28652. إذا كانت هناك جلسة نشطة، فإنه ينفذ التصدير مباشرة في GUI. وإلا، فإنه يتراجع تلقائياً إلى التنفيذ الخلفي بدون واجهة عبرidat.exe.
للحصول على تعليمات مفصلة حول تكوين الجسر، انظر GUI_INSTRUCTIONS.md.
التعامل مع قواعد البيانات الضخمة جداً (100k+ دالة)
عند معالجة مشاريع كبيرة جداً، يطبق Diaphora MCP تحسينات محددة:
- حد التكرار: يتم رفع حد التكرار في Python تلقائياً إلى
100000(sys.setrecursionlimit) لمنع الأعطال أثناء تجول الرسوم البيانية الكبيرة للاستدعاءات. - تحسينات معاملات SQLite: في ملف
diaphora_config.pyالخاص بك، يؤدي تعيينCOMMIT_AFTER_EACH_GUI_UPDATE = Falseإلى تقليل عمليات الكتابة على القرص، مما يسرع التصدير عبر GUI بمقدار 2 إلى 3 مرات. - الكود الصغير لـ Hex-Rays: قم بتعطيل تصدير الكود الصغير (
EXPORTING_USE_MICROCODE = Falseفي تكوين Diaphora) من أجل تصدير أسرع عندما لا يكون مفكك التجميع مطلوباً بشكل صارم.
تكامل IDA Pro MCP
أدوات مثل 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 أثناء العمل، تحقق من الأمثلة التالية:
- نص جلسة أساسية: تجول حقيقي لجلسة MCP مع JSON دقيق للإدخال/الإخراج لكل استدعاء أداة — من التصدير إلى مقارنة الدوال. متوفر أيضاً باللغة الروسية.
إرشادات للوكيل الذكي (مهم)
إذا كنت مساعد برمجة ذكي (مثل Claude Code) يستخدم هذا البروتوكول، ضع في اعتبارك قواعد التوافق التالية:
-
أنماط التصدير عبر GUI مقابل بدون واجهة:
- التصدير عبر جلسة GUI نشطة (إضافة
ida_mcp.py) ينتج مخططاً مخصصاً يحتوي على جداول مثلcalls،strings،structures، لكن لا يحتوي على جدولprogram. - التصدير بدون واجهة (عبر
idat.exe) ينتج مخطط Diaphora الرسمي الذي يحتوي على جدولprogram. - مهم: محرك المقارنة (
diff_diaphora_dbs) يتطلب المخطط الرسمي. قم دائماً بالتصدير بدون واجهة إذا كنت تنوي مقارنة/تمييز قواعد البيانات.
- التصدير عبر جلسة GUI نشطة (إضافة
-
قواعد البيانات المؤمنة في GUI:
- قاعدة البيانات المفتوحة حالياً في IDA Pro GUI تكون مؤمنة. محاولة تصديرها بدون واجهة ستفشل.
- إذا كنت بحاجة إلى مقارنة قاعدة البيانات المفتوحة حالياً، اطلب من المستخدم إغلاقها في GUI (أو فتح قاعدة بيانات وهمية) لتحرير قفل الملف، ثم قم بتشغيل تصدير بدون واجهة.
-
تجنب تعارض أسماء قواعد البيانات:
- قواعد بيانات تصدير Diaphora تكون افتراضياً
<basename>.diaphora.sqlite. - لا تستخدم أبداً
<basename>.sqliteلتصديرات Diaphora، حيث يتعارض ذلك مع قاعدة البيانات المخبأة الداخلية التي ينشئها المشرفida-pro-mcp.
- قواعد بيانات تصدير Diaphora تكون افتراضياً
حالة التحقق والقيود
تجاوزت تركيبات IDA Pro 9.3 المختبرة مجموعة اختبارات الانحدار: 16 passed, 1 xpassed. تم أيضاً التحقق من تصدير مرحلي حقيقي ومقارنة Diaphora لملفي SQLite3 DLL. لا تزال قواعد البيانات الكبيرة أو المفتوحة عبر GUI تتطلب قفلاً حراً لـ IDA، وقيمة صالحة لـ DIAPHORA_OUTPUT_ROOT، ومهلة كافية لعميل MCP.
الترخيص
MIT