
خادم MCP للتباين الثنائي الآلي.
قارن بين ملفين ثنائيين تم تحليلهما بواسطة IDA من مساعد الذكاء الاصطناعي الخاص بك. يقوم Diaphora MCP بتصدير قواعد بيانات IDA المحفوظة، وتشغيل Diaphora، ويتيح للذكاء الاصطناعي فحص الدوال المتناظرة ومخططات الاستدعاء الخاصة بها.
تحتوي الواجهة الافتراضية على 10 أدوات تركز على المقارنة. يوفر Diaphora المطابقات؛ ويقرأ الذكاء الاصطناعي الكود الفعلي ويشرح التغييرات.
البدء السريع · أمثلة · الأدوات · استكشاف الأخطاء وإصلاحها
old.i64 + new.i64 → headless export → SQLite exports + diff results
↓
summary → matched code → call graph
idat.exe/idat64، وإضافة Diaphora مثبتة..i64/.idb.يتم تثبيت IDA وDiaphora بشكل منفصل. يستهدف التحقق من صحة مخطط الفروقات حاليًا Diaphora 3.4.1؛ قد تحتاج المخططات الأخرى إلى تحديثات توافق. يجب أن يكون مفسر Python المستخدم للفرق مثبتًا عليه تبعيات Diaphora المستقلة.
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
New-Item -ItemType Directory -Force C:\diaphora-outputs | Out-Null
أضف هذا الإدخال إلى تكوين MCP الخاص بعميلك. استبدل مسارات المستودع وIDA وDiaphora بمسارات التثبيت الخاصة بك. استخدم ملف Python التنفيذي من البيئة التي ثبّت فيها هذا المشروع.
{
"mcpServers": {
"diaphora": {
"command": "C:/src/diaphora-mcp/.venv/Scripts/python.exe",
"args": ["C:/src/diaphora-mcp/diaphora_mcp_server.py"],
"env": {
"IDAT_PATH": "C:/Program Files/IDA Professional 9.3/idat.exe",
"DIAPHORA_DIR": "C:/Program Files/IDA Professional 9.3/plugins/diaphora",
"DIAPHORA_OUTPUT_ROOT": "C:/diaphora-outputs"
}
}
}
}
يشغّل العميل الخادم عبر stdio؛ لا توجد خدمة ويب منفصلة لبدء تشغيلها. أعد تشغيل خادم MCP بعد تغيير الكود أو البيئة الخاصة به. الاتصال الناجح يعرض الأدوات العشر المذكورة أدناه.
Use Diaphora to compare C:/analysis/old.i64 (old) against
C:/analysis/new.i64 (new). Save output under C:/diaphora-outputs/run-001.
Export headlessly with assembly detail, keep the exports, show a summary,
then inspect partial matches and explain the code changes in the interesting
functions. Use the result mapping when comparing functions and call graphs.
اختر دليل تشغيل جديدًا في كل مرة. لا يتم استبدال الأهداف المُنشأة الموجودة أبدًا.
كتل JSON التالية هي وسائط أدوات MCP، وليست أوامر shell. يمكن لمساعدك استدعاء الأدوات المذكورة مباشرة. المسارات و0x401000 أمثلة؛ استخدم المسارات والعناوين التي أرجعها تشغيلك الخاص.
الأداة: batch_export_and_diff. القديم دائمًا هو الإدخال الأول، والجديد هو الثاني.
{
"idb1_path": "C:/analysis/old.i64",
"idb2_path": "C:/analysis/new.i64",
"output_dir": "C:/diaphora-outputs/run-001",
"export_mode": "headless",
"use_decompiler": false,
"summaries_only": false,
"cleanup": false,
"limit": 100,
"unmatched_limit": 50
}
يحافظ هذا على تفاصيل التجميع دون الحاجة إلى Hex-Rays. اختر ملف تعريف التصدير الذي تحتاجه:
| التفاصيل | use_decompiler | summaries_only | الاستخدام |
|---|---|---|---|
| ملخصات المطابقة | false | true | تمريرة أولى سريعة؛ بدون كود مفصّل |
| التجميع | false | false | مقارنة التفكيك بدون مُفكِّك |
| التجميع + الكود الزائف | true | false | مراجعة الكود باستخدام مُفكِّك Hex-Rays متوافق؛ أبطأ |
خذ دائمًا مسارات الإخراج من الاستجابة:
OLD_SQLITE = steps.export1.output
NEW_SQLITE = steps.export2.output
RESULTS = steps.diff.output
في هذا المثال، الملفات المُنشأة هي old.diaphora.sqlite وnew.diaphora.sqlite وold_vs_new.diaphora تحت run-001. أسماء الإدخال الأساسية المتساوية تنتج أسماء تصدير مميزة old_/new_. أبقِ cleanup=false لفحص الدوال لاحقًا.
الأداة: get_diff_summary.
{
"results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora"
}
الأداة: get_diff_results. تبدأ هذه الصفحة بمطابقات جزئية ذات نسبة أقل.
{
"results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora",
"match_type": "partial",
"min_ratio": 0.0,
"limit": 50,
"offset": 0,
"unmatched_limit": 50,
"unmatched_offset": 0,
"sort_by": "ratio",
"sort_order": "asc"
}
يحدد partial فئة مطابقة Diaphora، وليس ضمانًا لتغيير سلوكي. استخدم match_type="all" لجميع الفئات المدعومة. تتضمن الاستجابة عدد الفئات، والإجمالي المفلتر، والمطابقات، والصفوف غير المتطابقة، وnext_offset وnext_unmatched_offset.
للمتابعة، انسخ الإزاحات التالية المُرجعة إلى الاستدعاء التالي، مع الحفاظ على نفس المرشحات والترتيب. على سبيل المثال، إذا كانتا 50 و50، استخدم offset=50 وunmatched_offset=50. تعني الإزاحة التالية null أن تلك القائمة انتهت؛ توقف عن تقدّمها. تتقدم القائمتان بشكل مستقل. يجب أن تكون أحجام الصفحات موجبة ويتم تحديدها بحد أقصى 5000. استخدم sort_order="desc" لفحص أقوى المطابقات أولاً.
الأداة: compare_functions.
{
"db1_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"db2_path": "C:/diaphora-outputs/run-001/new.diaphora.sqlite",
"address": "0x401000",
"match_results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora"
}
تحتوي الاستجابة على function_old وfunction_new، والتجميع/الكود الزائف المتاح، والاختلافات المقاسة، وأدلة الهوية. يمكنك استخدام name بدلاً من address. إذا تم توفير كلا المحددين، فإن العنوان له الأولوية؛ احذفه عند الاختيار بالاسم.
الأداة: get_changed_callgraph تقبل نفس الوسائط أعلاه. تترجم عناوين المستدعي/المستدعى المتناظرة قبل الإبلاغ عن التغييرات، وتفصل الجيران غير المحلولين عن فروقات الحواف المؤكدة.
فضّل العناوين المسبوقة بـ 0x لجعل الإدخال السداسي عشري صريحًا. وفّر match_results_path عند توفره: فهو يتعامل مع إعادة التأسيس والدوال المعاد تسميتها. العناوين المتساوية وحدها لا تثبت الهوية. تبقى المطابقات الغامضة أو المفقودة غير محلولة بدلاً من اعتبارها عمليات حذف. إذا تحققت يدويًا من زوج، يمكنك توفير address2 أو name2 بشكل صريح.
الأداة: search_export_db. يستخدم name_pattern SQL LIKE: % يطابق أي تسلسل.
{
"db_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"name_pattern": "%parse%",
"min_instructions": 20,
"limit": 20
}
الأداة: get_function_pseudocode تُرجع الكود الزائف المتاح والتجميع، رغم اسمها.
{
"db_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"address": "0x401000"
}
إذا كان الكود الزائف فارغًا، أعد تشغيل التصدير إلى دليل تشغيل جديد مع use_decompiler=true وsummaries_only=false، باستخدام مُفكِّك متوافق. استخدم get_export_info مع db_path لفحص بيانات التصدير الوصفية.
الأداة: diff_diaphora_dbs. هذا يتخطى تصدير IDA ويقارن صادرات SQLite الرسمية الموجودة.
{
"db1_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"db2_path": "C:/diaphora-outputs/run-001/new.diaphora.sqlite",
"output_path": "C:/diaphora-outputs/another-diff.diaphora"
}
لتصدير جديد واحد، استخدم export_idb_to_diaphora مع idb_path، وoutput_path جديد، وexport_mode="headless".