
ret-sync هي مجموعة من الإضافات التي تساعد في مزامنة جلسة التصحيح (WinDbg/GDB/LLDB/OllyDbg2/x64dbg) مع مفككات IDA/Ghidra/Binary Ninja.
ret-sync تعني مزامنة أدوات الهندسة العكسية. هي مجموعة من الإضافات التي تساعد في مزامنة جلسة تصحيح الأخطاء (WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg) مع مفكك الشيفرات (IDA/Ghidra/Binary Ninja). الفكرة الأساسية بسيطة: الاستفادة من أفضل ما في العالمين (التحليل الثابت والديناميكي).
توفر لنا أدوات تصحيح الأخطاء والتحليل الديناميكي:
!peb، !drvobj، !address، إلخ.)توفر لنا مفككات الشيفرات والتحليل الثابت:
الميزات الرئيسية:
ret-sync هو فرع من qb-sync الذي قمت بتطويره وصيانته أثناء عملي في Quarkslab.
إضافات مصحح الأخطاء:
ext_windbg/sync: ملفات المصدر لإضافة WinDbg، بعد البناء: sync.dllext_gdb/sync.py: إضافة GDBext_lldb/sync.py: إضافة LLDBext_olly1: إضافة OllyDbg 1.10ext_olly2: إضافة OllyDbg v2ext_x64dbg: إضافة x64dbgإضافات مفكك الشيفرات:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip: إضافة Ghidraext_bn/retsync: إضافة Binary Ninjaوإضافة المكتبة:
ext_lib/sync.py: مكتبة Python مستقلةتتطلب إضافات IDA و GDB إعداد Python صالح. يتم دعم Python 2 (>=2.7) و Python 3.
يتم تقديم الثنائيات المجمعة مسبقًا لمصححي الأخطاء WinDbg/OllyDbg/OllyDbg2/x64dbg من خلال خط أنابيب Azure DevOps:
اختر البناء الأخير وتحقق من القطع الأثرية تحت قسم Related: 6 published.

يتم توفير أرشيف إضافة مجمعة مسبقًا لإضافة Ghidra في ext_ghidra/dist.
يجب أن يعمل ret-sync دون أي إعدادات إضافية لمعظم المستخدمين الذين لديهم إعداد نموذجي: مصحح الأخطاء ومفكك الشيفرات على نفس المضيف، أسماء الوحدات متطابقة.
ومع ذلك، في بعض السيناريوهات قد يتم استخدام تكوين محدد. لذلك، تتحقق الإضافات والمكونات الإضافية من وجود ملف تكوين عام اختياري باسم .sync في الدليل الرئيسي للمستخدم. يجب أن يكون ملف .INI صالحًا.
بالإضافة إلى ذلك، تبحث إضافات IDA و Ghidra أيضًا عن ملف التكوين في دليل IDB أو المشروع (<project>.rep) أولاً للسماح بإعدادات محلية لكل IDB/مشروع. إذا كان ملف التكوين المحلي موجودًا، يتم تجاهل ملف التكوين العام.
القيم المعلنة في ملفات التكوين هذه تتجاوز القيم الافتراضية. يرجى ملاحظة أنه لا يتم إنشاء ملف .sync افتراضيًا.
نوضح أدناه ثلاثة سيناريوهات شائعة حيث يكون ملف التكوين مفيدًا/ضروريًا:
يستخدم قسم [INTERFACE] لتخصيص الإعدادات المتعلقة بالشبكة. لنفترض أن شخصًا ما يريد مزامنة IDA مع مصحح أخطاء يعمل داخل جهاز افتراضي (أو ببساطة مضيف آخر)، وهو سيناريو شائع لتصحيح النواة عن بعد.
ببساطة قم بإنشاء ملفي .sync:
يخبر إضافة **ret-sync** ``IDA`` بالاستماع على الواجهة ``192.168.128.1`` مع المنفذ ``9234``. وغني عن القول أن هذه الواجهة يجب أن تكون قابلة للوصول من المضيف البعيد أو الآلة الافتراضية.
* واحدة على الجهاز الذي يتم تنفيذ المصحح عليه، في دليل المستخدم الرئيسي:```
[INTERFACE]
host=192.168.128.1
port=9234
يخبر مكون ret-sync الإضافي للمصحح بالاتصال بمكون ret-sync الإضافي لـ IDA الذي تم تكوينه مسبقًا للاستماع على هذه الواجهة.
ملاحظة: يجب عليك تحديد عنوان IP حقيقي هنا، وعدم استخدام 0.0.0.0. وذلك لأن المتغير يُستخدم من قبل مصادر متعددة سواء للربط أو الاتصال، لذا فإن استخدام 0.0.0.0 سيؤدي إلى أخطاء غريبة.
[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe
يستخدم قسم ``[ALIASES]`` لتخصيص الاسم الذي يستخدمه مفكك (IDA/Ghidra) لتسجيل وحدة إلى موزع/مدير البرامج الخاص به.
افتراضيًا، تستخدم إضافات المفكك اسم ملف الإدخال. ومع ذلك، قد يكون المستخدم قد أعاد تسمية الملف مسبقًا ولم يعد الاسم مطابقًا لاسم العملية الفعلية أو الوحدة المحملة كما يراها المصحح.
هنا نخبر الموزع ببساطة أن يطابق الاسم `ntkrnlmp.exe` (الاسم الحقيقي) بدلاً من `ntoskrnl_vuln.exe` (اسم IDB).
## gdb مع واجهة تصحيح أخطاء Qt Creator
تغير واجهة تصحيح أخطاء Qt Creator طريقة تسجيل مخرجات أمر gdb. وبما أن هذا قد يتعارض مع المزامنة، يوجد خيار لاستخدام مخرجات gdb الخام للمزامنة بدلاً من ملف مؤقت. في ملف إعدادات .sync استخدم```
[GENERAL]
use_tmp_logging_file=false
إذا كنت ترغب في استخدام واجهة تصحيح Qt الأمامية للهدف.
/proc/<pid>/mapsفي بعض السيناريوهات، مثل تصحيح أخطاء الأجهزة المضمنة عبر المنفذ التسلسلي أو البرامج الثابتة الخام في QEMU، لا يكون gdb على علم بـ PID ولا يمكنه الوصول إلى /proc/<pid>/maps.
في هذه الحالات، يُستخدم قسم [INIT] لتمرير سياق مخصص إلى المكون الإضافي. يسمح بتجاوز بعض الحقول مثل PID وخرائط الذاكرة.
.sync مقتطف محتوى:```
[INIT]
context = {
"pid": 200,
"mappings": [ [0x400000, 0x7A81158, 0x7681158, "asav941-200.qcow2|lina"] ]
}
كل إدخال في التعيينات هو: ``mem_base``, ``mem_end``, ``mem_size``, ``mem_name``.
## تجاوز إعادة التوطين التلقائي للعناوين
في بعض السيناريوهات، مثل تصحيح أخطاء الأجهزة المضمنة أو الاتصال بواجهات التصحيح البسيطة، قد يكون من الأسهل تجاوز ميزة إعادة التوطين التلقائي للعناوين المطبقة في إضافات مفكك التجميع.
الخيار `use_raw_addr` مدعوم حاليًا فقط لـ Ghidra. في ملف تكوين .sync استخدم:```
[GENERAL]
use_raw_addr=true
IDA 9.2+ مطلوب. للإصدارات الأقدم، يرجى مراجعة المشروع قبل علامة ida9.2 من Tags المتاحة.
لتثبيت IDA، انسخ المجلد Syncplugin.py و retsync من ext_ida إلى دليل إضافات IDA، على سبيل المثال:
C:\Program Files\IDA Pro 7.4\plugins%APPDATA%\Hex-Rays\IDA Pro\plugins~/.idapro/pluginsAlt-Shift-S) أو Edit -> Plugins -> ``ret-sync`````
[sync] default idb name: ld.exe
[sync] sync enabled
[sync] cmdline: "C:\Program Files\Python38\python.exe" -u "C:\Users\user\AppData\Roaming\Hex-Rays\IDA Pro\plugins\retsync\broker.py" --idb "target.exe"
[sync] module base 0x100400000
[sync] hexrays #7.3.0.190614 found
[sync] broker started
[sync] plugin loaded
[sync] << broker << dispatcher not found, trying to run it
[sync] << broker << dispatcher now runs with pid: 6544
[sync] << broker << connected to dispatcher
[sync] << broker << listening on port 63107### استكشاف أخطاء إضافة IDA
لاستكشاف المشكلات المتعلقة بإضافة IDA، هناك خياران متاحان في الملف `retsync/rsconfig.py`:```
LOG_LEVEL = logging.INFO
LOG_TO_FILE_ENABLE = False
تعيين قيمة LOG_LEVEL إلى logging.DEBUG يجعل الإضافة أكثر تفصيلاً.
تعيين قيمة LOG_TO_FILE_ENABLE إلى True يؤدي إلى تسجيل معلومات الاستثناءات من broker.py وdispatcher.py في ملفات مخصصة. يتم إنشاء ملفات السجل في مجلد %TMP% بنمط اسم retsync.%s.err .
إما استخدام الإصدار المبني مسبقًا من مجلد ext_ghidra/dist أو اتباع التعليمات لبنائه. كل بناء ملحق يدعم فقط إصدار Ghidra المحدد في اسم ملف الإضافة. على سبيل المثال: ghidra_9.1_PUBLIC_20191104_retsync.zip مخصص لـ Ghidra 9.1 Public.
3. قم ببناء الامتداد لتثبيت Ghidra الخاص بك (استبدل `$GHIDRA_DIR` بدليل التثبيت الخاص بك)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR
File -> Install Extensions...، انقر على علامة + واختر ext_ghidra/dist/ghidra_*_retsync.zip ثم انقر OK.
سيؤدي هذا إلى استخراج مجلد retsync من الملف المضغوط إلى
$GHIDRA_DIR/Extensions/Ghidra/4. من أداة Ghidra CodeBrowser: استخدم أيقونات شريط الأدوات أو الاختصارات لتمكين (``Alt+s``)/تعطيل (``Alt+Shift+s``)/إعادة تشغيل (``Alt+r``) المزامنة.
كما تتوفر نافذة الحالة من ``Windows`` -> ``RetSyncPlugin``. يُفضل عادةً إسقاطها على الجانب لدمجها مع بيئة نوافذ Ghidra.
## إضافة Binary Ninja
دعم Binary Ninja تجريبي، تأكد من عمل نسخ احتياطي لقواعد بيانات التحليل الخاصة بك.
### متطلبات Binary Ninja
**ret-sync** يتطلب إصدار Binary Ninja 2.2 كحد أدنى بالإضافة إلى Python 3 (Python 2 غير مدعوم).
### تثبيت إضافة Binary Ninja
**ret-sync** لم يتم توزيعه بعد عبر مدير الإضافات في Binary Ninja؛ يلزم تثبيت يدوي. ببساطة انسخ محتوى مجلد `ext_bn` إلى مجلد الإضافات في Binary Ninja، على سبيل المثال:
`%APPDATA%\Binary Ninja\plugins`
بعد إعادة تشغيل Binary Ninja، يجب أن يظهر الناتج التالي في نافذة وحدة التحكم:```
[sync] commands added
Loaded python3 plugin 'retsync'
استخدم الحل المتوفر في ext_windbg الخاص بـ Visual Studio 2017. تم اختبار Visual Studio Community Edition 2017 و 2026 بنجاح (الإصدارات بينهما يجب أن تعمل أيضًا).
سيؤدي هذا إلى بناء ملف x64\release\sync.dll.
ستحتاج إلى نسخ ملف sync.dll الناتج إلى مسار إضافات WinDbg المناسب.
بالنسبة للإصدارات الأقدم من Windbg، يكون المسار مشابهًا لهذا (كن حذرًا من أنماط x86/x64)، مثال ذلك
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll
يبدو أن المجلد الخاص بتخزين الإضافة يعتمد على PATH، لذلك تحتاج إلى وضعه في أحد المواقع المستعلَمة.
مثال على ذلك وضعه هنا:
C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll
.load)```
0:000> .load sync
[sync.dll] DebugExtensionInitialize, ExtensionApis loaded3. مزامنة WinDbg```
0:000> !sync
[sync] No argument found, using default host (127.0.0.1:9100)
[sync] sync success, sock 0x5a8
[sync] probing sync
[sync] sync is now enabled with host 127.0.0.1
على سبيل المثال في نافذة المخرجات لـ IDA``` [] << broker << dispatcher msg: add new client (listening on port 63898), nb client(s): 1 [] << broker << dispatcher msg: new debugger client: dbg connect - HostMachine\HostUser [sync] set debugger dialect to windbg, enabling hotkeys
إذا كانت الوحدة الحالية لـ Windbg تطابق اسم ملف IDA```
[sync] idb is enabled with the idb client matching the module name.
ملاحظة: إذا حصلت على الخطأ التالي، فذلك لأنك لم تنسخ الملف إلى المجلد الصحيح في الخطوات أعلاه.``` 0: kd> .load sync The call to LoadLibrary(sync) failed, Win32 error 0n2 "The system cannot find the file specified." Please check your debugger configuration and/or network access.
الخطأ أدناه يعني عادةً أن Windbg حاول تحميل النكهة غير الصحيحة للإضافة، مثال: `x64` بدلاً من `x86` `sync.dll`.```
0:000> .load sync
The call to LoadLibrary(sync) failed, Win32 error 0n193
"%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.
بما أن WinDbg Preview يقوم بتحميل كلتا الإضافتين (x86 و x64) من نفس المجلد، يمكن إعادة تسمية ملف x86 sync32.dll.```
0:000> .load sync32
## تثبيت GNU gdb (GDB)
1. انسخ `ext_gdb/sync.py` إلى الدليل الذي تختاره
2. قم بتحميل الامتداد (انظر auto-load-scripts)```
gdb> source sync.py
[sync] configuration file loaded 192.168.52.1:9100
[sync] commands added
دعم LLDB تجريبي، ولكن:
~/.lldbinit)```
lldb> command script import sync## تثبيت OllyDbg 1.10
دعم OllyDbg 1.10 تجريبي، ومع ذلك:
1. قم ببناء الإضافة باستخدام حل VS (اختياري، انظر إلى الملفات الثنائية المبنية مسبقًا)
2. انسخ ملف dll داخل دليل إضافات OllyDbg
## تثبيت OllyDbg2
دعم OllyDbg2 تجريبي، ومع ذلك:
1. قم ببناء الإضافة باستخدام حل VS (اختياري، انظر إلى الملفات الثنائية المبنية مسبقًا)
2. انسخ ملف dll داخل دليل إضافات OllyDbg2
## تثبيت x64dbg
بناءً على testplugin، https://github.com/x64dbg/testplugin. دعم x64dbg تجريبي، ومع ذلك:
1. قم ببناء الإضافة باستخدام حل VS (اختياري، انظر إلى الملفات الثنائية المبنية مسبقًا).
قد تحتاج إلى إصدار مختلف من SDK الإضافة،
يمكن العثور على نسخة في كل إصدار من x64dbg.
قم بلصق الدليل "``pluginsdk``" داخل "``ext_x64dbg\x64dbg_sync``"
2. انسخ ملف dll (الامتداد هو ``.d32`` أو ``.dp64``) داخل دليل إضافات x64dbg.
# الاستخدام
## أوامر مصحح الأخطاء **ret-sync**
بالنسبة لمصححات الأخطاء الموجهة لسطر الأوامر (خاصة Windbg و GDB) يتم عرض مجموعة من الأوامر بواسطة **ret-sync** للمساعدة في مهمة الهندسة العكسية.
الأوامر أدناه عامة (Windbg و GDB)، يرجى ملاحظة أن البادئة `!` مطلوبة في WinDbg (مثال: `sync` في GDB، `!sync` في WinDbg).
| أمر مصحح الأخطاء | الوصف |
|----------------------------|-------------------------------------------------------------------------------------------|
| `synchelp` | عرض قائمة الأوامر المتاحة مع شرح مختصر |
| `sync` | بدء المزامنة |
| `syncoff` | إيقاف المزامنة |
| `cmt [-a address] <string>` | إضافة تعليق في عنوان IP الحالي في المفكك |
| `rcmt [-a address]` | إعادة تعيين التعليق في عنوان IP الحالي في المفكك |
| `fcmt [-a address] <string>` | إضافة تعليق دالة للدالة التي يوجد بها عنوان IP الحالي |
| `raddr <expression>` | إضافة تعليق بالعنوان المعاد قاعدته والمقيم من التعبير |
| `rln <expression>` | الحصول على الرمز من المفكك للعنوان المحدد |
| `lbl [-a address] <string>` | إضافة اسم تسمية في عنوان IP الحالي في المفكك |
| `cmd <string>` | تنفيذ أمر في مصحح الأخطاء وإضافة مخرجاته كتعليق في عنوان IP الحالي في المفكك |
| `bc <\|\|on\|off\|set 0xBBGGRR>` | تمكين/تعطيل تلوين المسار في المفكك |
| `idblist` | الحصول على قائمة بجميع عملاء IDB المتصلين بالموزع |
| `syncmodauto <on\|off>` | تمكين/تعطيل التبديل التلقائي للمفكك بناءً على اسم الوحدة |
| `idbn <n>` | تعيين IDB النشط إلى العميل رقم n |
| `jmpto <expression>` | |
| `jmpraw <expression>` | إذا تم تمكين IDB، فسيتم مزامنة عرض المفكك مع العنوان الناتج. |
| `translate <base> <addr> <mod>` | إعادة قاعدة عنوان بالنسبة لاسم الوحدة وإزاحتها |
أوامر WinDbg المحددة:
| أمر مصحح الأخطاء | الوصف |
|----------------------------|-------------------------------------------------------------------------------------------|
| `curmod` | عرض معلومات الوحدة لإزاحة التعليمات الحالية (لاستكشاف الأخطاء) |
| `modlist` | قائمة الوحدات المحسنة بلغة ترميز مصحح الأخطاء (DML) المخصصة لتبديل IDB النشط بشكل أكثر سلاسة |
| `idb <module name>` | تعيين الوحدة المعطاة كـ IDB نشط (انظر `modlist` الإصدار المحسن من `lm`) |
| `modmap <base> <size> <name>` | تتم إضافة وحدة اصطناعية (مزيفة) (محددة باستخدام عنوان قاعدتها وحجمها) إلى القائمة الداخلية لمصحح الأخطاء |
| `modunmap <base>` | إزالة وحدة اصطناعية سبق تعيينها في عنوان القاعدة |
| `modcheck <\|\|md5>` | استخدم للتحقق مما إذا كانت الوحدة الحالية تطابق ملف IDB (مثال: تم تحديث الوحدة) |
| `bpcmds <\|\|save\|load\|>` | غلاف **bpcmds**، حفظ وإعادة تحميل مخرجات **.bpcmds** (قائمة أوامر نقاط التوقف) إلى IDB الحالي |
| `ks` | مخرجات محسنة بلغة ترميز مصحح الأخطاء (DML) لأمر **kv** |
أوامر GDB المحددة:
| أمر مصحح الأخطاء | الوصف |
|----------------------------|-------------------------------------------------------------------------------------------|
|`bbt` | تتبع خلفي جميل. مشابه لـ **bt** في GDB ولكنه يطلب الرموز من المفكك |
| `patch` | تصحيح البايتات في المفكك بناءً على السياق الحي |
| `bx` | مشابه لـ **x** في GDB ولكن باستخدام رمز. سيتم حل الرمز بواسطة المفكك |
| `cc` | المتابعة إلى المؤشر في المفكك |
## استخدام IDA
### واجهة المستخدم الرسومية لإضافة IDA
حقل الإدخال ``Overwrite idb name`` يهدف إلى تغيير اسم IDB الافتراضي. إنه الاسم الذي تستخدمه الإضافة للتسجيل مع الموزع. التبديل التلقائي لـ IDB يعتمد على مطابقة اسم الوحدة. في حالة الأسماء المتضاربة (مثل ``foo.exe`` و ``foo.dll``)، يمكن استخدام ذلك لتسهيل المطابقة. يرجى ملاحظة أنه إذا قمت بتعديل حقل الإدخال أثناء نشاط المزامنة، يجب عليك إعادة التسجيل مع الموزع؛ يمكن القيام بذلك ببساطة باستخدام زر "``Restart``".
كتذكير، من الممكن عمل اسم مستعار افتراضيًا باستخدام ملف التكوين ``.sync``.
### اختصارات IDA العامة
يحدد **ret-sync** هذه الاختصارات العامة في IDA:
* ``Alt-Shift-S`` - تشغيل إضافة **ret-sync**
* ``Ctrl-Shift-S`` - تبديل المزامنة العالمية
* ``Ctrl-H`` - تبديل مزامنة Hex-Rays
يتوفر أيضًا زرّان في شريط أدوات التصحيح لتبديل المزامنة العالمية ومزامنة Hex-Rays.
### روابط IDA على أوامر مصحح الأخطاء
يسجل ``Syncplugin.py`` أيضًا مفاتيح اختصار غلاف أوامر مصحح الأخطاء.
* ``F2`` - تعيين نقطة توقف في عنوان المؤشر
* ``F3`` - تعيين نقطة توقف لمرة واحدة في عنوان المؤشر
* ``Ctrl-F2`` - تعيين نقطة توقف للأجهزة في عنوان المؤشر
* ``Ctrl-F3`` - تعيين نقطة توقف للأجهزة لمرة واحدة في عنوان المؤشر
* ``Alt-F2`` - ترجمة (إعادة قاعدة في مصحح الأخطاء) عنوان المؤشر الحالي
* ``Alt-F5`` - تشغيل
* ``Ctrl-Alt-F5`` - تشغيل (GDB فقط)
* ``F10`` - تنفيذ خطوة واحدة
* ``F11`` - تتبع فردي
هذه الأوامر متاحة فقط عندما يكون IDB الحالي نشطًا. عند الإمكان، تم تنفيذها أيضًا لمصححات أخطاء أخرى.
## استخدام Ghidra
### واجهة المستخدم الرسومية لإضافة Ghidra
بمجرد فتح RetSyncPlugin، يمكنك إضافته إلى نافذة CodeBrowser ببساطة عن طريق السحب والإفلات:

إذا كنت تريد عرض عدة وحدات، يجب أن تكون الملفات مفتوحة في نفس عارض CodeBrowser، ببساطة قم بسحب وإفلات الملفات الإضافية في نافذة CodeBrowser للحصول على النتيجة كما أعلاه.
### اختصارات Ghidra العامة
يحدد **ret-sync** هذه الاختصارات العامة في Ghidra:
* ``Alt-S`` - تمكين المزامنة
* ``Alt-Shift-S`` - تعطيل المزامنة
* ``Alt-R`` - إعادة تشغيل المزامنة
* ``Alt-Shift-R`` - إعادة تحميل التكوين
### روابط Ghidra على أوامر مصحح الأخطاء
تم أيضًا تنفيذ روابط على أوامر مصحح الأخطاء. إنها مشابهة لتلك الموجودة في إضافة IDA (باستثناء أمر "Go").
* ``F2`` - تعيين نقطة توقف في عنوان المؤشر
* ``Ctrl-F2`` - تعيين نقطة توقف للأجهزة في عنوان المؤشر
* ``Alt-F3`` - تعيين نقطة توقف لمرة واحدة في عنوان المؤشر
* ``Ctrl-F3`` - تعيين نقطة توقف للأجهزة لمرة واحدة في عنوان المؤشر
* ``Alt-F2`` - ترجمة (إعادة قاعدة في مصحح الأخطاء) عنوان المؤشر الحالي
* ``F5`` - تشغيل
* ``Alt-F5`` - تشغيل (GDB فقط)
* ``F10`` - تنفيذ خطوة واحدة
* ``F11`` - تتبع فردي
## استخدام Binary Ninja
### اختصارات Binary Ninja العامة
يحدد **ret-sync** هذه الاختصارات العامة في Binary Ninja:
* ``Alt-S`` - تمكين المزامنة
* ``Alt-Shift-S`` - تعطيل المزامنة
### اختصارات Binary Ninja
تم أيضًا تنفيذ روابط على أوامر مصحح الأخطاء. إنها مشابهة لتلك الموجودة في إضافة IDA.
* ``F2`` - تعيين نقطة توقف في عنوان المؤشر
* ``Ctrl-F2`` - تعيين نقطة توقف للأجهزة في عنوان المؤشر
* ``Alt-F3`` - تعيين نقطة توقف لمرة واحدة في عنوان المؤشر
* ``Ctrl-F3`` - تعيين نقطة توقف للأجهزة لمرة واحدة في عنوان المؤشر
* ``Alt-F2`` - ترجمة (إعادة قاعدة في مصحح الأخطاء) عنوان المؤشر الحالي
* ``Alt-F5`` - تشغيل
* ``F10`` - تنفيذ خطوة واحدة
* ``F11`` - تتبع فردي
## استخدام WinDbg
### أوامر إضافة WinDbg
* **!sync**: بدء المزامنة
* **!syncoff**: إيقاف المزامنة
* **!synchelp**: عرض قائمة الأوامر المتاحة مع شرح مختصر.
* **!cmt [-a address] <string>**: إضافة تعليق في عنوان IP الحالي في IDA```
[WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
0:000:x86> dd esp 8
0028ed94 00000000 00433845 0028eebc 00000032
0028eda4 0028f88c 00000064 002b049e 00000110
0:000:x86> !cmt 0028ed94 00000000 00433845 0028eebc 00000032
[sync.dll] !cmt called
[IDA]
.text:00430DB1 push edi ; 0028ed94 00000000 00433845 0028eebc 00000032
!rcmt [-a address]: إعادة تعيين التعليق في عنوان IP الحالي في IDA``` [WinDbg] 0:000:x86> !rcmt [sync] !rcmt called
[IDA] .text:00430DB1 push edi
* **!fcmt [-a address] <string>**: أضف تعليق دالة للدالة التي يوجد بها عنوان ip الحالي```
[WinDbg]
0:000:x86> !fcmt decodes buffer with key
[sync] !fcmt called
[IDA]
.text:004012E0 ; decodes buffer with key
.text:004012E0 public decrypt_func
.text:004012E0 decrypt_func proc near
.text:004012E0 push ebp
ملاحظة: استدعاء هذا الأمر بدون وسيطة يعيد تعيين تعليق الوظيفة.
!raddr : إضافة تعليق مع عنوان معاد أساسه (rebased address) يتم تقييمه من التعبير
!rln : الحصول على رمز من المفكك (disassembler) للعنوان المحدد
!lbl [-a address] : إضافة اسم تسمية (label) عند عنوان التعليمات الحالي (ip) في المفكك``` [WinDbg] 0:000:x86> !lbl meaningful_label [sync] !lbl called
[IDA] .text:000000000040271E meaningful_label: .text:000000000040271E mov rdx, rsp
* **!cmd <string>**: تنفيذ أمر في WinDbg وإضافة مخرجاته كتعليق عند عنوان التعليمات الحالي في مفكك التجميع```
[WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
[sync.dll] !cmd r edi
[IDA]
.text:00430DB1 push edi ; edi=00000064
currently connected idb(s): [0] target.exe
* **!syncmodauto <on|off>**: تفعيل/تعطيل التبديل التلقائي للمفكك بناءً على اسم الوحدة النمطية:```
[WinDbg]
0:000> !syncmodauto off
[IDA]
[*] << broker << dispatcher msg: sync mode auto set to off
current idb set to 0
في هذا المثال، سيكون عميل IDB النشط الحالي قد تم تعيينه إلى:```
[0] target.exe.
Alt-F2)، إعادة تعريف العنوان الأساسي لعنوان بالنسبة لاسم الوحدة وإزاحتها.الأوامر !cmt و !rcmt و !fcmt تدعم خيار عنوان اختياري: -a أو --address.
يجب تمرير العنوان كقيمة سداسية عشرية. يعتمد تحليل الأمر على وحدة argparse في بايثون.
لإيقاف تحليل السطر استخدم --.```
[WinDbg]
0:000:x86> !cmt -a 0x430DB2 comment
يجب أن يكون العنوان عنوان تعليمة صالح.
## GNU gdb (GDB) الاستخدام
مزامنة مع المضيف:```
gdb> sync
[sync] sync is now enabled with host 192.168.52.1
<not running>
gdb> r
Starting program: /bin/ls
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
استخدم الأوامر، بدون بادئة "!"``` (gdb) cmd x/i $pc [sync] command output: => 0x8049ca3: push edi
(gdb) synchelp
[sync] extension commands help:
> sync <host>
> syncoff
> cmt [-a address] <string>
> rcmt [-a address] <string>
> fcmt [-a address] <string>
> cmd <string>
> bc <on|off|>
> rln <address>
> bbt <symbol>
> patch <addr> <count> <size>
> bx /i <symbol>
> cc
> translate <base> <addr> <mod>
* **rln**: الحصول على الرمز من IDB للعنوان المعطى
* **bbt**: تتبع خلفي رائع. مشابه لـ **bt** لكن يطلب الرموز من مفكك الشفرة```
(gdb) bt
#0 0x0000000000a91a73 in ?? ()
#1 0x0000000000a6d994 in ?? ()
#2 0x0000000000a89125 in ?? ()
#3 0x0000000000a8a574 in ?? ()
#4 0x000000000044f83b in ?? ()
#5 0x0000000000000000 in ?? ()
(gdb) bbt
#0 0x0000000000a91a73 in IKE_GetAssembledPkt ()
#1 0x0000000000a6d994 in catcher ()
#2 0x0000000000a89125 in IKEProcessMsg ()
#3 0x0000000000a8a574 in IkeDaemon ()
#4 0x000000000044f83b in sub_44F7D0 ()
#5 0x0000000000000000 in ()
patch: تصحيح البايتات في المفكك بناءً على السياق الحي
bx: عرض جميل. مشابه لـ x ولكن باستخدام رمز. الرمز سيتم حله بواسطة المفكك.
cc: متابعة إلى المؤشر في المفكك. هذا بديل لاستخدام F3 لـ
تعيين نقطة توقف لمرة واحدة وF5 للمتابعة. هذا مفيد إذا كنت تفضل
القيام بذلك من gdb.```
(gdb) b* 0xA91A73
Breakpoint 1 at 0xa91a73
(gdb) c
Continuing.
Breakpoint 1, 0x0000000000a91a73 in ?? () (gdb) cc [sync] current cursor: 0xa91a7f [sync] reached successfully (gdb)
## استخدام LLDB
1. المزامنة مع المضيف```
lldb> process launch -s
lldb> sync
[sync] connecting to localhost
[sync] sync is now enabled with host localhost
[sync] event handler started
sync = synchronize with or the default value syncoff = stop synchronization cmt = add comment at current eip in IDA rcmt = reset comments at current eip in IDA fcmt = add a function comment for 'f = get_func(eip)' in IDA cmd = execute command and add its output as comment at current eip in IDA bc <on|off|> = enable/disable path coloring in IDA color a single instruction at current eip if called without argument lldb> cmt mooo
## استخدام OllyDbg 1.10
1. استخدم قائمة الإضافات أو الاختصارات لتمكين (``Alt+s``)/تعطيل (``Alt+u``) المزامنة.
## استخدام OllyDbg2
1. استخدم قائمة الإضافات أو الاختصارات لتمكين (``Ctrl+s``)/تعطيل (``Ctrl+u``) المزامنة.
نظرًا للحالة التجريبية لواجهة برمجة تطبيقات OllyDbg2، تم تنفيذ الميزات التالية فقط:
- مزامنة الرسم البياني [استخدم ``F7``؛ ``F8`` للتنقل خطوة بخطوة]
- تعليق [استخدم ``CTRL+;``]
- تسمية [استخدم ``CTRL+:``]
## استخدام x64dbg
1. استخدم قائمة الإضافات أو الأوامر لتمكين ("``!sync"``) أو تعطيل ("``!syncoff``") المزامنة.
2. استخدم الأوامر```
[sync] synchelp command!
[sync] extension commands help:
> !sync = synchronize with <host from conf> or the default value
> !syncoff = stop synchronization
> !syncmodauto <on | off> = enable / disable idb auto switch based on module name
> !synchelp = display this help
> !cmt <string> = add comment at current eip in IDA
> !rcmt <string> = reset comments at current eip in IDA
> !idblist = display list of all IDB clients connected to the dispatcher
> !idb <module name> = set given module as the active idb (see !idblist)
> !idbn <n> = set active idb to the n_th client. n should be a valid decimal value
> !translate <base> <addr> <mod> = rebase an address with respect to local module's base
> !insync = synchronize the selected instruction block in the disassembly window.
ملاحظة: استخدام الأمر !translate من أداة التفكيك (IDA/Ghidra،
اختصار Alt-F2)، سيجعل نافذة أداة التفكيك "تقفز" إلى
العنوان المحدد (ما يعادل تشغيل disasm في سطر أوامر x64dbg).
قد يرغب المرء في استخدام الميزات الأساسية لـ ret-sync (مزامنة الموضع مع أداة تفكيك، تحليل الرموز) حتى لو لم تكن بيئة تصحيح أخطاء كاملة متاحة أو باستخدام أداة مخصصة. لتحقيق ذلك، تم استخراج مكتبة بايثون بسيطة للغاية.
المثال أدناه يوضح استخدام مكتبة بايثون مع سكربت يتنقل عبر مخرجات أداة تسجيل/تتبع تعتمد على الأحداث.```python from sync import *
HOST = '127.0.0.1'
MAPPINGS = [ [0x555555400000, 0x555555402000, 0x2000, " /bin/tempfile"], [0x7ffff7dd3000, 0x7ffff7dfc000, 0x29000, " /lib/x86_64-linux-gnu/ld-2.27.so"], [0x7ffff7ff7000, 0x7ffff7ffb000, 0x4000, " [vvar]"], [0x7ffff7ffb000, 0x7ffff7ffc000, 0x1000, " [vdso]"], [0x7ffffffde000, 0x7ffffffff000, 0x21000, " [stack]"], ]
EVENTS = [ [0x0000555555400e74, "malloc"], [0x0000555555400eb3, "open"], [0x0000555555400ee8, "exit"] ]
synctool = Sync(HOST, MAPPINGS)
for e in EVENTS: offset, name = e synctool.invoke(offset) print(" 0x%08x - %s" % (offset, name)) print("[>] press enter for next event") input()
# توسيع
على الرغم من أن التركيز الأولي كان على التحليل الديناميكي (المصححات)، فمن الممكن بالطبع توسيع مجموعة الإضافات والتكامل مع أدوات أخرى.
- التكامل مع **REVEN** منصة التحليل والتصحيح الخالدة بواسطة [Tetrane](https://www.tetrane.com/):
- http://blog.tetrane.com/2015/02/reven-in-your-toolkit.html
- https://twitter.com/tetrane/status/1374768014193799175
- التكامل مع **محاكي EFI DXE** بواسطة Assaf Carlsbad ([@assaf_carlsbad](https://twitter.com/assaf_carlsbad)):
- https://twitter.com/assaf_carlsbad/status/1242114356881641474
- https://github.com/assafcarlsbad/efi_dxe_emulator
مصادر أخرى:
- "*الجمع بين التحليل الثنائي الثابت والديناميكي - ret-sync*" بواسطة Jean-Christophe Delaunay
- https://www.synacktiv.com/ressources/bieresecu1_ret-sync_en.pdf
# TODO
- بالتأكيد.
# الأخطاء/القيود المعروفة
- تم الاختبار مع Python 2.7/3.7, IDA 7.7 (Windows, Linux and Mac OS X), Ghidra 10.1.1, Binary Ninja 3.0.3225-dev, GNU gdb (GDB) 8.1.0 (Debian), lldb 310.2.37.
- **لا يوجد أي مصادقة/تشفير** على الإطلاق بين الأطراف؛ أنت مسؤول عن نفسك.
- الكود ذاتي التعديل خارج النطاق.
مع GDB:
- يبدو أن حدث التوقف لا يتم استدعاؤه عند استخدام أمر 'return'.
- تصحيح أخطاء تعدد الخيوط يواجه مشاكل مع الإشارات.
مع WinDbg:
- يتم إعلام إضافة عميل IDA حتى لو كانت نقطة التوقف تواجه سلسلة أوامر تجعلها تستمر ('``g``'). يمكن أن يتسبب هذا في تباطؤ كبير إذا كان هناك الكثير من هذه الأحداث. تم تنفيذ إصلاح محدود، أفضل حل هو لا يزال إيقاف المزامنة مؤقتًا.
- حالة تسابق محتملة.
مع Ghidra:
- لا تعمل الاختصارات كما هو متوقع في أداة فك التجميع.
مع IDA:
- إعادة رسم نافذة الرسم البياني بطيئة جدًا للرسوم البيانية الكبيرة.
- اختصارات **ret-sync** تتعارض في بيئات لينكس.
التعارضات:
- من المعروف أن برنامج تحديث Logitech يستخدم نفس المنفذ الافتراضي (9100). الحل هو استخدام ملف تكوين `.sync` عام لتحديد منفذ مختلف.```
[INTERFACE]
host=127.0.0.1
port=9234
ret-sync هو برنامج حر: يمكنك إعادة توزيعه و/أو تعديله بموجب شروط رخصة جنو العمومية العامة كما تنشرها مؤسسة البرمجيات الحرة، إما الإصدار 3 من الرخصة أو (حسب اختيارك) أي إصدار لاحق.
يتم توزيع هذا البرنامج على أمل أن يكون مفيدًا، ولكن دون أي ضمان؛ حتى بدون الضمان الضمني للتسويق أو الملاءمة لغرض معين. راجع رخصة جنو العمومية العامة لمزيد من التفاصيل.
يجب أن تكون قد تلقيت نسخة من رخصة جنو العمومية العامة مع هذا البرنامج. إذا لم يكن الأمر كذلك، راجع http://www.gnu.org/licenses/.
يتم إصدار إضافة Binary Ninja بموجب رخصة MIT.
تحية لبروس دانغ، StalkR، @Ivanlef0u، داميان أوميتر، سيباستيان رينو وكيفين سكودلابسكي، @m00dy، @saidelike، كزافييه ميرينبرغر، ben64، رافاييل ريجو، Jiss على لطفهم ومساعدتهم وملاحظاتهم وأفكارهم. إلفاك جيلفانوف، إيغور سكوشينسكي وأرنو ديدرين لمساعدتهم في فهم آلية عمل IDA ودعمهم المتميز. شكرًا لجوردان وينز و Vector 35. أخيرًا، شكرًا أيضًا لجميع المساهمين وكل من أبلغ عن المشكلات/الأخطاء.