macOS Apps - Inspecting, debugging and Fuzzing
स्थैतिक विश्लेषण
otool
objdump
jtool2
यह टूल codesign, otool, और objdump के लिए एक प्रतिस्थापन के रूप में उपयोग किया जा सकता है, और कुछ अतिरिक्त सुविधाएँ प्रदान करता है। यहाँ से डाउनलोड करें या brew
के साथ इंस्टॉल करें।
Codesign / ldid
Codesign
मैकओएस में पाया जा सकता है जबकि ldid
आईओएस में पाया जा सकता है।
SuspiciousPackage
SuspiciousPackage एक उपकरण है जो .pkg फ़ाइलें (इंस्टॉलर) की जांच करने के लिए उपयोगी है और इंस्टॉल करने से पहले देखने की सुविधा प्रदान करता है।
इन इंस्टॉलर में preinstall
और postinstall
बैश स्क्रिप्ट होते हैं जिन्हें मैलवेयर लेखक सामान्यत: दुरुपयोग करते हैं ताकि मैलवेयर को टिकाऊ बना सकें।
hdiutil
यह उपकरण Apple डिस्क छवियों (.dmg) फ़ाइलों को माउंट करने की अनुमति देता है ताकि इन्हें कुछ चलाने से पहले जांच सकें:
यह /Volumes
में माउंट किया जाएगा।
Objective-C
मेटाडेटा
ध्यान दें कि Objective-C में लिखे गए कार्यक्रम Mach-O binaries में कॉम्पाइल होने पर अपनी क्लास घोषणाएं बनाए रखते हैं। ऐसी क्लास घोषणाएं निम्नलिखित का नाम और प्रकार शामिल होता है:
कक्षा
कक्षा के विधियाँ
कक्षा के उदाहरण संदर्भ
आप class-dump का उपयोग करके इस जानकारी को प्राप्त कर सकते हैं:
कार्य को बुलाना
जब एक फ़ंक्शन को कॉल किया जाता है जो एक Objective-C का उपयोग करने वाले बाइनरी में है, तो कॉम्पाइल कोड उस फ़ंक्शन को बुलाने की बजाय, objc_msgSend
को बुलाएगा। जो अंतिम फ़ंक्शन को बुलाएगा:
इस फ़ंक्शन की उम्मीद की जाने वाली पैरामीटर हैं:
पहला पैरामीटर (self) "एक पॉइंटर है जो संदेश प्राप्त करने वाली कक्षा के उदाहरण की ओर पॉइंट करता है"। या और सरल शब्दों में कहें, यह वस्तु है जिस पर विधि को आमंत्रित किया जा रहा है। यदि विधि एक कक्षा विधि है, तो यह कक्षा वस्तु का एक उदाहरण होगा (सम्पूर्ण रूप से), जबकि एक उदाहरण विधि के लिए, self कक्षा के एक उदाहरण को एक वस्तु के रूप में संकेत करेगा।
दूसरा पैरामीटर, (op), "संदेश का संभालने वाली विधि का चयनकर्ता" है। फिर भी, और सरल शब्दों में कहें, यह बस विधि का नाम है।
शेष पैरामीटर वह कोई मान हैं जो विधि के द्वारा आवश्यक हैं (op)।
इस जानकारी को lldb
में ARM64 के साथ आसानी से कैसे प्राप्त किया जा सकता है देखें:
x64:
विधि | रजिस्टर | (के लिए) objc_msgSend |
1वां पैरामीटर | rdi | self: वस्तु जिस पर विधि को आमंत्रित किया जा रहा है |
2वां पैरामीटर | rsi | op: विधि का नाम |
3वां पैरामीटर | rdx | विधि के लिए 1वां पैरामीटर |
4वां पैरामीटर | rcx | विधि के लिए 2वां पैरामीटर |
5वां पैरामीटर | r8 | विधि के लिए 3वां पैरामीटर |
6वां पैरामीटर | r9 | विधि के लिए 4वां पैरामीटर |
7वां+ पैरामीटर | rsp+ (स्टैक पर) | विधि के लिए 5वां+ पैरामीटर |
स्विफ्ट
स्विफ्ट बाइनरी के साथ, क्योंकि यहाँ Objective-C संगतता है, कभी-कभी आप class-dump का उपयोग करके घोषणाएँ निकाल सकते हैं लेकिन हमेशा नहीं।
jtool -l
या otool -l
कमांड लाइन के साथ कई खंड खोजना संभव है जो __swift5
उपसर्ग से शुरू होते हैं:
आप इस ब्लॉग पोस्ट में इन सेक्शन में संग्रहित जानकारी के बारे में अधिक जानकारी पा सकते हैं।
इसके अतिरिक्त, स्विफ्ट बाइनरी में प्रतीक हो सकते हैं (उदाहरण के लिए पुस्तकालयों को प्रतीक संग्रहित करने की आवश्यकता होती है ताकि उनके कार्य को बुलाया जा सके)। **प्रतीकों में सामान्यत: फ़ंक्शन के नाम और एट्रिब्यूट की जानकारी होती है और यह एक बेहद अद्भुत तरीके से होती है, इसलिए वे बहुत उपयोगी होते हैं और वहाँ "डीमैंगलर्स" होते हैं जो मूल नाम प्राप्त कर सकते हैं:
पैक किए गए बाइनरी
उच्च एंट्रोपी की जांच करें
स्ट्रिंग की जांच करें (क्या कोई समझने योग्य स्ट्रिंग है, पैक किया गया है)
MacOS के लिए UPX पैकर एक धारा उत्पन्न करता है जिसे "__XHDR" कहा जाता है
गतिशील विश्लेषण
ध्यान दें कि बाइनरी को डीबग करने के लिए SIP को अक्षम करना आवश्यक है (csrutil disable
या csrutil enable --without debug
) या बाइनरी को एक अस्थायी फ़ोल्डर में कॉपी करना और codesign --remove-signature <binary-path>
के साथ सिग्नेचर को हटाना या बाइनरी का डीबगिंग अनुमति देना (आप इस स्क्रिप्ट का उपयोग कर सकते हैं)
ध्यान दें कि सिस्टम बाइनरी (जैसे cloudconfigurationd
) को इंस्ट्रुमेंट करने के लिए macOS पर, SIP को अक्षम किया जाना चाहिए (सिग्नेचर को बस हटाना काम नहीं करेगा)।
एकीकृत लॉग
MacOS बहुत सारे लॉग उत्पन्न करता है जो एक एप्लिकेशन चलाने पर उसके कार्य को समझने में बहुत उपयोगी हो सकते हैं।
इसके अतिरिक्त, कुछ लॉग होंगे जिनमें <private>
टैग होगा ताकि कुछ उपयोगकर्ता या कंप्यूटर संदर्भीय पहचाननीय जानकारी छुपाई जा सके। हालांकि, इस जानकारी को खोलने के लिए एक प्रमाणपत्र स्थापित करना संभव है। यहां से विवरणों का पालन करें।
हॉपर
बाएं पैनल
हॉपर के बाएं पैनल में बाइनरी के प्रतीक (लेबल), प्रक्रियाएँ और कार्य (प्रोसेड्यूर्स) की सूची और स्ट्रिंग (स्ट्र) देखना संभव है। ये सभी स्ट्रिंग नहीं हैं लेकिन वे मैक-ओ फ़ाइल के कई हिस्सों में परिभाषित हैं (जैसे cstring या objc_methname
की तरह)।
मध्य पैनल
मध्य पैनल में आप डिसएंबल कोड देख सकते हैं। और आप इसे रॉ डिसएंबल, ग्राफ, डीकंपाइल्ड और बाइनरी के रूप में देख सकते हैं जिसके लिए आपको संबंधित आइकन पर क्लिक करना होगा:
किसी कोड ऑब्जेक्ट पर राइट क्लिक करके आप उस ऑब्जेक्ट से/के लिए संदर्भ देख सकते हैं या उसका नाम बदल सकते हैं (यह डिकंपाइल्ड प्यूडोकोड में काम नहीं करता):
इसके अतिरिक्त, नीचे मध्य में आप पायथन कमांड लिख सकते हैं।
दाएं पैनल
दाएं पैनल में आप नेविगेशन हिस्ट्री (ताकि आप जानें कि आप वर्तमान स्थिति तक कैसे पहुंचे), कॉल ग्राफ जहां आप सभी कार्यों को देख सकते हैं जो इस कार्य को कॉल करते हैं और सभी कार्यों को यह कार्य किसे कॉल करता है, और स्थानीय चर जानकारी देख सकते हैं।
dtrace
यह उपयोगकर्ताओं को एक अत्यधिक निचले स्तर पर एप्लिकेशन तक पहुंचने और उनके निष्पादन फ्लो को बदलने का एक तरीका प्रदान करता है। Dtrace प्रोब्स का उपयोग करता है जो कर्नेल के भीतर विभिन्न स्थानों पर रखे गए होते हैं और ऐसे स्थानों पर होते हैं जैसे सिस्टम कॉल के आरंभ और समापन।
DTrace उपयोगकर्ताओं को प्रत्येक सिस्टम कॉल के प्रवेश और निकास स्थान में प्रोब बनाने के लिए dtrace_probe_create
फ़ंक्शन का उपयोग करता है। ये प्रोब्स प्रत्येक सिस्टम कॉल के प्रवेश और निकास स्थान में फायर किए जा सकते हैं। DTrace के साथ बातचीत /dev/dtrace के माध्यम से होती है जो केवल रूट उपयोगकर्ता के लिए ही उपलब्ध है।
SIP सुरक्षा को पूरी तरह से अक्षम किए बिना Dtrace को सक्षम करने के लिए आप रिकवरी मोड पर निम्नलिखित को कार्यान्वित कर सकते हैं: csrutil enable --without dtrace
आप उन बाइनरी को भी dtrace
या dtruss
कर सकते हैं जो आपने कंपाइल किया है।
dtrace के उपलब्ध प्रोब्स को प्राप्त करने के लिए निम्नलिखित के साथ कार्यान्वित किया जा सकता ह।
प्रोब नाम चार भागों से मिलकर बनता है: प्रदाता, मॉड्यूल, कार्य, और नाम (fbt:mach_kernel:ptrace:entry
). यदि आप नाम के किसी भाग को निर्दिष्ट नहीं करते हैं, तो Dtrace उस भाग को वाइल्डकार्ड के रूप में लागू करेगा।
प्रोब्स को सक्रिय करने और जब वे फायर होते हैं तो क्या क्रियाएँ करनी है, इसे कॉन्फ़िगर करने के लिए हमें डी भाषा का उपयोग करना होगा।
एक और विस्तृत व्याख्या और अधिक उदाहरण https://illumos.org/books/dtrace/chp-intro.html में देखा जा सकता है।
उदाहरण
man -k dtrace
चलाकर उपलब्ध DTrace स्क्रिप्ट की सूची देखें। उदाहरण: sudo dtruss -n binary
लाइन में
स्क्रिप्ट
dtruss
ktrace
आप इसे SIP सक्रिय होने पर भी उपयोग कर सकते हैं
ProcessMonitor
ProcessMonitor एक बहुत ही उपयोगी उपकरण है जो यह जांचने के लिए उपयोगी है कि कोई प्रक्रिया किस प्रकार की क्रियाएँ कर रही है (उदाहरण के लिए, देखें कि कोई प्रक्रिया कौन से नए प्रक्रियाएँ बना रही है)।
SpriteTree
SpriteTree एक उपकरण है जो प्रक्रियाओं के बीच संबंधों को प्रिंट करता है।
आपको अपने मैक को एक ऐसे कमांड के साथ मॉनिटर करने की आवश्यकता है जैसे sudo eslogger fork exec rename create > cap.json
(इसे लॉन्च करने के लिए टर्मिनल में FDA की आवश्यकता है)। और फिर आप इस उपकरण में JSON लोड कर सकते हैं ताकि आप सभी संबंधों को देख सकें:
FileMonitor
FileMonitor फाइल घटनाओं (जैसे निर्माण, संशोधन और हटाने) का मॉनिटर करने की अनुमति देता है जो इन घटनाओं के बारे में विस्तृत जानकारी प्रदान करता है।
Crescendo
Crescendo एक GUI उपकरण है जिसका लुक और फ़ील Windows उपयोगकर्ता जान सकते हैं Microsoft Sysinternal’s Procmon से। यह उपकरण विभिन्न घटना प्रकारों को शुरू और बंद करने की अनुमति देता है, इन घटनाओं को फ़ाइल, प्रक्रिया, नेटवर्क आदि जैसे श्रेणियों द्वारा फ़िल्टर करने की अनुमति देता है, और जो घटनाएँ जोड़ी गई हैं उन्हें एक JSON प्रारूप में सहेजने की क्षमता प्रदान करता है।
Apple Instruments
Apple Instruments Xcode के डेवलपर उपकरणों का हिस्सा हैं - जो अनुप्रयोग के प्रदर्शन को मॉनिटर करने, मेमोरी लीक्स की पहचान करने और फ़ाइल सिस्टम गतिविधि को ट्रैक करने के लिए उपयोग किया जाता है।
fs_usage
प्रक्रियाओं द्वारा किए गए कार्रवाई का पालन करने की अनुमति देता है:
TaskExplorer
Taskexplorer किसी बाइनरी द्वारा उपयोग की जाने वाली लाइब्रेरी, उसके द्वारा उपयोग की जा रही फ़ाइलें और नेटवर्क कनेक्शन देखने के लिए उपयोगी है। यह बाइनरी प्रक्रियाओं को virustotal के खिलाफ जांचता है और बाइनरी के बारे में जानकारी दिखाता है।
PT_DENY_ATTACH
इस ब्लॉग पोस्ट में आपको एक उदाहरण मिलेगा कि कैसे PT_DENY_ATTACH
का उपयोग करके चल रहे डेमन को डीबग किया जा सकता है, जिसने डीबगिंग को रोकने के लिए SIP भी अक्षम किया था।
lldb
lldb macOS बाइनरी डीबगिंग के लिए डी फैक्टो टूल है।
जब आप lldb का उपयोग कर रहे हो तो आप इंटेल फ्लेवर सेट कर सकते हैं अपने होम फ़ोल्डर में निम्नलिखित लाइन के साथ फ़ाइल बनाकर .lldbinit
कहा जाता है:
ल्लडब में, process save-core
के साथ एक प्रक्रिया को डंप करें।
(lldb) कमांड | विवरण |
run (r) | एक्सिक्यूशन शुरू करें, जो एक ब्रेकपॉइंट हिट होने या प्रक्रिया समाप्त होने तक जारी रहेगा। |
continue (c) | डीबग की गई प्रक्रिया का एक्सिक्यूशन जारी रखें। |
nexti (n / ni) | अगले इंस्ट्रक्शन को एक्सीक्यूट करें। यह कमांड फंक्शन कॉल को छोड़ देगा। |
stepi (s / si) | अगले इंस्ट्रक्शन को एक्सीक्यूट करें। nexti कमांड की तरह, यह कमांड फंक्शन कॉल में स्टेप करेगा। |
finish (f) | वर्तमान फंक्शन ("फ्रेम") में शेष इंस्ट्रक्शन को एक्सीक्यूट करें और रोकें। |
control + c | एक्सीक्यूशन को रोकें। अगर प्रक्रिया को चलाया गया है (r) या जारी रखा गया है (c), तो यह प्रक्रिया को वर्तमान में कहीं भी रोक देगा। |
breakpoint (b) | b main #कोई फंक्शन जिसे मेन कहा गया है b <binname>`main #बिन का मुख्य फंक्शन b set -n main --shlib <lib_name> #निर्दिष्ट बिन का मुख्य फंक्शन b -[NSDictionary objectForKey:] b -a 0x0000000100004bd9 br l #ब्रेकपॉइंट सूची br e/dis <num> #ब्रेकपॉइंट को सक्षम/अक्षम करें breakpoint delete <num> |
help | help breakpoint #ब्रेकपॉइंट कमांड की मदद प्राप्त करें help memory write #मेमोरी में लिखने की मदद प्राप्त करें |
reg | |
x/s <reg/memory address> | मेमोरी को एक नल-समाप्त स्ट्रिंग के रूप में प्रदर्शित करें। |
x/i <reg/memory address> | मेमोरी को एसेम्बली इंस्ट्रक्शन के रूप में प्रदर्शित करें। |
x/b <reg/memory address> | मेमोरी को बाइट के रूप में प्रदर्शित करें। |
print object (po) | यह पैरामीटर द्वारा संदर्भित ऑब्जेक्ट प्रिंट करेगा po $raw
ध्यान दें कि अधिकांश Apple के Objective-C API या मेथड्स ऑब्जेक्ट वापस करते हैं, और इसलिए "प्रिंट ऑब्जेक्ट" (po) कमांड के माध्यम से प्रदर्शित किए जाना चाहिए। यदि po से कोई अर्थपूर्ण आउटपुट नहीं निकालता है, तो |
memory | memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #उस पते में AAAA लिखें memory write -f s $rip+0x11f+7 "AAAA" #उस पते में AAAA लिखें |
disassembly | dis #वर्तमान फंक्शन को डिसैसेंबल करें dis -n <funcname> #फंक्शन को डिसैसेंबल करें dis -n <funcname> -b <basename> #फंक्शन को डिसैसेंबल करें dis -c 6 #6 लाइनों को डिसैसेंबल करें dis -c 0x100003764 -e 0x100003768 #एक से दूसरे तक dis -p -c 4 #वर्तमान पते से डिसैसेंबल करना शुरू करें |
parray | parray 3 (char **)$x1 # x1 रेजिस्टर में 3 घटकों के एरे की जाँच करें |
objc_sendMsg
फंक्शन को कॉल करते समय, rsi रजिस्टर में मेथड का नाम एक नल-समाप्त (“सी”) स्ट्रिंग के रूप में होता है। lldb के माध्यम से नाम प्रिंट करने के लिए:
(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) print (char*)$rsi:
(char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
एंटी-डायनामिक विश्लेषण
वीएम पता लगाना
sysctl hw.model
कमांड "Mac" लौटाता है जब होस्ट एक MacOS होता है, लेकिन कुछ अलग होता है जब यह एक वीएम होता है।hw.logicalcpu
औरhw.physicalcpu
के मानों के साथ खेलने से कुछ मैलवेयर यह जांचने की कोशिश करते हैं कि यह एक वीएम है या नहीं।कुछ मैलवेयर यह भी पता लगा सकते हैं कि मशीन VMware पर आधारित है MAC पते (00:50:56) के आधार पर।
यह भी संभव है कि एक प्रक्रिया की डीबगिंग हो रही है या नहीं इसे एक सरल कोड के साथ जैसे:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //प्रक्रिया डीबग हो रही है }
यह भी
ptrace
सिस्टम कॉल कोPT_DENY_ATTACH
फ्लैग के साथ आवंटित कर सकता है। यह एक डेबगर को जोड़ने और ट्रेसिंग करने से रोकता है।आप यह जांच सकते हैं कि क्या
sysctl
याptrace
फ़ंक्शन आयात किया जा रहा है (लेकिन मैलवेयर इसे गतिशील रूप से आयात कर सकता है)जैसा कि इस लेखन में दर्शाया गया है, “एंटी-डीबग तकनीकों को पराजित करना: macOS ptrace variants” : “संदेश प्रक्रिया # के साथ बाहर निकल गई जिसकी स्थिति = 45 (0x0000002d) है आम तौर पर एक संकेत है कि डीबग लक्ष्य PT_DENY_ATTACH का उपयोग कर रहा है”
Fuzzing
ReportCrash क्रैश हो रहे प्रक्रियाओं का विश्लेषण करता है और एक क्रैश रिपोर्ट को डिस्क पर सहेजता है। एक क्रैश रिपोर्ट में जानकारी होती है जो एक डिवेलपर को क्रैश के कारण का निदान करने में मदद कर सकती है।
एप्लिकेशनों और अन्य प्रक्रियाओं के लिए प्रति-उपयोगकर्ता लॉन्चडी संदर्भ में चल रहे, ReportCrash एक लॉन्चएजेंट के रूप में चलता है और क्रैश रिपोर्ट को उपयोगकर्ता के ~/Library/Logs/DiagnosticReports/
में सहेजता है।
डेमन्स, अन्य प्रक्रियाएं सिस्टम लॉन्चडी संदर्भ में चल रही हैं और अन्य प्रिविलेज्ड प्रक्रियाएं के लिए, ReportCrash एक लॉन्चडेमन के रूप में चलता है और क्रैश रिपोर्ट को सिस्टम के /Library/Logs/DiagnosticReports
में सहेजता है।
अगर आप क्रैश रिपोर्ट को एप्पल को भेजने की चिंता कर रहे हैं तो आप इन्हें अक्षम कर सकते हैं। अगर नहीं, तो क्रैश रिपोर्ट सर्वर क्रैश कैसे हुआ पता लगाने में उपयोगी हो सकते हैं।
नींद
MacOS में फज़िंग करते समय, Mac को सोने नहीं देने का महत्वपूर्ण है:
systemsetup -setsleep Never
pmset, सिस्टम प्राथमिकताएँ
SSH डिस्कनेक्ट
यदि आप SSH कनेक्शन के माध्यम से फज़िंग कर रहे हैं, तो सुनिश्चित करें कि सत्र दिन भर नहीं जा रहा है। इसलिए sshd_config फ़ाइल को निम्नलिखित से बदलें:
TCPKeepAlive Yes
ClientAliveInterval 0
ClientAliveCountMax 0
आंतरिक हैंडलर
निम्नलिखित पृष्ठ की जाँच करें ताकि आप पता लगा सकें कि निर्दिष्ट स्कीम या प्रोटोकॉल का हैंडलिंग कौन सा ऐप जिम्मेदार है:
pagemacOS File Extension & URL scheme app handlersनेटवर्क प्रक्रियाओं की गणना
यह दिलचस्प है कि नेटवर्क डेटा का प्रबंधन कर रही प्रक्रियाएं खोजना:
या netstat
या lsof
का उपयोग करें
Libgmalloc
फज़र्स
CLI टूल्स के लिए काम करता है
यह macOS GUI टूल्स के साथ "बस काम करता है"। कृपया ध्यान दें कि कुछ macOS ऐप्स के कुछ विशेष आवश्यकताएं हो सकती हैं जैसे अद्वितीय फ़ाइल नाम, सही एक्सटेंशन, सैंडबॉक्स से फ़ाइलों को पढ़ने की आवश्यकता (~/Library/Containers/com.apple.Safari/Data
)...
कुछ उदाहरण:
अधिक Fuzzing MacOS जानकारी
संदर्भ
Last updated