
शून्य-निर्भरता लिनक्स मेमोरी फोरेंसिक्स, बाहरी डीबग जानकारी के बिना प्रकार-जागरूक मेमोरी विश्लेषण के लिए कर्नेल-एम्बेडेड BTF और kallsyms का लाभ उठाता है।
mquire, memory और inquire शब्दों का एक संयोजन, एक मेमोरी क्वेरी करने वाला उपकरण है जो osquery से प्रेरित है।
mquire बिना बाहरी डीबग प्रतीकों की आवश्यकता के Linux कर्नेल मेमोरी स्नैपशॉट का विश्लेषण कर सकता है।
विश्लेषण के लिए आवश्यक सब कुछ पहले से ही मेमोरी डंप में एम्बेडेड है। इसका मतलब है कि आप विश्लेषण कर सकते हैं:
कर्नेल संस्करण आवश्यकताएँ:
scripts/kallsyms.c प्रारूप में बदलावों के कारण)mquire दो प्रकार की जानकारी पढ़कर कर्नेल मेमोरी का विश्लेषण करता है जो आधुनिक Linux कर्नेल में एम्बेडेड हैं:
/proc/kallsyms द्वारा उपयोग किया गया वही डेटा)प्रकार की जानकारी को प्रतीक स्थानों के साथ जोड़कर, mquire जटिल कर्नेल डेटा संरचनाओं को ढूंढ और पढ़ सकता है जैसे:
यह कर्नेल के फ़ाइल कैश से सीधे फ़ाइलें निकालना संभव बनाता है, भले ही वे डिस्क से हटा दी गई हों।
Kallsyms स्कैनर कर्नेल स्रोत में scripts/kallsyms.c के डेटा प्रारूप पर निर्भर करता है। यदि भविष्य के कर्नेल संस्करण इस प्रारूप को बदलते हैं, तो स्कैनर ह्युरिस्टिक्स को अपडेट की आवश्यकता हो सकती है।
mquire सिस्टम के विभिन्न पहलुओं या उपकरण की स्थिति को क्वेरी करने के लिए SQL तालिकाएँ प्रदान करता है।
mquire एक डेटाबेस नहीं है। प्रत्येक क्वेरी मेमोरी को स्कैन करके और पॉइंटर्स का अनुसरण करके कर्नेल डेटा संरचनाओं का पुनर्निर्माण करती है। कोई पूर्व-गणना की गई इंडेक्स या कैश किए गए परिणाम नहीं हैं: प्रत्येक तालिका पहुंच कर्नेल डेटा का ट्रैवर्सल है। बार-बार स्कैन से बचने के लिए
AS MATERIALIZEDका उपयोग करें (देखें क्वेरी ऑप्टिमाइज़ेशन), और प्रति-प्रक्रिया तालिकाओं जैसेtask_open_filesऔरmemory_mappingsको क्वेरी करते समय एकल प्रक्रिया तक स्कैन को सीमित करने के लिएtaskजैसी बाधाएँ प्रदान करें।
डिज़ाइन सिद्धांत: जॉइन कुंजी के रूप में वर्चुअल पते। तालिकाएँ विहित जॉइन कुंजी के रूप में
virtual_address(अंतर्निहित डेटा संरचना का कर्नेल पता) का उपयोग करती हैं, न किpidया अन्य उपयोगकर्ता-दृश्य पहचानकर्ताओं का। यह जानबूझकर किया गया है, क्योंकि एक ही PID विभिन्न डिस्कवरी स्रोतों और रूट कार्यों में कई बार प्रकट हो सकता है, जबकि एक वर्चुअल पता विशिष्ट रूप से एक विशिष्ट कर्नेल ऑब्जेक्ट की पहचान करता है। SQL तालिकाएँ और अंतर्निहितLinuxOperatingSystemAPI दोनों इस परंपरा के आसपास बनाए गए हैं।
/proc/kallsyms के समान डेटा)dmesg कमांड के समान डेटा)task बाधा प्रदान करें, या एक साथ सभी कार्यों को क्वेरी करें)task बाधा प्रदान करें, या एक साथ सभी कार्यों को क्वेरी करें)task बाधा की आवश्यकता है, इसलिए इसे tasks/processes के साथ जोड़ें (जैसे, JOIN task_capabilities c ON c.task = p.virtual_address)।task बाधा की आवश्यकता है।mem प्रविष्टियाँ। एक kernel_module बाधा की आवश्यकता है, इसलिए इसे kernel_modules के साथ जोड़ें (जैसे, JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address)।ftrace_ops_list प्रतीक से चलाए गए struct ftrace_ops नोड्स की सूची। एक एकल नोड पढ़ने के लिए virtual_address को बाधित करें, या एक मनमाना नोड से चलने के लिए start_vaddr (वैकल्पिक रूप से end_vaddr द्वारा सीमित) को बाधित करें।mquire तीन मुख्य कमांड प्रदान करता है:
mquire shell - मेमोरी स्नैपशॉट क्वेरी करने के लिए एक इंटरैक्टिव SQL शेल प्रारंभ करेंmquire query - एक एकल SQL क्वेरी निष्पादित करें और परिणाम आउटपुट करें (JSON या तालिका प्रारूप का समर्थन करता है)mquire command - मेमोरी स्नैपशॉट पर कस्टम कमांड निष्पादित करें (जैसे, .task_tree, .system_version, .dump)mquire SQL क्वेरी से अलग करने के लिए डॉट (.) से उपसर्गित विशेष कमांड प्रदान करता है।
ये कमांड इंटरैक्टिव शेल और mquire query के साथ काम करते हैं:
.tables - सभी उपलब्ध तालिकाओं की सूची बनाएं.schema - सभी तालिकाओं के लिए स्कीमा दिखाएं.schema <table> - किसी विशिष्ट तालिका के लिए स्कीमा दिखाएं.commands - सभी उपलब्ध कस्टम कमांड की सूची बनाएं.exit - इंटरैक्टिव शेल से बाहर निकलें (केवल शेल)ये कमांड इंटरैक्टिव शेल और mquire command के साथ काम करते हैं:
उपलब्ध विकल्पों और उपयोग जानकारी को देखने के लिए किसी भी कमांड के साथ --help का उपयोग करें। उदाहरण: .task_tree --help
.system_versionऑपरेटिंग सिस्टम संस्करण जानकारी प्रदर्शित करें।
यह SELECT * FROM os_version के बराबर एक सुविधा कमांड है, लेकिन स्वरूपित आउटपुट के साथ।
.task_treeचल रही प्रक्रियाओं और थ्रेड्स का एक पदानुक्रमित ट्री प्रदर्शित करें, जो Linux पर pstree कमांड के समान है।
विकल्प:
--show-threads - प्रक्रियाओं के अतिरिक्त थ्रेड्स को शामिल करें। सक्षम होने पर, प्रत्येक प्रविष्टि के लिए TGID और TID दोनों प्रदर्शित करता है।--use-real-parent - ट्री संरचना बनाने के लिए parent के बजाय real_parent फ़ील्ड का उपयोग करें। real_parent फ़ील्ड किसी भी रिपेरेंटिंग से पहले मूल पैरेंट प्रक्रिया दिखाता है (पैरेंट प्रक्रिया समाप्त होने के बाद भी प्रक्रिया निर्माण श्रृंखला को ट्रैक करने के लिए उपयोगी)।नोट:
[TGID TID] है, या थ्रेड छिपाए जाने पर [TGID] है। TGID (थ्रेड ग्रुप आइडेंटिफ़ायर) को आमतौर पर PID कहा जाता है। मुख्य थ्रेड के लिए (जहां TGID == TID), दोनों मान समान होंगे।.carveवर्चुअल मेमोरी के एक क्षेत्र को डिस्क पर निकालें। यह कमांड दिए गए पेज टेबल का उपयोग करके एक विशिष्ट वर्चुअल एड्रेस रेंज से रॉ मेमोरी सामग्री निकालता है, जो प्रक्रिया मेमोरी, हीप सामग्री या अन्य मेमोरी क्षेत्रों को निकालने के लिए उपयोगी है।