
إضافة لتقديم رموز تفاعلية إلى المصحح الخاص بك من أداة فك التجميع الخاصة بك
تتضمن الهندسة العكسية تحليلًا ثابتًا (مفكك الترجمة) وتحليلًا ديناميكيًا (مصحح الأخطاء)، ومع ذلك غالبًا ما نستخدم هذين التحليلين دون مشاركة المعرفة بينهما. في حالة عكس هندسة الملفات الثنائية الثابتة، يمكن أن يكون التبديل بين لغة التجميع في مصحح الأخطاء والرموز التي قمت بعكسها في مفكك الترجمة غير فعال.
يهدف decomp2dbg إلى تقليل فجوة التبديل بين مفكك الترجمة ومصحح الأخطاء من خلال تقديم واجهة برمجة تطبيقات عامة لمزامنة الرموز بين مفكك الترجمة ومصحح الأخطاء. وبالتالي، يمنح المهندس العكسي قوة مصحح الأخطاء الخاص به مع الرموز وأسطر فك الترجمة التي يستعيدها في مفكك الترجمة الخاص به.

مهتم برؤية شكل decomp2dbg عمليًا؟ تحقق من المحاضرة المسجلة في CactusCon 2023، والتي تتضمن تصحيح أخطاء ملف ثنائي arm32 عن بُعد من جهاز x64 باستخدام رموز Ghidra.
للحصول على مساعدة نشطة، انضم إلى Discord الخاص بـ BinSync أدناه، حيث نجيب على أسئلة decomp2dbg:
قم بالتثبيت عبر pip، ثم استخدم المثبت المدمج لمفككي الترجمة:
pip3 install decomp2dbg && decomp2dbg --install
سيؤدي هذا إلى فتح موجه يُطلب منك فيه إدخال المسار إلى مفكك الترجمة ومصحح الأخطاء الذي تختاره. بالنسبة لـ Ghidra، ستحتاج إلى التشغيل في وضع PyGhidra، وتمكين الإضافة (d2d_client.py)، كما هو موضح هنا. إذا قمت بتثبيت جانب مفكك الترجمة في مدير إضافات Binja، فلا تزال بحاجة إلى تثبيت جانب مصحح الأخطاء باستخدام ما سبق. ملاحظة: يجب تثبيت decomp2dbg في نفس بيئة Python الخاصة بمفكك الترجمة ومصحح الأخطاء.
ملاحظة: قد تحتاج إلى السماح بالاتصالات الواردة على المنفذ 3662، أو المنفذ الذي تستخدمه، حتى يتمكن decomp2dbg من الاتصال بمفكك الترجمة. إذا كنت تقوم بتثبيت decomp2dbg مع GEF أو pwndbg، فمن المهم أن يتم تضمين ملف d2d.py بعد GEF أو pwndbg في ملف ~/.gdbinit.
تخطى هذا إذا كنت قادرًا على استخدام التثبيت أعلاه دون أخطاء. إذا لم تتمكن من استخدام البرنامج النصي المدمج أعلاه (تثبيت Windows غير WSL لمفكك الترجمة)، فاتبع الخطوات أدناه:
إذا كنت تحتاج فقط إلى جانب مفكك الترجمة، فانسخ إضافة مفكك الترجمة المرتبطة إلى مجلد إضافات مفكك الترجمة. إليك كيفية القيام بذلك في IDA:
أولاً، استنسخ المستودع:
git clone https://github.com/mahaloz/decomp2dbg.git
التثبيت:
pip install .
انسخ جميع ملفات الخادم:
cp ./decomp2dbg/d2d_server.py /path/to/ida/plugins/
إذا كنت تحتاج أيضًا إلى تثبيت جانب gdb، فاستخدم السطر أدناه:
cp ./decomp2dbg/d2d_client.py ~/.d2d.py && echo "source ~/.d2d.py" >> ~/.gdbinit
أولاً، ابدأ تشغيل خادم فك الترجمة على مفكك الترجمة الخاص بك. قد ترغب في الانتظار حتى ينتهي مفكك الترجمة من تحليله الطبيعي قبل بدء تشغيله. بعد التحليل الطبيعي، يمكن القيام بذلك باستخدام المفتاح الساخن Ctrl-Shift-D، أو بتحديد علامة التبويب decomp2dbg: configure في علامات تبويب الإضافات المرتبطة. بعد بدء تشغيل الخادم، يجب أن ترى رسالة في مفكك الترجمة:
[+] Starting XMLRPC server: localhost:3662
[+] Registered decompilation server!
بعد ذلك، في مصحح الأخطاء الخاص بك، قم بتشغيل:
decompiler connect <decompiler_name>
إذا كنت تقوم بتشغيل مفكك الترجمة على جهاز افتراضي أو جهاز مختلف، يمكنك اختياريًا توفير المضيف والمنفذ للاتصال. إليك مثال:
decompiler connect ida --host 10.211.55.2 --port 3662
يمكنك معرفة كيفية استخدام جميع الأوامر عن طريق تشغيل أمر decompiler مع علامة --help.
قد يستغرق الاتصال الأول ما يصل إلى 30 ثانية للتسجيل اعتمادًا على عدد المتغيرات العالمية في الملف الثنائي. إذا كان كل شيء على ما يرام، يجب أن ترى:
[+] Connected to decompiler!
إذا كنت تستخدم decomp2dbg لمكتبة، أي أن الملف الثنائي الرئيسي الذي تم إرفاق مصحح الأخطاء به ليس هو الملف الثنائي الذي تريد المصدر له، فيجب عليك إلقاء نظرة على قسم الاستخدام المتقدم - المكتبات المشتركة من ملف README.
في كل حدث نقطة توقف، سترى الآن فك الترجمة مطبوعًا، والسطر الذي أنت عليه مرتبط بعنوان نقطة التوقف.
يتم الآن تعيين الدوال والمتغيرات العامة من فك الترجمة إلى GDB الخاص بك مثل رموز المستوى العادية. هذا يعني أن أوامر GDB العادية مثل الطباعة والفحص أصبحت أصلية:
b sub_46340
x/10i sub_46340
p dword_267A2C
x dword_267A2C
بعض المتغيرات المخزنة محليًا في الدالة هي متغيرات مكدس. بالنسبة للمتغيرات التي يمكن تعيينها للمكدس أو التسجيلات، نقوم باستيرادها كمتغيرات ملائمة. يمكنك رؤية محتوياتها مثل متغير GDB الملائم العادي:
p $v4
ستقوم متغيرات المكدس دائمًا بتخزين عنوانها على المكدس. لرؤية القيمة الفعلية في متغير المكدس هذا، ببساطة قم بإلغاء الإشارة إلى المتغير:
x $v4
يعمل هذا أيضًا مع وسيطات الدوال إذا كان ذلك مناسبًا (قد تختلف النتائج):
p $a1
ملاحظة: $v4 في هذه الحالة سيتم تعيينه فقط طالما كنت في نفس الدالة. بمجرد مغادرتك للدالة، قد يتم إلغاء تعيينه أو إعادة تعيينه إلى قيمة أخرى.
عندما تريد عرض فك الترجمة (والرموز) لقسم من الذاكرة ليس هو الملف الثنائي الرئيسي، مثل عند تصحيح أخطاء مكتبة مشتركة، ستحتاج إلى القيام بخطوات إضافية. حاليًا، يدعم d2d فقط مفكك ترجمة واحد متصل في كل مرة، مما يعني أنه إذا كان لديك أي مفكك ترجمة متصل حاليًا ليس هو المكتبة، فأنت بحاجة إلى فصله.
بعد اتباع الإعداد العادي لجعل مفكك الترجمة الخاص بك يشغل خادم d2d للمكتبة المشتركة الخاصة بك، تحتاج إلى تعيين العنوان الأساسي لهذه المكتبة وعنوان نهايتها يدويًا:
decompiler connect ida --base-addr-start 0x00007ffff7452000 --base-addr-end 0x00007ffff766d000
للعثور على العنوان الأساسي الذي تم تحميل مكتبتك فيه في الذاكرة، يُوصى باستخدام شيء مثل أمر vmmap من GEF للبحث عن اسم المكتبة في مساحة الذاكرة. بعد الاتصال بهذا العنوان المضبوط يدويًا، ستعمل الرموز مثل d2d العادي. سيتم طباعة فك الترجمة على الشاشة فقط عندما تكون في نطاق مساحة العنوان هذه.