
مساعد هندسة عكسية مدعوم بالذكاء الاصطناعي يربط بين IDA Pro ونماذج اللغة عبر MCP.
Simple MCP Server to allow vibe reversing in IDA Pro.
https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0
The binaries and prompt for the video are available in the mcp-reversing-dataset repository.
idapyswitch للتبديل إلى أحدث إصدار من Pythonida-pro-mcp --config للحصول على إعداد JSON الخاص بعميلك.ملاحظة: يتطلب ذلك تفعيل idalib بشكل عام وتثبيت uv:
# windows
uv run "C:\Program Files\IDA Professional 9.3\idalib\python\py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.3.app/Contents/MacOS/idalib/python/py-activate-idalib.py"
لتثبيت أحدث إصدار من IDA Pro MCP في Claude Code:
claude plugin marketplace add mrexodia/claude-marketplace
claude plugin uninstall ida-pro-mcp@mrexodia
claude plugin install ida-pro-mcp@mrexodia
لتثبيت أحدث إصدار من IDA Pro MCP في Codex:
codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia
لتثبيت أحدث إصدار من IDA Pro MCP في Kimi Code، شغّل هذا الأمر الشرطي في الدردشة:
/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main
/reload
هذا يُثبّت خادم MCP الخاص بـ idalib ومهارة idapython. يتم نسخ الإضافات إلى
$KIMI_CODE_HOME/plugins/managed/، لذا يجب أن يكون uv موجوداً في PATH. الجلسة الأولى بعد
التثبيت ستكون أبطأ، لأن uv يحل التبعيات قبل أن يستجيب الخادم.
ملاحظة: لم يعد يُوصى باستخدام إضافة MCP وسيتم إيقافها في النهاية. استخدم idalib-mcp بدلاً منها.
إذا كنت ترغب في تكوين خادم MCP يدوياً من واجهة IDA الرسومية:
pip uninstall ida-pro-mcp
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip
قم بتكوين خوادم MCP وتثبيت إضافة IDA:
ida-pro-mcp --install
مهم: تأكد من إعادة تشغيل IDA وعميل MCP بالكامل حتى يصبح التثبيت ساري المفعول. بعض العملاء (مثل Claude) تعمل في الخلفية ويجب إغلاقها من أيقونة شريط المهام.
تميل نماذج اللغة الكبيرة (LLMs) إلى الهلوسة وتحتاج إلى أن تكون محدداً في استفساراتك. بالنسبة للهندسة العكسية، يكون التحويل بين الأعداد الصحيحة والبايتات مشكلة خاصة. فيما يلي مثال مصغر على استفسار، لا تتردد في بدء نقاش أو فتح مشكلة إذا حصلت على نتائج جيدة باستفسار مختلف:
Your task is to analyze a crackme in IDA Pro. You can use the MCP tools to retrieve information. In general use the following strategy:
- Inspect the decompilation and add comments with your findings
- Rename variables to more sensible names
- Change the variable and argument types if necessary (especially pointer and array types)
- Change function names to be more descriptive
- If more details are necessary, disassemble the function and add comments with your findings
- NEVER convert number bases yourself. Use the `int_convert` MCP tool if needed!
- Do not attempt brute forcing, derive any solutions purely from the disassembly and simple python scripts
- Create a report.md with your findings and steps taken at the end
- When you find a solution, prompt to user for feedback with the password you found
هذا الاستفسار كان مجرد تجربة أولى، يُرجى المشاركة إذا وجدت طرقاً لتحسين المخرجات!
استفسار آخر بواسطة @can1357:
Your task is to create a complete and comprehensive reverse engineering analysis. Reference AGENTS.md to understand the project goals and ensure the analysis serves our purposes.
Use the following systematic methodology:
1. **Decompilation Analysis**
- Thoroughly inspect the decompiler output
- Add detailed comments documenting your findings
- Focus on understanding the actual functionality and purpose of each component (do not rely on old, incorrect comments)
2. **Improve Readability in the Database**
- Rename variables to sensible, descriptive names
- Correct variable and argument types where necessary (especially pointers and array types)
- Update function names to be descriptive of their actual purpose
3. **Deep Dive When Needed**
- If more details are necessary, examine the disassembly and add comments with findings
- Document any low-level behaviors that aren't clear from the decompilation alone
- Use sub-agents to perform detailed analysis
4. **Important Constraints**
- NEVER convert number bases yourself - use the int_convert MCP tool if needed
- Use MCP tools to retrieve information as necessary
- Derive all conclusions from actual analysis, not assumptions
5. **Documentation**
- Produce comprehensive RE/*.md files with your findings
- Document the steps taken and methodology used
- When asked by the user, ensure accuracy over previous analysis file
- Organize findings in a way that serves the project goals outlined in AGENTS.md or CLAUDE.md
بث مباشر يناقش الاستفسارات ويعرض تحليلاً حقيقياً لبرامج ضارة:
نماذج اللغة الكبيرة (LLMs) أدوات قوية، لكنها قد تواجه صعوبة أحياناً في الحسابات الرياضية المعقدة أو تظهر "هلوسة" (اختراع حقائق). تأكد من توجيه LLM لاستخدام أداة MCP int_convert وقد تحتاج أيضاً إلى math-mcp لبعض العمليات.
شيء آخر يجب تذكره هو أن LLMs لن تؤدي بشكل جيد مع الكود المشوش. قبل محاولة استخدام LLM لحل المشكلة، ألق نظرة حول الثنائي واقض بعض الوقت في إزالة العناصر التالية (بشكل تلقائي):
يجب أيضاً استخدام أداة مثل Lumina أو FLIRT لمحاولة حل جميع مكتبات المصادر المفتوحة و STL الخاص بـ C++، مما سيحسن الدقة أكثر.
يمكنك تشغيل خادم SSE للاتصال بواجهة المستخدم على النحو التالي:
uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse
بعد تثبيت idalib يمكنك أيضاً تشغيل خادم MCP بدون واجهة. يمكنك البدء بثنائي أولي:
uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable
أو البدء بدون ثنائي وفتح ملفات عشوائية لاحقاً باستخدام idb_open(...):
uv run idalib-mcp --host 127.0.0.1 --port 8745
بالنسبة للعملاء القائمين على stdio، استخدم:
uv run idalib-mcp --stdio
عمال قاعدة البيانات ثابتون: كل عامل يعمل كعملية منفصلة تعيش أطول من المشرف الذي أنشأها. عندما يقوم مشرف جديد (عبر stdio أو HTTP) باستدعاء idb_open لثنائي مفتوح بالفعل تحت عامل على هذا المضيف، يتبنى المشرف ذلك العامل بشفافية — لا يوجد وضع "مشترك" منفصل لتفعيله. العمال يغلقون أنفسهم عندما لا تصيبهم أي طلبية لفترة خمول.
ملاحظة: تمت إضافة ميزة idalib بواسطة Willi Ballenthin.
idalib-mcp هو مشرف يحتفظ بكل قاعدة بيانات مفتوحة في عملية عامل idalib خاصة بها. تسجل العمال أنفسهم في دليل اكتشاف محلي مضيف وتستمر أطول من المشرف الذي أنشأها؛ أي مشرف لاحق يريد نفس المسار يتبنى العامل الجاري. العامل يغلق نفسه عندما لا تصيبه أي طلبية لفترة الخمول TTL الخاصة به (الافتراضي ساعة واحدة). استدع idb_close لتحرير العامل بسرعة (تحرير فتحة تجاه --max-workers)، يتم فصل حالات GUI/عامل المتبناة بدلاً من قتلها.
idb_open يختار الخلفية عبر معامل mode الخاص به:
prefer_headless (الافتراضي): إنشاء عامل idalib (أو تبني عامل لديه الملف مفتوحاً بالفعل).force_headless: نفس الشيء، لكن لا تتبنى أبداً GUI جاري حتى لو كان لديه الملف.prefer_gui: تبني GUI جاري للملف؛ وإلا إنشاء عامل idalib.force_gui: تبني GUI جاري للمملف؛ وإلا تشغيل عملية IDA GUI جديدة.يجب أن يحمل كل استدعاء أداة معامل database صريح. لا يوجد "قاعدة بيانات حالية" ضمنية — يسمي المتصلون الجلسة التي يريدون العمل عليها.
uv run idalib-mcp --stdio --max-workers 4
التدفق النموذجي:
idb_open("/path/to/binary_a.exe", preferred_session_id="binary_a")
idb_open("/path/to/library.dll", preferred_session_id="library")
decompile("main", database="binary_a")
xrefs_to("ImportantExport", database="library")
database يجب أن يكون معرف الجلسة الذي أعادته idb_open (أو كما هو موضح في idb_list)؛ أسماء الملفات والمسارات غير مقبولة.
idb_open(input_path, mode="prefer_headless", run_auto_analysis=True, build_caches=True, init_hexrays=True, preferred_session_id=""): فتح ثنائي، تسخين الأنظمة الفرعية (ذاكرة التخزين المؤقت للنصوص، Hex-Rays)، وإرجاع معرف الجلسة الخاصة به. إذا كان عامل أو GUI لهذا المسار يعمل بالفعل على المضيف، يتم تبني تلك النسخة ويتجاهل preferred_session_id.idb_list(): عرض الجلسات المفتوحة ونسخ IDA GUI الجارية. كل إدخال له adopted (صحيح إذا كان هذا المشرف يديرها، خطأ لنسخ GUI/عامل تم اكتشافها ولكن لم تُفتح بعد عبر idb_open) و backend (worker أو gui) و is_active ومعرفات العمليات.idb_close(database, save=True): حفظ (اختياري)، إلغاء تسجيل الجلسة، وإنهاء العامل المملوك لها، تحرير فتحة تجاه --max-workers. يتم فصل نسخ GUI/عامل المتبناة بدلاً من قتلها.idb_save(session_id, path=""): حفظ IDB لجلسة على القرص. يتم توجيهها كأداة عامل عادية (يتم حقن ) — نفس التوقيع في كلتا الخلفيتين.تحكمات العامل:
--max-workers N: الحد الأقصى لعدد عمال قاعدة البيانات المتزامنين (0 = غير محدود، الافتراضي 4).IDA_MCP_MAX_WORKERS: الإعداد الافتراضي للبيئة لـ --max-workers.الموارد تمثل حالة قابلة للتصفح (بيانات قابلة للقراءة فقط) وفقاً لفلسفة MCP.
حالة IDB الأساسية:
ida://idb/metadata - معلومات ملف IDB (المسار، البنية، القاعدة، الحجم، الهاشات)ida://idb/segments - مقاطع الذاكرة مع الصلاحياتida://idb/entrypoints - نقاط الدخول (main، استدعاءات TLS، إلخ.)حالة واجهة المستخدم:
ida://cursor - موقع المؤشر الحالي والوظيفة الحاليةida://selection - نطاق التحديد الحاليمعلومات الأنواع:
ida://types - جميع الأنواع المحليةida://structs - جميع الهياكل/الاتحاداتida://struct/{name} - تعريف الهيكل مع الحقولعمليات البحث:
ida://import/{name} - تفاصيل الاستيراد بالاسمida://export/{name} - تفاصيل التصدير بالاسمida://xrefs/from/{addr} - المراجع المتقاطعة من عنوانlookup_funcs(queries): الحصول على وظيفة/وظائف حسب العنوان أو الاسم (يكتشف تلقائياً، يقبل قائمة أو سلسلة مفصولة بفواصل).int_convert(inputs): تحويل الأرقام إلى تنسيقات مختلفة (عشري، سداسي عشري، بايتات، ASCII، ثنائي).list_funcs(queries): سرد الوظائف (مقسم إلى صفحات، مصفى).list_globals(queries): سرد المتغيرات العالمية (مقسم إلى صفحات، مصفى).imports(offset, count): سرد جميع الرموز المستوردة مع أسماء الوحدات (مقسم إلى صفحات).decompile(addr): تفكيك الوظيفة في العنوان المعطى.disasm(addr): تجميع الوظيفة مع تفاصيل كاملة (الوسائط، إطار المكدس، إلخ).xrefs_to(addrs): الحصول على جميع المراجع المتقاطعة إلى عنوان/عناوين.xrefs_to_field(queries): الحصول على مراجع متقاطعة لحقل/حقول هيكل محدد.callees(addrs): الحصول على الوظائف التي تستدعيها وظيفة/وظائف في عنوان/عناوين.add_bookmark(addr, name, prefix): إضافة أو استبدال علامة IDA في عنوان؛ اضبط prefix="" لعدم وجود بادئة.set_comments(items): تعيين تعليقات في عنوان/عناوين في كل من عرض التجميع وعرض المفكك.patch_asm(items): تصحيح تعليمات التجميع في عنوان/عناوين.declare_type(decls): إعلان نوع/أنواع C في مكتبة الأنواع المحلية.define_func(items): تعريف وظيفة/وظائف في عنوان/عناوين. يمكن تحديد end للحدود الصريحة.define_code(items): تحويل البايتات إلى تعليمات كود في عنوان/عناوين.undefine(items): إلغاء تعريف عنصر/عناصر في عنوان/عناوين، وتحويلها مرة أخرى إلى بايتات خام. يمكن تحديد end أو size.get_bytes(addrs): قراءة بايتات خام في عنوان/عناوين.get_int(queries): قراءة قيم صحيحة باستخدام ty (i8/u64/i16le/i16be/إلخ).get_string(addrs): قراءة سلسلة/سلاسل منتهية بـ null.get_global_value(queries): قراءة قيم متغير/متغيرات عالمية حسب العنوان أو الاسم (يكتشف تلقائياً، قيم وقت التجميع).stack_frame(addrs): الحصول على متغيرات إطار المكدس لوظيفة/وظائف.declare_stack(items): إنشاء متغير/متغيرات مكدس في إزاحة/إزاحات محددة.delete_stack(items): حذف متغير/متغيرات مكدس بالاسم.read_struct(queries): قراءة قيم حقول الهيكل في عنوان/عناوين محددة.search_structs(filter): البحث عن هياكل حسب نمط الاسم.أدوات المصحح مخفية افتراضياً. قم بتفعيلها باستخدام معامل الاستعلام ?ext=dbg:
http://127.0.0.1:13337/mcp?ext=dbg
التحكم:
dbg_start(): بدء عملية المصحح.dbg_exit(): إنهاء عملية المصحح.dbg_continue(): مواصلة التنفيذ.dbg_run_to(addr): التشغيل حتى عنوان.dbg_step_into(): الدخول إلى التعليمات.dbg_step_over(): تجاوز التعليمات.نقاط التوقف:
dbg_bps(): عرض جميع نقاط التوقف.dbg_add_bp(addrs): إضافة نقطة/نقاط توقف.dbg_delete_bp(addrs): حذف نقطة/نقاط توقف.dbg_toggle_bp(items): تفعيل/تعطيل نقطة/نقاط توقف.المسجلات:
dbg_regs(): جميع المسجلات، الخيط الحالي.dbg_regs_all(): جميع المسجلات، جميع الخيوط.dbg_regs_remote(tids): جميع المسجلات، خيط/خيوط محددة.dbg_gpregs(): مسجلات الأغراض العامة، الخيط الحالي.dbg_gpregs_remote(tids): مسجلات الأغراض العامة، خيط/خيوط محددة.dbg_regs_named(names): مسجلات مسماة، الخيط الحالي.dbg_regs_named_remote(tid, names): مسجلات مسماة، خيط محدد.المكدس والذاكرة:
dbg_stacktrace(): مكدس الاستدعاء مع معلومات الوحدة/الرمز.dbg_read(regions): قراءة الذاكرة من العملية المصححة.dbg_write(regions): كتابة الذاكرة إلى العملية المصححة.py_eval(code): تنفيذ كود Python عشوائي في سياق IDA (يعيد قاموس مع result/stdout/stderr، يدعم التقييم على نمط Jupyter).analyze_funcs(addrs): تحليل شامل للوظائف (تفكيك، تجميع، مراجع متقاطعة، مستدعيات، مستدعين، نصوص، ثوابت، كتل أساسية).find_regex(queries): البحث عن نصوص باستخدام تعبير منتظم غير حساس لحالة الأحرف (مقسم إلى صفحات).find_bytes(patterns, limit=1000, offset=0): العثور على نمط/أنماط بايت في الثنائي (مثل "48 8B ?? ??"). الحد الأقصى: 10000.find_insns(sequences, limit=1000, offset=0): العثور على تسلسل/تسلسلات تعليمات في الكود. الحد الأقصى: 10000.find(type, targets, limit=1000, offset=0): بحث متقدم (قيم فورية، نصوص، مراجع بيانات/كود). الحد الأقصى: 10000.basic_blocks(addrs): الحصول على الكتل الأساسية مع الخلف واللاحق.set_type(edits): تطبيق نوع/أنواع على وظائف، متغيرات عالمية، محلية، أو متغيرات مكدس.infer_types(addrs): استنتاج الأنواع في عنوان/عناوين باستخدام Hex-Rays أو إرشادية.export_funcs(addrs, format): تصدير وظيفة/وظائف بالتنسيق المحدد (json, c_header, أو prototypes).callgraph(roots, max_depth): بناء رسم بياني للاستدعاءات من وظيفة/وظائف جذرية مع عمق قابل للتكوين.rename(batch): عملية إعادة تسمية دفعة موحدة للوظائف، المتغيرات العالمية، المحلية، ومتغيرات المكدس (يقبل قاموساً بمفاتيح اختيارية func, data, local, stack).patch(patches): تصحيح تسلسلات بايت متعددة دفعة واحدة.put_int(items): كتابة قيم صحيحة باستخدام ty (i8/u64/i16le/i16be/إلخ).الميزات الرئيسية:
[{..., error: null|string}, ...].cursor: {next: offset} أو {done: true} (الحد الافتراضي: 1000، الحد الأقصى المفروض: 10000 لمنع تجاوز الرمز).build_strlist المتكررة في المشاريع الكبيرة.إضافة ميزات جديدة عملية سهلة ومبسطة للغاية. كل ما عليك فعله هو إضافة دالة @tool جديدة إلى ملفات API المعيارية في src/ida_pro_mcp/ida_mcp/api_*.py وستكون وظيفتك متاحة في خادم MCP دون أي كود إضافي! يوجد أدناه فيديو حيث أضفت الدالة get_metadata في أقل من دقيقتين (بما في ذلك الاختبار):
https://github.com/user-attachments/assets/951de823-88ea-4235-adcb-9257e316ae64
لاختبار خادم MCP نفسه:
npx -y @modelcontextprotocol/inspector
سيفتح هذا واجهة ويب على http://localhost:5173 ويسمح لك بالتفاعل مع أدوات MCP للاختبار.
للاختبار، أقوم بإنشاء رابط رمزي لإضافة IDA ثم أرسل طلب JSON-RPC مباشرة إلى http://localhost:13337/mcp. بعد تفعيل الروابط الرمزية يمكنك تشغيل الأمر التالي:
uv run ida-pro-mcp --install
توليد سجل التغييرات للالتزامات المباشرة إلى main:
git log --first-parent --no-merges 1.2.0..main "--pretty=- %s"
database=<id>server_health(database=<id>) (يتم توجيهها). idb_list() يبلغ عن is_active من استقصاء TCP/RPC الخاص بالمشرف.