
خادم MCP لـ Binary Ninja بدون واجهة — يمنح وكلاء الذكاء الاصطناعي قدرات عميقة في الهندسة العكسية عبر 180 أداة.
خادم Binary Ninja بدون واجهة رسومية يتحدث MCP (بروتوكول سياق النموذج)، مما يمنح وكلاء الذكاء الاصطناعي وصولاً كاملاً إلى سير عمل الهندسة العكسية العميقة — التفكيك، اللغة الوسيطة، التصحيح، الأنواع، المراجع المتقاطعة، والمزيد — بدون واجهة مستخدم.
مُصمم للتشغيل داخل نفس حاوية Docker التي يعمل فيها وكيل runtime. لا مكونات جانبية، لا خدمات إضافية.
هذا المشروع بأكمله — الكود، الاختبارات، والتوثيق — تمت برمجته بنسبة 100% باستخدام الـ vibe coding.
خوادم Binary Ninja MCP الحالية إما مقيدة بواجهة المستخدم الرسومية أو تقدم سطح أدوات محدود. هذا الخادم مخصص لوضع headless فقط ومصمم لسير العمل المدفوعة بالوكيل في بيئات الحاويات/الأجهزة الافتراضية المعزولة: يحصل الوكيل على السيطرة الكاملة على نظام التحليل، مما يؤتمت أجزاء كبيرة من الهندسة العكسية بينما تتفاعل أنت وتوجه العملية بشكل تفاعلي.
الهدف هو واجهة يمكن للوكلاء من خلالها فحص التحليل وتحسينه وتوسيعه بمرور الوقت — تحديث الأنواع والرموز والبيانات الوصفية، وتحسين قاعدة بيانات التحليل تدريجياً، وتطبيق التصحيحات والتكرار بأمان مع خيارات التراجع والإعادة، وتشغيل البرامج النصية المخصصة عندما يتطلب سير العمل شيئاً خاصاً.
binja.eval و binja.call لأي شيء لا يشمله كتالوج الأدوات.3.11+binaryninja القابلة للاستيراد في بيئة التشغيل الخاصة بك (للتحليل الحقيقي)git clone https://github.com/mrphrazer/binary-ninja-headless-mcp.git
cd binary-ninja-headless-mcp
pip install .
أو قم بالتثبيت مباشرة من جذر المستودع بدون استنساخ:
pip install git+https://github.com/mrphrazer/binary-ninja-headless-mcp.git
نقل عبر stdio (الافتراضي):
python3 binary_ninja_headless_mcp.py
نقل عبر TCP:
python3 binary_ninja_headless_mcp.py --transport tcp --host 127.0.0.1 --port 8765
وضع الواجهة الخلفية المزيفة (لا يتطلب Binary Ninja):
python3 binary_ninja_headless_mcp.py --fake-backend
يتحدث هذا الخادم بروتوكول MCP القياسي عبر stdio (الافتراضي) أو tcp، لذا يمكن لأي مضيف وكيل يدعم MCP استخدامه.
claude mcp add binary_ninja_headless_mcp -- python3 /path/to/binary-ninja-headless-mcp/binary_ninja_headless_mcp.py
أو أضفه إلى .mcp.json الخاص بمشروعك:
{
"mcpServers": {
"binary_ninja_headless_mcp": {
"command": "python3",
"args": ["binary_ninja_headless_mcp.py"],
"cwd": "/path/to/binary-ninja-headless-mcp"
}
}
}
codex mcp add binary_ninja_headless_mcp -- python3 binary_ninja_headless_mcp.py
binary_ninja_headless_mcp.python3 مع الوسائط ["binary_ninja_headless_mcp.py"] عندما يكون cwd هو جذر المستودع، أو استخدم مسارًا مطلقًا للبرنامج النصي في args.cwd على مسار المستودع إذا كنت تريد أن تعمل المسارات النسبية مثل samples/ls بشكل صحيح.--fake-backend.health.ping، ثم session.open.نموذج النشر الموصى به: تشغيل عملية الوكيل وخادم MCP هذا في نفس صورة الحاوية.
مثال أساسي:
FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN python -m pip install --upgrade pip && pip install ruff pytest
CMD ["python3", "binary_ninja_headless_mcp.py"]
إذا كنت بحاجة إلى تحليل Binary Ninja حقيقي داخل الحاوية، أضف بيئة تشغيل Binary Ninja الخاصة بك + إعداد الترخيص في نفس الصورة وابدأ الوكيل مع تكوين خادم MCP هذا.
initializepingtools/listtools/callshutdownسلوك tools/list:
offset أو limit، يستخدم إخراجًا مقسمًا إلى صفحات (offset=0, limit=50 بشكل افتراضي في وضع الصفحات).prefix (مثلاً binary.)query (مطابقة جزئية لاسم الأداة/الوصف)offset, limit, total, has_more.has_more=true)، يتضمن next_offset وتلميح notice.سلوك استجابة استدعاء الأداة:
structuredContent هو الحمولة الكاملة الأساسية.content[0].text هو سلسلة ملخص مضغوطة (ليست تكرار JSON كاملاً).هذا المستودع مختبر جيداً وله بوابات جودة إلزامية.
pytest --collect-only -q للحصول على عدد الاختبارات المجمعة الحالي.ruff format --check .ruff check .pytestBINARY_NINJA_HEADLESS_MCP_FAKE_BACKEND=1 حتى تعمل الفحوصات دون الحاجة إلى تثبيت Binary Ninja.read_only=true).binary.basic_blocks_at و function.basic_blocks مقسمة إلى صفحات (offset/limit).memory.read له حد أقصى للاستجابة: length <= 65536.stdio/tcp) غير مصادق عليها بشكل افتراضي.binja.eval ووصولاً واسعاً لواجهة برمجة التطبيقات عبر binja.call.ruff format --check .
ruff check .
BINARY_NINJA_HEADLESS_MCP_FAKE_BACKEND=1 pytest -q
استخدم مدمج اختبار الميزات (MCP feature fuzzer) المدمج لاختبار سطح أدوات واسع مقابل samples/ls.
واجهة خلفية حقيقية لـ Binary Ninja:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --iterations 120 --seed 1337
تشغيل اختبار دخاني بالواجهة الخلفية المزيفة:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --fake-backend --iterations 20
كتابة تقرير تغطية بتنسيق JSON:
python3 -m binary_ninja_headless_mcp.fuzzer --binary samples/ls --report-json /tmp/mcp-fuzzer-report.json
علامات مفيدة:
--min-success-tools N: يخرج برمز غير صفري إذا نجحت أدوات أقل من N.--verbose: طباعة كل استدعاء أداة أثناء الاختبار.--update-analysis: فتح الجلسة الأولية مع update_analysis=true.يعرض الخادم حالياً 181 أداة عبر 36 مجموعة ميزات.
analysis.status: الحصول على حالة التحليل.analysis.progress: الحصول على لقطة للتقدم في التحليل.analysis.update: تشغيل تحديث تحليل غير متزامن.analysis.update_and_wait: تشغيل تحديث تحليل وانتظار الاكتمال.analysis.abort: إلغاء التحليل.analysis.set_hold: تعليق/تحرير قائمة انتظار التحليل.annotation.rename_function: إعادة تسمية دالة.annotation.rename_symbol: إعادة تسمية رمز في عنوان.annotation.undefine_symbol: إلغاء تعريف رمز مستخدم في عنوان.annotation.define_symbol: تعريف رمز في عنوان.annotation.rename_data_var: إعادة تسمية متغير بيانات.annotation.define_data_var: تعريف متغير بيانات.annotation.undefine_data_var: إلغاء تعريف متغير بيانات.annotation.set_comment: تعيين تعليق في عنوان.annotation.get_comment: الحصول على تعليق في عنوان.annotation.add_tag: إضافة علامة بيانات مستخدم في عنوان.annotation.get_tags: الحصول على العلامات في عنوان.arch.info: الحصول على بيانات تعريف المعمارية والمنصة.arch.disasm_bytes: تفكيك بايتات باستخدام معمارية محددة.arch.assemble: تجميع نص تعليمة باستخدام معمارية محددة.baseaddr.detect: تشغيل كشف العنوان الأساسي.baseaddr.reasons: الحصول على أسباب كشف العنوان الأساسي.baseaddr.abort: إلغاء كشف العنوان الأساسي.binary.summary: الحصول على ملخص ثنائي/جلسة.binary.save: حفظ العرض الثنائي الحالي إلى مسار ملف.binary.functions: سرد الدوال مع ترقيم الصفحات.binary.strings: سرد السلاسل المكتشفة مع ترقيم الصفحات.binary.search_text: البحث عن نص/بايتات خام في جلسة.binary.sections: سرد الأقسام مع ترقيم الصفحات.binary.segments: سرد القطاعات مع ترقيم الصفحات.binary.symbols: سرد الرموز مع ترقيم الصفحات.binary.data_vars: سرد متغيرات البيانات مع ترقيم الصفحات.binary.get_function_at: العثور على دالة حسب العنوان.binary.get_function_disassembly_at: الحصول على التفكيك الكامل للدالة التي تحتوي على عنوان.binary.get_function_il_at: الحصول على اللغة الوسيطة الكاملة للدالة التي تحتوي على عنوان.binja.info: إرجاع معلومات إصدار/تثبيت Binary Ninja.binja.call: جسر عام لواجهة برمجة التطبيقات: استدعاء مسار bn.* أو bv.*.binja.eval: تقييم كود Python مع bn, sessions, و bv اختياري.data.typed_at: الحصول على متغير بيانات بنوع في عنوان.database.create_bndb: إنشاء ملف .bndb من الجلسة.database.save_auto_snapshot: حفظ لقطة تلقائية.database.info: الحصول على حالة قاعدة بيانات الجلسة.database.snapshots: سرد لقطات قاعدة البيانات.database.read_global: قراءة مفتاح سلسلة عام من قاعدة البيانات.database.write_global: كتابة مفتاح سلسلة عام لقاعدة البيانات.debug.parsers: سرد محللات معلومات التصحيح الصالحة لهذا العرض.debug.parse_and_apply: تحليل معلومات التصحيح وتطبيقها على العرض.disasm.linear: الحصول على سطور تفكيك خطي.disasm.function: الحصول على التفكيك الكامل للدالة التي تحتوي على عنوان.disasm.range: سطور تفكيك نطاق العنوان.external.library_add: إضافة مكتبة خارجية.external.library_list: سرد المكتبات الخارجية.external.library_remove: إزالة مكتبة خارجية.external.location_add: إضافة تعيين موقع خارجي.external.location_get: الحصول على تعيين موقع خارجي.external.location_remove: إزالة تعيين موقع خارجي.function.basic_blocks: سرد الكتل الأساسية في دالة مع ترقيم الصفحات.function.callers: مستدعو الدالة.function.callees: الدوال المستدعاة من الدالة.function.variables: سرد متغيرات الدالة.function.var_refs: سرد مراجع المتغيرات في MLIL/HLIL.function.var_refs_from: سرد مراجع المتغيرات الناشئة من عنوان.function.ssa_var_def_use: الحصول على تعريف واستخدامات متغير SSA.function.ssa_memory_def_use: الحصول على تعريف واستخدامات ذاكرة SSA حسب إصدار الذاكرة.function.metadata_store: تخزين بيانات وصفية للدالة بواسطة مفتاح.function.metadata_query: استعلام بيانات وصفية للدالة بواسطة مفتاح.function.metadata_remove: إزالة بيانات وصفية للدالة بواسطة مفتاح.health.ping: فحص الصحة.il.function: سرد دالة IL.il.instruction_by_addr: الحصول على تعليمة IL حسب عنوان المصدر.il.address_to_index: تعيين عنوان إلى فهرس/فهارس IL.il.index_to_address: تعيين فهرس IL إلى عنوان المصدر.il.rewrite.capabilities: سرد دعم إعادة كتابة IL لدالة واحدة ومستوى IL.il.rewrite.noop_replace: إجراء استبدال تعبير IL بدون عملية.il.rewrite.translate_identity: ترجمة IL باستخدام استدعاء تعيين الهوية.loader.rebase: إعادة قاعدة BinaryView.loader.load_settings_types: سرد أسماء أنواع إعدادات المحمل.loader.load_settings_get: الحصول على قيم إعدادات المحمل.loader.load_settings_set: تعيين قيمة إعداد محمل واحدة.memory.read: قراءة بايتات من العرض (length <= 65536).memory.write: كتابة بايتات (سداسي عشري) إلى العرض.memory.insert: إدراج بايتات (سداسي عشري) إلى العرض.memory.remove: إزالة بايتات من العرض.memory.reader_read: قراءة قيم صحيحة عبر BinaryReader.memory.writer_write: كتابة قيم صحيحة عبر BinaryWriter.mcp.response_format: شرح حقول نتيجة الأداة (structuredContent الحمولة الكاملة، content[0].text الملخص).metadata.store: تخزين بيانات وصفية بواسطة مفتاح.metadata.query: استعلام بيانات وصفية بواسطة مفتاح.metadata.remove: إزالة بيانات وصفية بواسطة مفتاح.patch.assemble: تجميع وكتابة بايتات تعليمة في عنوان.patch.status: فحص توفر التصحيح في عنوان.patch.convert_to_nop: تحويل التعليمة إلى NOP عندما يكون مدعوماً.patch.always_branch: تحويل الفرع الشرطي إلى فرع دائم عندما يكون مدعوماً.patch.never_branch: تحويل الفرع الشرطي إلى عدم فرع أبداً عندما يكون مدعوماً.patch.invert_branch: تحويل الفرع الشرطي بالعكس عندما يكون مدعوماً.patch.skip_and_return_value: تحويل التعليمة إلى تخطي وإرجاع قيمة عندما يكون مدعوماً.plugin.valid_commands: سرد أوامر الإضافة الصالحة في السياق.plugin.execute: تنفيذ أمر إضافة صالح في السياق.plugin_repo.status: سرد مستودعات الإضافات وحالات الإضافات.plugin_repo.check_updates: التحقق من تحديثات مستودع الإضافات.plugin_repo.plugin_action: تشغيل إجراء تثبيت/إلغاء تثبيت/تمكين/تعطيل على إضافة مستودع.project.create: إنشاء مشروع.project.open: فتح مشروع.project.close: إغلاق مشروع متتبع.project.list: سرد مجلدات/ملفات المشروع.project.create_folder: إنشاء مجلد مشروع.project.create_file: إنشاء ملف مشروع من بيانات base64.project.metadata_store: تخزين بيانات وصفية للمشروع.project.metadata_query: استعلام بيانات وصفية للمشروع.project.metadata_remove: إزالة بيانات وصفية للمشروع.search.data: البحث عن أنماط بايتات خام (سلسلة سداسية عشرية).search.next_text: العثور على تطابق نصي تالي.search.all_text: العثور على جميع التطابقات النصية في نطاق (تعبير عادي اختياري).search.next_data: العثور على تطابق بيانات/نمط بايت تالي.search.all_data: العثور على جميع تطابقات بيانات/نمط بايت في نطاق.search.next_constant: العثور على حدوث ثابت تالي.search.all_constant: العثور على جميع حدوثات الثابت في نطاق.section.add_user: إضافة قسم مستخدم.section.remove_user: إزالة قسم مستخدم.segment.add_user: إضافة قطاع مستخدم.segment.remove_user: إزالة قطاع مستخدم.session.open: فتح ثنائي وإنشاء جلسة.session.open_bytes: فتح جلسة ثنائية من بايتات مشفرة بـ base64.session.open_existing: فتح جلسة أخرى من ملف جلسة موجودة.session.close: إغلاق جلسة مفتوحة واحدة.session.list: سرد الجلسات المفتوحة.session.mode: الحصول على وضع الأمان/الحتمية للجلسة.session.set_mode: تحديث وضع الأمان/الحتمية للجلسة.task.analysis_update: بدء مهمة تحديث تحليل غير متزامن.task.search_text: بدء مهمة بحث غير متزامنة.task.status: الحصول على حالة المهمة.task.result: الحصول على نتيجة المهمة.task.cancel: إلغاء المهمة (أفضل جهد).transform.inspect: فحص/معالجة خط أنابيب استخراج التحويل.type.parse_string: تحليل سلسلة نوع واحدة.type.parse_declarations: تحليل تصريحات C للأنواع/المتغيرات/الدوال.type.define_user: تعريف نوع مستخدم من مصدر النوع.type.rename: إعادة تسمية نوع.type.undefine_user: إلغاء تعريف نوع مستخدم.type.import_library_type: استيراد نوع من مكتبة أنواع.type.import_library_object: استيراد نوع كائن من مكتبة أنواع.type.export_to_library: تصدير نوع إلى مكتبة أنواع.type_archive.create: إنشاء وإرفاق أرشيف أنواع اختيارياً.type_archive.open: فتح وإرفاق أرشيف أنواع اختيارياً.type_archive.list: سرد أرشيفات الأنواع المرفقة.type_archive.get: الحصول على أرشيف أنواع متتبع واحد.type_archive.pull: سحب الأنواع من أرشيف أنواع.type_archive.push: دفع الأنواع إلى أرشيف أنواع.type_archive.references: استعلام المراجع الواردة/الصادرة من الأرشيف لنوع واحد.type_library.create: إنشاء وإرفاق مكتبة أنواع اختيارياً.type_library.load: تحميل وإرفاق مكتبة أنواع اختيارياً.type_library.list: سرد مكتبات الأنواع المرفقة بالعرض.type_library.get: الحصول على مكتبة أنواع متتبعة واحدة.uidf.parse_possible_value: تحليل سلسلة مجموعة القيم المحتملة المقدمة من المستخدم.uidf.set_user_var_value: تعيين قيمة متغير مستخدم للدالة.uidf.clear_user_var_value: مسح قيمة متغير مستخدم للدالة.uidf.list_user_var_values: سرد جميع قيم متغيرات المستخدم لدالة.undo.begin: بدء معاملة تراجع.undo.commit: تأكيد معاملة تراجع.undo.revert: إلغاء معاملة تراجع.undo.undo: تنفيذ تراجع.undo.redo: تنفيذ إعادة.value.reg: الحصول على قيمة تسجيل عند/بعد عنوان.value.stack: الحصول على محتويات المكدس عند/بعد عنوان.value.possible: الحصول على مجموعة القيم المحتملة IL عند عنوان.value.flags_at: الحصول على حالة قراءة/كتابة علم IL المرفوع عند عنوان.workflow.list: سرد سير العمل المسجلة.workflow.describe: وصف طوبولوجيا سير العمل والإعدادات.workflow.clone: استنساخ سير العمل.workflow.insert: إدراج أنشطة قبل نشاط.workflow.insert_after: إدراج أنشطة بعد نشاط.workflow.remove: إزالة نشاط سير العمل.workflow.graph: تلخيص رسم بياني لسير العمل.workflow.machine.status: الحصول على حالة آلة سير العمل.workflow.machine.control: التحكم في وقت تشغيل آلة سير العمل.xref.code_refs_to: مراجع كود إلى عنوان.xref.code_refs_from: مراجع كود من عنوان.xref.data_refs_to: مراجع بيانات إلى عنوان.xref.data_refs_from: مراجع بيانات من عنوان.لمزيد من المعلومات، اتصل بـ Tim Blazytko (@mr_phrazer).
binary.functions_at: سرد الدوال في عنوان.binary.basic_blocks_at: سرد الكتل الأساسية في عنوان مع ترقيم الصفحات.