
iOS kernelcache रिवर्स इंजीनियरिंग के लिए एक Ghidra फ्रेमवर्क
यह फ्रेमवर्क Kernelcache रिवर्स इंजीनियरिंग में मेरे अनुभव का अंतिम उत्पाद है, मैं आमतौर पर कर्नेल और इसके एक्सटेंशन की मैन्युअल ऑडिट करके कमजोरियों की तलाश करता हूं और Ghidra में अधिकांश चीजों को स्वचालित कर दिया है जिन्हें मैं वास्तव में रिवर्सिंग की प्रक्रिया को तेज करने के लिए देखना चाहता था, और यह प्रभावी साबित हुआ है और बहुत समय बचाता है। यह फ्रेमवर्क iOS 12/13/14/15 और macOS 11/12 (दोनों kernelcache और एकल KEXT) पर काम करता है और इसे जनता के लिए इस इरादे से बनाया गया है कि लोग अपने स्वयं के वातावरण को तैयार करने के संघर्ष के बिना iOS कर्नेल पर शोध शुरू कर सकें। जैसा कि मेरा मानना है, यह फ्रेमवर्क (इसमें प्रदान किए गए टूलसेट और IOKit के कुछ बुनियादी ज्ञान के साथ) Kernelcache में हैकिंग शुरू करने के लिए पर्याप्त है।
यह फ्रेमवर्क पूरी तरह से Python में लिखा गया है, और इसे अन्य टूल बनाने के लिए बढ़ाया जा सकता है, यह कुछ बुनियादी API प्रदान करता है जिनका उपयोग आप लगभग किसी भी प्रोजेक्ट में कर सकते हैं और लंबे मैनुअल को पढ़ने से समय बचा सकते हैं, आपका utils/ निर्देशिका में मुख्य कार्यक्षमताओं को पढ़ने के लिए स्वागत है।
Ghidra Kernelcache का विश्लेषण करने में अच्छा है, लेकिन अन्य RE टूल की तरह, इसे कुछ मैन्युअल काम की आवश्यकता होती है, ghidra_kernelcache शुरुआत में और रिवर्स इंजीनियरिंग करते समय भी चीजों को ठीक करने के लिए एक अच्छा प्रवेश बिंदु प्रदान करता है, जिससे एक अच्छा डीकंपाइलर आउटपुट मिलता है।
@_bazad द्वारा IDAPro में एक समान प्रोजेक्ट है जिसे ida_kernelcache कहा जाता है जो IDA में कर्नेल इमेज के साथ काम करने वाले शोधकर्ताओं के लिए एक अच्छा प्रवेश बिंदु प्रदान करता है, मेरा फ्रेमवर्क Brandon के काम के समान दिखता है, और kernelcache के साथ काम करने की प्रक्रिया को कम दर्दनाक बनाने के लिए और अधिक सुविधाएं प्रदान करके आगे बढ़ता है।
::externalMethod() और ::getTargetAndMethodForIndex() दोनों के लिए बाहरी मेथड की डिस्पैच टेबल का ऑटो फिक्सिंग.ये सुविधाएं अलग-अलग टूल के रूप में बनाई गई हैं जिन्हें की शॉर्टकट द्वारा या टूलबार में उनके आइकन पर क्लिक करके निष्पादित किया जा सकता है।
रिपॉजिटरी को क्लोन करें :```sh git clone https://github.com/0x36/ghidra_kernelcache.git
**महत्वपूर्ण नोट**: यह प्रोजेक्ट Ghidra 10.1_PUBLIC और 10.2_DEV पर परीक्षित किया गया है और पिछले संस्करणों के साथ संगत नहीं है।
*`Windows → Script Manager`* पर जाएँ, *`script Directory`* पर क्लिक करें, फिर *`ghidra_kernelcache`* को निर्देशिका पथ सूची में जोड़ें।
*`Windows → Script Manager`* पर जाएँ, *scripts* सूची में, *`iOS→kernel`* श्रेणी पर जाएँ और वहाँ देखे गए प्लगइन्स को चेक करें, वे GHIDRA टूलबार में दिखाई देंगे।
[logos/](https://github.com/0x36/ghidra_kernelcache/tree/master/logos) निर्देशिका में, आप प्रत्येक टूल के लिए अपने स्वयं के लोगो रख सकते हैं।
## iOS kernelcache प्रतीकीकरण
`ghidra_kernelcache` को पहले चरण में [iometa](https://github.com/Siguza/iometa/) (जिसे [@s1guza](https://twitter.com/s1guza) ने बनाया है) की आवश्यकता होती है, जो कर्नेल बाइनरी में C++ क्लास जानकारी प्रदान करने वाला एक शक्तिशाली उपकरण है। सबसे अच्छी बात यह है कि यह एक स्वतंत्र बाइनरी के रूप में काम करता है, इसलिए आउटपुट को आपके पसंदीदा RE फ्रेमवर्क में केवल पार्स करके आयात किया जा सकता है। मेरा फ्रेमवर्क iometa के आउटपुट को लेता है और प्रतीकीकरण और वर्चुअल तालिकाओं को ठीक करने के लिए पार्स करता है।
### उपयोग
कर्नेल को डीकंप्रेस करने के बाद, निम्नलिखित कमांड चलाएँ:```sh
$ iometa -n -A /tmp/kernel A10-legacy.txt > /tmp/kernel.txt
# if you want also to symbolicate using jtool2
$ jtool2 --analyze /tmp/kernel
Ghidra में kernelcache लोड करें, बैच आयात का उपयोग न करें, इसे Mach-O इमेज के रूप में लोड करें।
Kernelcache के लोड और स्वचालित विश्लेषण के बाद, टूलबार में दिखाए गए आइकन पर क्लिक करें या बस Meta-Shift-K दबाएँ, फिर iometa आउटपुट का पूरा पथ डालें जो हमारे मामले में /tmp/kernel.txt है।
यदि आप jtool2 प्रतीकों का उपयोग करना चाहते हैं, तो आप iOS→kernel श्रेणी में स्थित jsymbol.py का भी उपयोग कर सकते हैं।
पूर्ण API उदाहरण ghidra_kernelcache/kc.py में हैं।
→ यहाँ क्लास ऑब्जेक्ट्स के हेरफेर के कुछ उदाहरण हैं:```py from utils.helpers import * from utils.class import * from utils.iometa import ParseIOMeta
ff = "/Users/mg/ghidra_ios/kernel.txt" iom = ParseIOMeta(ff) Obj = iom.getObjects() kc = kernelCache(Obj)
kc.process_all_classes()
kc.process_classes_for_bundle("com.apple.iokit.IOSurface")
kc.process_classes_for_bundle("kernel")
kc.process_class("IOGraphicsAccelerator2")
kc.clear_class_structures()
kc.update_classes_vtable()
kc.explore_pac()
जैसा कि आप देख सकते हैं, आप kernelcache को पूरी तरह या आंशिक रूप से प्रतीकीकृत (symbolicate) कर सकते हैं, यदि आंशिक प्रतीकीकरण चुना गया है, तो `ghidra_kernelcache` आगे बढ़ने से पहले स्वचालित रूप से सभी वर्ग निर्भरताओं का निर्माण करेगा।
यदि आप पूरे kernelcache (पूर्ण प्रतीकीकरण) के विरुद्ध स्क्रिप्ट चलाते हैं, तो `ghidra_kernelcache` को कर्नेल इमेज का विश्लेषण करने में कई मिनट लगेंगे।
एक बार समाप्त होने पर, Ghidra निम्नलिखित प्रदान करेगा:
→ बुकमार्क फ़िल्टर में "iOS" नामक एक नई श्रेणी जोड़ी गई है:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image1.png" alt="image1" width="200"/>
→ IOKit वर्ग वर्चुअल टेबल्स को बेहतर और तेज़ वर्चुअल टेबल खोज के लिए 'iOS' बुकमार्क में जोड़ा जाता है, आप केवल सर्च बार में अक्षर, शब्द या kext बंडल प्रदान करके kext या वर्ग खोज सकते हैं।
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image2.png" alt="image2"/>
→ वर्चुअल टेबल को ठीक करना: अज्ञात कोड को डिसएसेंबल/कंपाइल करना, नेमस्पेस ठीक करना, वर्ग विधियों को पुनः प्रतीकीकृत करना और प्रत्येक विधि पर फंक्शन डेफिनिशन लागू करना:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image3.png" alt="image3"/>
→ वर्ग नेमस्पेस का निर्माण और प्रत्येक विधि को उसके संगत नेमस्पेस में रखना:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image4.png" alt="image4"/>
→ वर्ग पदानुक्रम के सम्मान के साथ वर्ग संरचना बनाना:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image5.png" alt="image5"/>
→ वर्ग vtable बनाना, और प्रत्येक विधि की अपनी विधि परिभाषा होती है जिससे डीकंपाइलेशन आउटपुट बेहतर होता है:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image6.png" alt="image6"/>
पूर्ण कार्यान्वयन [`utils/class.py.`](https://github.com/0x36/ghidra_kernelcache/blob/master/utils/class.py) में पाया जा सकता है।
यहाँ `ghidra_kernelcache` का उपयोग करके प्रतीकीकरण से पहले/बाद के कुछ स्क्रीनशॉट हैं:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image7.png" alt="image7"/>
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image8.png" alt="image8"/>