
भौतिक मेमोरी अधिग्रहण के लिए लिनक्स कर्नेल ड्राइवर, आरक्षित मेमोरी और मेमोरी होल्स सहित किसी भी भौतिक पते तक पढ़ने की पहुंच सक्षम करता है, जिसमें CR3 जानकारी और वर्चुअल-टू-भौतिक अनुवाद सेवाएं शामिल हैं।

इसके Windows समकक्ष, Winpmem की तरह, यह परंपरागत मेमोरी डंपर नहीं है। Linpmem किसी भी भौतिक पते से पढ़ने के लिए एक API प्रदान करता है, जिसमें आरक्षित मेमोरी और मेमोरी होल शामिल हैं, लेकिन इसका उपयोग सामान्य मेमोरी डंपिंग के लिए भी किया जा सकता है। इसके अलावा, ड्राइवर भौतिक मेमोरी पढ़ने के लिए विभिन्न एक्सेस मोड प्रदान करता है, जैसे कि बाइट, वर्ड, ड्वर्ड, क्वर्ड और बफर एक्सेस मोड, जहाँ बफर एक्सेस मोड अधिकांश मानक मामलों में उपयुक्त है। यदि पढ़ने के लिए संरेखित बाइट/वर्ड/ड्वर्ड/क्वर्ड पढ़ने की आवश्यकता है, तो Linpmem ठीक वैसा ही करेगा।
वर्तमान में, Linpmem की विशेषताएं:
विशेष पढ़ने के एक्सेस मोड के समर्थन के लिए कैश नियंत्रण भविष्य में जोड़ा जाएगा।
कम से कम अभी के लिए, आपको Linpmem ड्राइवर स्वयं संकलित करना होगा। अन्य Linux सिस्टम पर पूर्व-संकलित Linpmem ड्राइवर लोड करने की एक विधि वर्तमान में कार्याधीन है, लेकिन अभी समाप्त नहीं हुई है। हालाँकि, Linpmem ड्राइवर को संकलित करना कठिन नहीं है, मूलतः यह 'make' निष्पादित करना है।
आपको make और एक C कंपाइलर की आवश्यकता है। (हम gcc की सलाह देते हैं, लेकिन clang भी काम करना चाहिए।)
सुनिश्चित करें कि आपने linux-headers स्थापित किया है (अपने लक्ष्य linux वितरण के जो भी पैकेज मैनेजर का उपयोग करें)। सटीक पैकेज नाम आपके वितरण पर भिन्न हो सकता है।
यह जाँचने का एक त्वरित (वितरण-स्वतंत्र) तरीका कि क्या आपके पास पैकेज स्थापित है:
ls -l /usr/lib/modules/`uname -r`/
बस इतना ही, आप चरण 2 पर आगे बढ़ सकते हैं।
विदेशी सिस्टम: वर्तमान में, यदि आप किसी दूसरे सिस्टम के लिए ड्राइवर संकलित करना चाहते हैं, उदाहरण के लिए, क्योंकि आप मेमोरी डंप बनाना चाहते हैं लेकिन लक्ष्य पर संकलित नहीं कर सकते, तो आपको उस सिस्टम के Linux वितरण के पैकेज रिपॉजिटरी से सीधे हेडर पैकेज डाउनलोड करना होगा। दोबारा जाँच करें कि पैकेज संस्करण विदेशी सिस्टम पर चल रहे रिलीज़ और कर्नेल संस्करण से बिल्कुल मेल खाता हो। यदि दूसरा सिस्टम स्व-संकलित कर्नेल का उपयोग कर रहा है, तो आपको उस कर्नेल की बिल्ड निर्देशिका की एक प्रति प्राप्त करनी होगी। फिर, दोनों में से किसी निर्देशिका का स्थान KDIR पर्यावरण चर में रखें।
export KDIR=path/to/extracted/header/package/or/kernel/root
ड्राइवर को संकलित करना सरल है, बस टाइप करें:
make
इससे वर्तमान कार्यशील निर्देशिका में linpmem.ko उत्पन्न होना चाहिए।
आप पहले precompiler.h की जाँच करना चाह सकते हैं और चुन सकते हैं कि रिलीज़ के लिए संकलित करना है या डीबग के लिए (जैसे, डीबग प्रिंटिंग के साथ)। अभी बहुत अधिक अन्य प्रीकंपाइलर सेटिंग्स नहीं हैं।
linpmem.ko मॉड्यूल को insmod path-to-linpmem.ko का उपयोग करके लोड किया जा सकता है, और rmmod path-to-linpmem.ko के साथ अनलोड किया जा सकता है। (यह ड्राइवर को केवल इस अपटाइम के लिए लोड करेगा।) यदि आपने डीबग के लिए संकलित किया है, तो dmesg पर भी एक नज़र डालें।
लोड करने के बाद, ड्राइवर से बात करने के लिए, आपको डिवाइस बनाना होगा:
mknod /dev/linpmem c 42 0
यदि आप ड्राइवर से बात नहीं कर सकते हैं, तो यह सत्यापित करने के लिए dmesg लॉग में जाँचें कि '42' वास्तव में पंजीकृत मेजर था:
[12827.900168] linpmem: registered chrdev with major 42
हालाँकि आमतौर पर कर्नेल वास्तव में यह संख्या निर्दिष्ट करने का प्रयास करेगा।
आप डिवाइस पर chown का उपयोग करके इसे अपने उपयोगकर्ता को दे सकते हैं, यदि आप हर समय रूट कंसोल नहीं रखना चाहते हैं। (या बस रूट कंसोल में इसका उपयोग करते रहें।)
एक उदाहरण कोड है जो प्रदर्शित करता है और (विस्तार से) समझाता है कि ड्राइवर के साथ कैसे इंटरैक्ट करें। उपयोगकर्ता-स्थान API संदर्भ इसके अलावा ./userspace_interface/linpmem_shared.h में पाया जा सकता है।
यह कोड महत्वपूर्ण है, यदि आप यह समझना चाहते हैं कि लाइब्रेरी का उपयोग करने के बजाय सीधे ड्राइवर के साथ कैसे इंटरैक्ट करें। इसका उपयोग एक छोटे फंक्शन परीक्षण के रूप में भी किया जा सकता है।
Linpmem के लिए एक (वैकल्पिक) बुनियादी कमांड लाइन इंटरफ़ेस उपकरण है, pmem CLI उपकरण। यह यहाँ पाया जा सकता है: https://github.com/vobst/linpmem-cli। स्रोत कोड के अलावा, एक पूर्व-संकलित CLI उपकरण के साथ-साथ पूर्व-संकलित स्थैतिक लाइब्रेरी और हेडर भी हैं जो यहाँ (हस्ताक्षरित) पाए जा सकते हैं। ध्यान दें: यह एक प्रारंभिक संस्करण है, अपडेट की जाँच करना सुनिश्चित करें, क्योंकि जल्द ही कई अतिरिक्त और संवर्द्धन होंगे।
pmem CLI उपकरण का उपयोग Linpmem के विभिन्न कार्यों का (अपेक्षाकृत) सुरक्षित और सुविधाजनक तरीके से परीक्षण करने के लिए किया जा सकता है। Linpmem को इस उपकरण द्वारा भी लोड किया जा सकता है, insmod/rmmod का उपयोग करने के बजाय, भविष्य में कुछ अतिरिक्त विकल्पों के साथ। इसका यह भी लाभ है कि pmem आपके लिए तत्काल उपयोग के लिए सही डिवाइस स्वतः बनाता है। यह अत्यंत पोर्टेबल है और किसी भी Linux सिस्टम पर चलता है (और, वास्तव में, Linux 2.6 पर भी परीक्षण किया गया है)।
$ ./pmem -h
Command-line client for the linpmem driver
Usage: pmem [OPTIONS] [COMMAND]
Commands:
insmod Load the linpmem driver
help Print this message or the help of the given subcommand(s)
Options:
-a, --address <ADDRESS> Address for physical read operations
-v, --virt-address <VIRT_ADDRESS> Translate address in target process' address space (default: current process)
-s, --size <SIZE> Size of buffer read operations
-m, --mode <MODE> Access mode for read operations [possible values: byte, word, dword, qword, buffer]
-p, --pid <PID> Target process for cr3 info and virtual-to-physical translations
--cr3 Query cr3 value of target process (default: current process)
--verbose Display debug output
-h, --help Print help (see more with '--help')
-V, --version Print version
यदि आप स्वयं cli उपकरण संकलित करना चाहते हैं, तो इसकी निर्देशिका में जाएँ और इसे बनाने के लिए (cli) Readme में दिए गए निर्देशों का पालन करें। अन्यथा, बस पूर्व-निर्मित प्रोग्राम डाउनलोड करें, यह किसी भी Linux पर काम करना चाहिए। कर्नेल ड्राइवर को cli उपकरण से लोड करने के लिए:
# pmem insmod path/to/linpmem.ko
ड्राइवर को लोड करने के लिए pmem उपकरण का उपयोग करने का लाभ यह है कि आपको स्वयं डिवाइस फ़ाइल बनाने की आवश्यकता नहीं है, और यह (अगले रिलीज़ पर) चुनने की पेशकश करेगा कि linpmem डिवाइस का मालिक कौन है।
pmem कमांड लाइन इंटरफ़ेस केवल एक छोटी Rust लाइब्रेरी के चारों ओर एक पतली आवरण है जो ड्राइवर के साथ इंटरफ़ेस करने के लिए एक API को उजागर करती है। अधिक उन्नत उपयोगकर्ता इस लाइब्रेरी का भी उपयोग कर सकते हैं। लाइब्रेरी स्वचालित रूप से (स्थैतिक पोर्टेबल लाइब्रेरी के रूप में) pmem cli उपकरण के साथ संकलित होती है जब https://github.com/vobst/linpmem-cli से संकलित किया जाता है, लेकिन यहाँ (हस्ताक्षरित) भी शामिल (पूर्व-संकलित) है। ध्यान दें: यह एक प्रारंभिक संस्करण है, जल्द ही और अधिक आएगा।
यदि आप उपयोगकर्ता मोड लाइब्रेरी का उपयोग नहीं करना चाहते हैं और अपने आप सीधे ड्राइवर के साथ इंटरफ़ेस करना पसंद करते हैं, तो आप इसका उपयोगकर्ता-स्थान API/इंटरफ़ेस और दस्तावेज़ीकरण ./userspace_interface/linpmem_shared.h में पा सकते हैं। हम demo/test.c में उदाहरण कोड भी प्रदान करते हैं जो समझाता है कि सीधे ड्राइवर का उपयोग कैसे करें।
LinPyMem: linpmem ड्राइवर के लिए एक Python रैपर। PyPI पर उपलब्ध।
अभी तक लागू नहीं किया गया है।
यदि सिस्टम मॉड्यूल लोड करते समय निम्नलिखित त्रुटि संदेश की रिपोर्ट करता है, तो यह सिक्योर बूट के कारण हो सकता है:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
मॉड्यूल को लोड करने के विभिन्न तरीके हैं। स्पष्ट तरीका है कि अपनी UEFI सेटिंग्स में सिक्योर बूट को अक्षम करें।
यदि आपका वितरण इसका समर्थन करता है, तो एक अधिक सुरुचिपूर्ण समाधान उपयोग करने से पहले मॉड्यूल पर हस्ताक्षर करना होगा। यह निम्नलिखित चरणों का उपयोग करके किया जा सकता है (Ubuntu 20.04 पर परीक्षित)।
$ sudo apt install mokutil
$ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Some descriptive name/"
$ sudo mokutil --import mok-signing.crt
$ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 path/to/mok-singing/MOK.key path/to//MOK.cert path/to/linpmem.ko
उसके बाद, आपको मॉड्यूल लोड करने में सक्षम होना चाहिए।
ध्यान दें कि फोरेंसिक-तैयारी के दृष्टिकोण से, आपको आवश्यकता से पहले एक हस्ताक्षरित मॉड्यूल तैयार करना चाहिए, क्योंकि ऊपर वर्णित प्रक्रिया के दौरान सिस्टम दो बार रीबूट होगा, आपके अधिकांश अस्थायी डेटा को मेमोरी में नष्ट कर देगा।
(यदि आप कुछ भी सामना करते हैं तो कृपया संभावित मुद्दों की रिपोर्ट करें।)
Linpmem और Winpmem हमारे पूर्ववर्तियों के (अब सेवानिवृत्त) REKALL प्रोजेक्ट के काम के बिना अस्तित्व में नहीं होंगे: https://github.com/google/rekall।
हमारे ओपन सोर्स योगदानकर्ता: