
يصدّر شيفرة التفكيك من IDA Pro وGhidra وBinary Ninja إلى ملفات protobuf مضغوطة لتحليل ثنائي سريع ومستقل ومعالجة البرامج عبر روابط Python.
صورة مولّدة بواسطة DALL-E
Quokka هي أداة تصدير ثنائية: من تفكيك البرنامج، تنشئ ملف تصدير يمكن استخدامه دون الحاجة إلى أداة التفكيك. وهو يدعم حاليًا IDA Pro وGhidra وBinary Ninja كواجهات خلفية للتفكيك.
الهدف الرئيسي من Quokka هو تمكين التعامل الكامل مع الملف الثنائي دون فتح أداة تفكيك بعد التصدير الأولي. علاوة على ذلك، فهو يجرّد واجهة برمجة تطبيقات أداة التفكيك لتوفير واجهة نظيفة للمستخدمين.
استلهمت Quokka بشكل كبير من BinExport، أداة تصدير الملفات الثنائية المستخدمة في BinDiff.
IDA Pro Ghidra Binary Ninja
│ │ │
IDA Plugin (C++) Ghidra Plugin (Java) BinaryNinja Plugin (Python)
│ │ │
└────────────── quokka.proto ─────────────────┘
(protobuf schema)
│
.quokka files
│
Python bindings (quokka.Program)
├── Capstone backend (primary)
└── Pypcode backend (optional)
تُبنى الإضافة في نظام التكامل المستمر (CI) وتتوفر في السجل.
يجب أن يكون من الممكن تثبيتها مباشرة من PIP باستخدام نوع الأمر التالي:
$ pip install quokka-project
ملاحظة: لا تحتاج إلى إضافة IDA لقراءة ملف مولّد بواسطة Quokka. تُستخدم فقط لإنشاء هذه الملفات.
Quokka متوافقة مع IDA 9.1+.
تُنشر Quokka في مستودع إضافات Hex-Rays ويمكن تثبيتها باستخدام hcli:
user@host:~$ hcli plugin install quokka
تُبنى الإضافة أيضًا في نظام التكامل المستمر وتتوفر في علامة التبويب الإصدارات.
لتنزيل الإضافة، احصل على الملف المسمى quokka_plugin.so (أو أرشيف quokka-ida<version>.zip المناسب لإصدار IDA لديك) وانسخه إلى دليل plugins في IDA.
تدعم Quokka أيضًا التصدير من Ghidra (>= 12.0.3) عبر إضافة مخصصة. تُنتج ملفات .quokka protobuf نفسها التي يمكن لمكتبة بايثون تحميلها.
للاطلاع على تعليمات البناء والتثبيت والاستخدام، راجع README إضافة Ghidra.
تدعم Quokka أيضًا التصدير من Binary Ninja عبر إضافة بايثون. تُنتج ملفات .quokka protobuf نفسها التي يمكن لمكتبة بايثون تحميلها.
للاطلاع على تفاصيل التثبيت والاستخدام، راجع README إضافة BinaryNinja.
الطريقة اليدوية الأولى لتصدير ملف ثنائي هي استخدام الإضافة داخل IDA Pro. الاختصار الافتراضي داخل IDA هو Alt+A. يفتح ذلك الحوار التالي:

الأنماط المتاحة هي:
ملاحظة: نمط FULL غير منفَّذ بعد. فقط نمط LIGHT يعمل حاليًا.
ملاحظة: يتطلب ذلك تثبيت IDA يعمل.
$ idat -OQuokkaAuto:true -OQuokkaDecompiled:true -A /path/to/hello.i64
جميع الخيارات المتاحة موصوفة في الاستخدام.
ملاحظة: يُستخدم idat بدلاً من ida لزيادة سرعة التصدير نظرًا لعدم الحاجة إلى واجهة رسومية.
$ analyzeHeadless /tmp/proj Test \
-import /path/to/binary \
-scriptPath ghidra_extension/src/script/ghidra_scripts \
-postScript QuokkaExportHeadless.java \
--out=/path/to/output.quokka --mode=LIGHT
راجع README إضافة Ghidra لمزيد من التفاصيل.
ملاحظة: الاستخدام غير الرسومي لواجهة برمجة تطبيقات Binary Ninja يتطلب ترخيصًا تجاريًا. بدون ذلك، استخدم أمر التصدير داخل واجهة مستخدم Binary Ninja بدلاً من ذلك.
$ python binaryninja_extension/export_headless.py /path/to/binary \
-o /path/to/output.quokka --mode LIGHT
راجع README إضافة BinaryNinja لمزيد من التفاصيل.
توفر Quokka أداة سطر أوامر لتصدير ملف واحد أو أكثر و/أو أدلة (جميع الملفات القابلة للتنفيذ في كل دليل) تلقائيًا وبالتوازي. وهي تدعم كلاً من الواجهتين الخلفيتين IDA Pro وGhidra:
$ quokka-cli --backend ghidra -t 8 dir/
$ quokka-cli --backend ida --ida-path /opt/ida -t 8 dir/
$ quokka-cli -t 8 dir/ # auto-detect backend
$ quokka-cli -o "%p/exports/%f.quokka" binary # custom output directory
$ quokka-cli -b ida -o %F_ida.quokka -t 4 dir/ # Using relative path
$ quokka-cli -t 8 dir1/ dir2/ binary1 binary2 # multiple inputs
افتراضيًا، يتم وضع ملف .quokka بجوار الملف الثنائي المُدخل (مثل /usr/bin/ls ينتج /usr/bin/ls.quokka). استخدم -o لتجاوز ذلك بمسار نصي أو قالب يُوسَّع لكل ملف (%f = اسم الجذر، %F = اسم الملف، %p = الدليل الأصلي، %P = المسار الكامل، %e = الامتداد، %% = علامة % حرفية).
شغّل quokka-cli --help للاطلاع على جميع الخيارات. تشمل العلامات الرئيسية:
-b, --backend لاختيار الواجهة الخلفية لأداة التفكيك (ida أو ghidra أو auto)-i, --ida-path لتوفير المسار إلى دليل تثبيت IDA (المجلد الذي يحتوي على idat)--ghidra-path لتوفير دليل تثبيت Ghidra (يتجاوز GHIDRA_INSTALL_DIR)-o, --output لتحديد مسار الإخراج أو القالب (الافتراضي: %F.quokka)-m, --mode لاختيار نمط التصدير ( أو )import quokka
from quokka.types import Disassembler
# Directly from the binary (auto-detects available backend)
prog = quokka.Program.from_binary("/bin/ls")
# Explicitly choose a backend
prog = quokka.Program.from_binary("/bin/ls", disassembler=Disassembler.GHIDRA)
prog = quokka.Program.from_binary("/bin/ls", disassembler=Disassembler.IDA)
# From the exported file
prog = quokka.Program("ls.quokka", # the exported file
"/bin/ls") # the original binary
# Add new types from C declarations
prog.add_type("struct context { int id; char name[64]; };")
prog.add_type("enum status { OK=0, ERROR=1 };")
# Save the .quokka file
prog.write()
# Or apply changes (including new types) back to the IDA database
prog.commit(database_file="ls.i64", overwrite=True)
راجع توثيق التحرير الكامل للحصول على تفاصيل حول إعادة تسمية الدوال، وتعيين النماذج الأولية، والمزيد.
تعتمد عملية البناء على إصدار IDA SDK الذي تستخدمه. يُشار إلى هذين الوضعين أيضًا باسم الوضع الجديد والوضع القديم.
أصبح Ida SDK أخيرًا مفتوح المصدر لذلك لم تعد هناك حاجة لتنزيله بشكل منفصل.
يمكنك استخدام خيار cmake -DIDA_VERSION=<major>.<minor> لمزامنته تلقائيًا من github.
user@host:~/quokka$ cmake -B build \ # Where to build
-S . \ # Where are the sources
-DIDA_VERSION=9.2 \ # IDA SDK version
-DCMAKE_BUILD_TYPE:STRING=Release \ # Build Type
user@host:~/quokka$ cmake --build build -- -j
نظرًا لأن IDA SDK لا يزال كودًا مملوكًا، يجب عليك جلبته بنفسك وتوفير مساره إلى cmake من خلال الخيار -DIdaSdk_ROOT_DIR:STRING=path/to/sdk
ملاحظة: سيعمل هذا أيضًا على الإصدارات الأحدث ولكنه يتطلب خطوات أكثر من المستخدمين حيث سيتعين عليهم تنزيل SDK بأنفسهم.
user@host:~/quokka$ cmake -B build \ # Where to build
-S . \ # Where are the sources
-DIdaSdk_ROOT_DIR:STRING=path/to/ida_sdk \ # Path to IDA SDK
-DCMAKE_BUILD_TYPE:STRING=Release \ # Build Type
user@host:~/quokka$ cmake --build build --target quokka_plugin -- -j
لتثبيت الإضافة:
user@host:~/quokka$ cmake --install build
في جميع الأحوال، ستكون الإضافة أيضًا في build/quokka-install. يمكنك نسخها إلى دليل إضافات المستخدم في IDA.
user@host:~/quokka$ cp build/quokka-install/quokka_plugin.so $HOME/.idapro/plugins/
لمزيد من المعلومات التفصيلية حول البناء، راجع البناء
التوثيق متاح عبر الإنترنت على التوثيق
يمكنك الاطلاع على قائمة الأسئلة هنا الأسئلة الشائعة
ملاحظة: نمط LIGHT فقط هو المنفَّذ حاليًا. نمط FULL (المكتفي ذاتيًا) مخطط له لكنه غير فعال بعد.
توفر Quokka وضعين لتصدير تحليل التفكيك: الوضع الخفيف والوضع المكتفي ذاتيًا.
يركز الوضع الخفيف على تصدير المعلومات الأساسية فقط، مما ينتج ملفات سريعة وخفيفة. في هذا الوضع لا يتم تصدير أي معلومات على مستوى التعليمات أو أدنى، لذلك سيتم استخدام محرك capstone في وقت التشغيل للحصول على تفكيك التعليمات.
بينما يصدّر الوضع المكتفي ذاتيًا التفكيك الكامل، تمامًا كما تعرضه أداة التفكيك الخلفية. سينتج هذا ملفات أثقل لكنه لا يتطلب الاعتماد على أدوات تفكيك خارجية في وقت التشغيل.
من المهم ملاحظة أن كلا الوضعين يوفّران نفس واجهة برمجة التطبيقات في روابط بايثون.
[!WARNING] من الوضع المكتفي ذاتيًا لا يزال من الممكن الحصول على كائن تعليمات capstone، ولكن انتبه إلى أن تفكيك capstone قد يختلف عن ذلك الذي صدّرته quokka (قد تكون التعليمات مقسّمة، أو مدمجة، أو غير مدعومة، أو تحتوي على رموز تذكيرية مختلفة، وما إلى ذلك). بشكل عام، تُنتج منصات تحليل الملفات الثنائية المختلفة تفكيكًا مختلفًا، ضع ذلك في الاعتبار عند دمج capstone مع الوضع المكتفي ذاتيًا.
للحصول على نظرة عامة كاملة حول الفرق بين الوضعين، انظر إلى الجدول أدناه:
¹ متاح اختياريًا
² غير مدعوم حاليًا
lightfull--decompiled لتمكين تصدير الكود بعد فك الترجمة (IDA فقط)-v, --verbose لتمكين التسجيل المفصّل| الوضع الخفيف | الوضع المكتفي ذاتيًا |
|---|
| الدوال | ✅ | ✅ |
| الكتل الأساسية | ✅ | ✅ |
| التعليمات | ❌ | ✅ |
| المعاملات | ❌ | ✅ |
| مراجع البيانات | ✅ | ✅ |
| المراجع المتقاطعة | ✅ | ✅ |
| الأقسام/التخطيط | ✅ | ✅ |
| فك الترجمة | ✅¹ | ✅¹ |
| إحداثيات رسم CFG | ✅¹² | ✅¹² |