
خوادم TCP JSON bridge لـ IDA Pro وGhidra تكشف فك الترجمة، والمراجع المتقاطعة، والرموز، وجداول الدوال الافتراضية، وRTTI، وترقيع الذاكرة للنصوص البرمجية الخارجية وخطوط الأنابيب الآلية.
خوادم جسر TCP JSON خفيفة الوزن لـ IDA Pro و Ghidra تُتيح سير عمل الهندسة العكسية عبر بروتوكول مقبس بسيط.
تسمح للأدوات الخارجية، ونصوص CLI، وأدوات Python المساعدة، وخطوط الأنابيب الآلية بالاستعلام عن فك التجميع، والإشارات المرجعية، والرموز، والجداول الافتراضية، وRTTI، والبنى، وذاكرة التصحيح دون تفاعل يدوي مع واجهة المستخدم الرسومية.
عند العمل على مشاريع هندسة عكسية كبيرة مع فتح عدة ملفات ثنائية في نفس الوقت (مثل عميل لعبة، ومشغّل، ووكلاء DLL، والـ stubs في آنٍ واحد):
BASE_PORT = 5073 ويجسّ المنافذ المتتالية تلقائياً (5073، 5074، 5075، 5076...) حتى يجد منفذاً متاحاً.في IDA Pro، يبقى مفسّر Python حياً عبر عمليات تنفيذ نصوص متعددة:
ID_Server.py مقبض الخادم قيد التشغيل في builtins._ida_bridge_prev.stop() على النسخة السابقة وينضم إلى خيطها (join(3.0))، محرراً المنفذ بشكل نظيف قبل بدء الخادم الجديد.Address already in use أو خيوط يتيمة من إعادة تشغيل النص.QUIT أو STOP أو EXIT أو SHUTDOWN عبر الاتصال. يؤكد الخادم بـ {"ok": true, "shutdown": true} ويُغلق فوراً.ida_bridge_stop() مباشرة من واجهة IDA Python CLI، أو ببساطة أغلق IDA (تخرج الخيوط الخفية تلقائياً).is_cancelled() كل ثانية عبر مهلة المقبس)، أو أرسل QUIT..idb / .i64) في IDA Pro.File -> Script file... / Alt+F7)، نفّذ:
import ID_Server
127.0.0.1:5073 (أو المنفذ المتاح التالي).ida_bridge_stop()
Window -> Script Manager)، أضف المجلد الذي يحتوي على Ghidra_Server.py أو شغّله مباشرة في مفسّر Python.127.0.0.1:5073 (أو المنفذ الحر التالي).الأوامر هي سلاسل نصية عادية محددة بأسطر جديدة تُرسل عبر TCP (127.0.0.1:<PORT>). يرد الخادم بكائن JSON (أو نص محدد بعلامات جدولة للأوامر القديمة).
| الأمر | الصيغة | الوصف |
|---|---|---|
PING | PING | فحص الحالة. يُرجع "pong". |
CURRENT | CURRENT | يُرجع عنوان المؤشر الحالي، واسم الدالة، والحجم، وتعليمات التجميع، والكود المفكوك. |
NAME | NAME <ea> | يُرجع اسم الرمز/الدالة المعرّف عند <ea>. |
FUNC | FUNC <addr> | يُرجع البيانات الوصفية الكاملة للدالة، ونقطة الدخول، والحجم، والتوقيع، والتجميع، وفك تجميع Hex-Rays/Ghidra. |
DECOMP | DECOMP <addr> | اسم بديل لـ FUNC. يفك تجميع الدالة المستهدفة. |
DISASM | DISASM <ea> [n] | يُرجع أسطر فك التجميع لـ [n] تعليمة بدءاً من <ea> (الافتراضي: 40). |
FIND | FIND <substr> | بحث غير حساس لحالة الأحرف عبر جميع الرموز وأسماء الدوال المطابقة لـ <substr> (حتى 300 تطابق). |
EXPORT | EXPORT [path] | يصدّر جميع الرموز غير الوهمية، والأسماء المشوّشة والمفكوكة إلى ملف نصي (الافتراضي: C:\Contexto\ida_names.txt). |
HELP | HELP | يُرجع قائمة JSON بجميع الأوامر المتاحة التي يدعمها الخادم. |
QUIT | QUIT | يُغلق اتصال العميل بشكل رشيق ويوقف مقبس خادم الجسر. |
| الأمر | الصيغة | الوصف |
|---|---|---|
XREF | XREF <addr> | يسرد جميع الإشارات المرجعية الواردة (استدعاءات الكود، وقراءات/كتابات البيانات) التي تستهدف <addr>. |
XFROM | XFROM <addr> | يسرد جميع الإشارات المرجعية الصادرة المنشأ من <addr>. |
CALLERS | CALLERS <addr> | يرشّح الإشارات الواردة لإرجاع مواقع الاستدعاء فقط (بما في ذلك الاستدعاءات غير المباشرة المحلولة). |
READERS | READERS <addr> | يرشّح الإشارات الواردة لإرجاع التعليمات التي تقرأ من <addr> فقط. |
WRITERS | WRITERS <addr> | يرشّح الإشارات الواردة لإرجاع التعليمات التي تكتب إلى <addr> فقط. |
DECOMP_XREF | DECOMP_XREF <addr> | يفك تجميع كل دالة مستدعية لـ <addr> دفعة واحدة في طلب واحد. |
IMPORTXREF | IMPORTXREF <name> | يحدد موقع جميع مواقع الاستدعاء في كامل الملف الثنائي لواجهة Windows/C API مستوردة (مثل IMPORTXREF WSASendTo). |
TRACE | TRACE <addr> | يتتبع تدفق التنفيذ والكتل الأساسية المحيطة بـ <addr>. |
| الأمر | الصيغة | الوصف |
|---|---|---|
READPTR | READPTR <addr> [count] | يقرأ الذاكرة كسلاسل مؤشرات (32-بت أو 64-بت) ويصنّف كل هدف (func، string، vtable). |
FINDPTR | FINDPTR <addr> | يمسح البيانات العامة والجداول للعثور على أي مؤشر يشير إلى <addr> (يجد الجداول الافتراضية، وجداول التوزيع). |
STRUCT | STRUCT <addr> [n] | يفرّغ الذاكرة المتجاورة استكشافياً مفسّراً الحقول كأعداد صحيحة، وأعداد عشرية، ومؤشرات، وسلاسل نصية. |
DEFSTRUCT | DEFSTRUCT <name> [size] | ينشئ بنية مسماة جديدة في مكتبة أنواع قاعدة البيانات. |
SETFIELD | SETFIELD <struct> <off> <type> [name] | يعرّف أو يعدّل حقل بنية عند <off> بالنوع <type> واسم حقل اختياري. |
MKPTRS | MKPTRS <addr> [count] | يحوّل بايتات قاعدة البيانات الخام إلى مؤشرات مُنمّطة بشكل جماعي. |
NEARSTR | NEARSTR <addr> | يجد الإشارات النصية الموجودة قريباً في أقسام الكود أو البيانات ضمن النطاق. |
| الأمر | الصيغة | الوصف |
|---|---|---|
VTABLE | VTABLE <funcaddr> | يحدد الجداول الافتراضية التي تحتوي على <funcaddr>، بما في ذلك فتحات الطرق المجاورة. |
VTDUMP | VTDUMP <addr> [count] | يفرّغ جدولاً افتراضياً كاملاً: يحل كل فتحة إلى اسم طريقتها، وإزاحتها، وفهرسها. |
RTTI | RTTI <addr|Name> | يتنقل عبر بنى MSVC C++ RTTI (TypeDescriptor -> CompleteObjectLocator -> vftable) لحل التسلسلات الهرمية للفئات والفئات الأساسية. |
| الأمر | الصيغة | الوصف |
|---|---|---|
STR | STR <ascii> | يبحث عن سلاسل ASCII عبر جميع المقاطع المحمّلة. |
WSTR | WSTR <utf16> | يبحث عن سلاسل UTF-16 العريضة عبر جميع المقاطع المحمّلة. |
BYTES | BYTES <hex> | يبحث عن تسلسلات بايتات الأكواد أو البيانات الخام (مثل BYTES 55 8B EC 83 EC). |
| الأمر | الصيغة | الوصف |
|---|---|---|
RENAME_FUNC | RENAME_FUNC <addr> <name> | يعيد تسمية الدالة عند <addr> إلى <name>. |
RENAME_SYMBOL | RENAME_SYMBOL <addr> <name> | يعيد تسمية رمز بيانات عام أو متغير. |
RENAME_LABEL | RENAME_LABEL <addr> <name> | يعيد تسمية تسمية كود أو هدف قفز. |
RENAME_LOCAL | RENAME_LOCAL <func> <old> <new> | يعيد تسمية متغير محلي داخل عرض المفكك. |
RETYPE | RETYPE <func> <var> <type> | يعدّل نوع بيانات متغير أو معامل داخل المفكك (مثل RETYPE 00401000 a1 Player*). |
SETCONV | SETCONV <func> <convention> | يضبط اصطلاح الاستدعاء (__cdecl، __stdcall، __fastcall، __thiscall). |
MAKEFUNC | MAKEFUNC <addr> | يفرض إنشاء حدود دالة عند <addr>. |
PATCH | PATCH <addr> <hex> | يكتب فوق البايتات مباشرة في قاعدة البيانات (مثل PATCH 00401234 90 90). |
PCODE | PCODE <addr> | يفرّغ تمثيل Hex-Rays Microcode أو Ghidra P-Code الوسيط لتحليل المترجم العميق. |
import socket
import json
class BridgeClient:
def __init__(self, host="127.0.0.1", port=5073):
self.host = host
self.port = port