
IDA Pro, Ghidra और Binary Ninja से डिसअसेम्बली को संक्षिप्त protobuf फ़ाइलों में निर्यात करता है, ताकि Python बाइंडिंग्स के माध्यम से तेज़, स्टैंडअलोन बाइनरी विश्लेषण और प्रोग्राम हेरफेर किया जा सके।
यह छवि DALL-E द्वारा निर्मित है
Quokka एक बाइनरी एक्सपोर्टर है: किसी प्रोग्राम के डिसअसेम्बली से, यह एक एक्सपोर्ट फ़ाइल उत्पन्न करता है जिसका उपयोग डिसअसेम्बलर के बिना किया जा सकता है। यह वर्तमान में डिसअसेम्बली बैकएंड के रूप में IDA Pro, Ghidra और Binary Ninja का समर्थन करता है।
Quokka का मुख्य उद्देश्य प्रारंभिक एक्सपोर्ट के बाद कभी भी डिसअसेम्बलर खोले बिना बाइनरी को पूरी तरह से हेर-फेर करने में सक्षम बनाना है। इसके अलावा, यह उपयोगकर्ताओं को एक स्वच्छ इंटरफ़ेस प्रदान करने के लिए डिसअसेम्बलर के API को एब्स्ट्रैक्ट करता है।
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
नोट: Quokka द्वारा उत्पन्न फ़ाइल को पढ़ने के लिए IDA प्लगइन की आवश्यकता नहीं है। इसका उपयोग केवल उन्हें उत्पन्न करने के लिए किया जाता है।
Quokka, IDA 9.1+ के साथ संगत है।
Quokka को Hex-Rays प्लगइन रिपॉजिटरी में प्रकाशित किया गया है और इसे hcli के साथ इंस्टॉल किया जा सकता है:
user@host:~$ hcli plugin install quokka
प्लगइन CI पर भी बनाया जाता है और रिलीज़ टैब में उपलब्ध है।
प्लगइन डाउनलोड करने के लिए, quokka_plugin.so नामक फ़ाइल (या अपने IDA संस्करण के लिए quokka-ida<version>.zip संग्रह) लें और इसे अपनी IDA plugins निर्देशिका में कॉपी करें।
Quokka एक समर्पित एक्सटेंशन के माध्यम से Ghidra (>= 12.0.3) से एक्सपोर्ट का भी समर्थन करता है। यह वही .quokka protobuf फ़ाइलें उत्पन्न करता है जिन्हें Python लाइब्रेरी लोड कर सकती है।
निर्माण निर्देशों, स्थापना और उपयोग के विवरण के लिए Ghidra एक्सटेंशन README देखें।
Quokka एक Python प्लगइन के माध्यम से Binary Ninja से एक्सपोर्ट का भी समर्थन करता है। यह वही .quokka protobuf फ़ाइलें उत्पन्न करता है जिन्हें Python लाइब्रेरी लोड कर सकती है।
स्थापना और उपयोग के विवरण के लिए BinaryNinja एक्सटेंशन README देखें।
बाइनरी एक्सपोर्ट करने का पहला मैन्युअल तरीका 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
अधिक विवरण के लिए Ghidra एक्सटेंशन README देखें।
नोट: Binary Ninja API के हेडलेस उपयोग के लिए व्यावसायिक लाइसेंस की आवश्यकता होती है। यदि लाइसेंस नहीं है, तो इसके बजाय Binary Ninja UI के अंदर एक्सपोर्ट कमांड का उपयोग करें।
$ python binaryninja_extension/export_headless.py /path/to/binary \
-o /path/to/output.quokka --mode LIGHT
अधिक विवरण के लिए BinaryNinja एक्सटेंशन README देखें।
Quokka एक CLI उपयोगिता टूल प्रदान करता है जो एक या अधिक फ़ाइलों और/या निर्देशिकाओं (प्रत्येक निर्देशिका में सभी निष्पादन योग्य फ़ाइलें) को समानांतर में स्वचालित रूप से एक्सपोर्ट करता है। यह 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 को अंततः ओपन सोर्स कर दिया गया है, इसलिए इसे अलग से डाउनलोड करने की कोई आवश्यकता नहीं है।
आप इसे github से स्वचालित रूप से सिंक करने के लिए cmake विकल्प -DIDA_VERSION=<major>.<minor> का उपयोग कर सकते हैं।
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 अभी भी प्रोप्राइटरी कोड है, आपको इसे स्वयं प्राप्त करना होगा और विकल्प -DIdaSdk_ROOT_DIR:STRING=path/to/sdk के माध्यम से इसका पथ cmake को प्रदान करना होगा।
नोट: यह नए संस्करणों पर भी काम करेगा, लेकिन इसके लिए उपयोगकर्ताओं को अधिक चरणों की आवश्यकता होगी क्योंकि उन्हें 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/
निर्माण के बारे में अधिक विस्तृत जानकारी के लिए, निर्माण देखें।
दस्तावेज़ीकरण ऑनलाइन दस्तावेज़ीकरण पर उपलब्ध है।
आप प्रश्नों की सूची यहाँ देख सकते हैं FAQ
नोट: वर्तमान में केवल LIGHT मोड लागू किया गया है। FULL (स्व-निहित) मोड की योजना बनाई गई है लेकिन यह अभी तक कार्यात्मक नहीं है।
Quokka डिसअसेम्बली विश्लेषण को एक्सपोर्ट करने के लिए दो मोड प्रदान करता है: light mode और self contained mode।
light mode केवल आवश्यक जानकारी एक्सपोर्ट करने पर केंद्रित है, जिससे तेज़ और हल्की फ़ाइलें बनती हैं। इस मोड में निर्देश स्तर या उससे नीचे की कोई जानकारी एक्सपोर्ट नहीं की जाती है, इसलिए निर्देशों का डिसअसेम्बली प्राप्त करने के लिए रनटाइम पर capstone इंजन का उपयोग किया जाएगा।
इसके विपरीत, self contained mode पूर्ण डिसअसेम्बली को बिल्कुल वैसे ही एक्सपोर्ट करता है जैसे बैकएंड डिसअसेम्बलर इसे दिखाता है। इससे भारी फ़ाइलें बनेंगी, लेकिन रनटाइम पर तृतीय-पक्ष डिसअसेम्बलर पर निर्भर रहने की आवश्यकता नहीं होती है।
यह ध्यान रखना महत्वपूर्ण है कि दोनों मोड python बाइंडिंग में समान API प्रदान करते हैं।
[!WARNING] self contained mode से capstone निर्देश ऑब्जेक्ट प्राप्त करना अभी भी संभव है, लेकिन सावधान रहें कि capstone डिसअसेम्बली quokka द्वारा एक्सपोर्ट की गई डिसअसेम्बली से भिन्न हो सकती है (निर्देश विभाजित, विलय, असमर्थित हो सकते हैं, या अलग mnemonics हो सकते हैं, आदि)। सामान्य तौर पर विभिन्न बाइनरी विश्लेषण प्लेटफ़ॉर्म अलग-अलग डिसअसेम्बली उत्पन्न करते हैं, capstone को self contained mode के साथ मिलाते समय इसे ध्यान में रखें।
दोनों मोडों के बीच अंतर का संपूर्ण अवलोकन नीचे दी गई तालिका में देखें:
¹ वैकल्पिक रूप से सक्षम
² वर्तमान में समर्थित नहीं
lightfull--decompiled डीकंपाइल्ड कोड एक्सपोर्ट सक्षम करने के लिए (केवल IDA)-v, --verbose वर्बोज़ लॉगिंग सक्षम करने के लिए| Light Mode | Self contained Mode |
|---|
| फ़ंक्शन | ✅ | ✅ |
| बेसिक ब्लॉक | ✅ | ✅ |
| निर्देश | ❌ | ✅ |
| ऑपरेंड | ❌ | ✅ |
| डेटा संदर्भ | ✅ | ✅ |
| क्रॉस संदर्भ | ✅ | ✅ |
| सेक्शन/लेआउट | ✅ | ✅ |
| डीकंपाइलेशन | ✅¹ | ✅¹ |
| CFG आरेखण निर्देशांक | ✅¹² | ✅¹² |