
تحليل ذاكرة لينكس دون تبعيات، باستخدام BTF و kallsyms المدمجين في النواة لتحليل الذاكرة بإدراك الأنواع دون معلومات تصحيح خارجية.
mquire، وهو لعب على كلمتي memory (ذاكرة) و inquire (استعلام)، هي أداة استعلام عن الذاكرة مستوحاة من osquery.
يمكن لـ mquire تحليل لقطات ذاكرة نواة لينكس دون الحاجة إلى رموز تصحيح خارجية.
كل ما هو مطلوب للتحليل مضمّن بالفعل في تفريغ الذاكرة نفسه. هذا يعني أنه يمكنك تحليل:
متطلبات إصدار النواة:
scripts/kallsyms.c)يحلل mquire ذاكرة النواة عن طريق قراءة نوعين من المعلومات المضمنة في أنوية لينكس الحديثة:
/proc/kallsyms)من خلال دمج معلومات الأنواع مع مواقع الرموز، يمكن لـ mquire العثور على هياكل بيانات النواة المعقدة وقراءتها مثل:
هذا يجعل من الممكن استخراج الملفات مباشرة من ذاكرة التخزين المؤقت للملفات في النواة، حتى لو تم حذفها من القرص.
يعتمد ماسح Kallsyms على تنسيق البيانات من scripts/kallsyms.c في كود مصدر النواة. إذا غيرت إصدارات النواة المستقبلية هذا التنسيق، فقد تحتاج إرشادات الماسح إلى تحديثات.
يوفر mquire جداول SQL للاستعلام عن جوانب مختلفة من النظام أو حالة الأداة نفسها.
mquire ليس قاعدة بيانات. كل استعلام يعيد بناء هياكل بيانات النواة عن طريق مسح الذاكرة واتباع المؤشرات. لا توجد فهارس محسوبة مسبقًا أو نتائج مخزنة مؤقتًا: كل وصول إلى جدول هو اجتياز لبيانات النواة. استخدم
AS MATERIALIZEDلتجنب عمليات المسح المكررة (انظر تحسين الاستعلام)، وقدم قيودًا مثلtaskعند الاستعلام عن جداول خاصة بالعمليات مثلtask_open_filesوmemory_mappingsلتحديد المسح إلى عملية واحدة.
مبدأ التصميم: العناوين الافتراضية كمفاتيح ربط. تستخدم الجداول
virtual_address(عنوان النواة لهيكل البيانات الأساسي) كمفتاح الربط الأساسي: وليسpidأو معرفات أخرى مرئية للمستخدم. هذا مقصود، لأن نفس PID يمكن أن يظهر عدة مرات عبر مصادر اكتشاف مختلفة ومهام جذرية، بينما يحدد عنوان افتراضي كائن نواة معين بشكل فريد. تم بناء كل من جداول SQL وواجهة برمجة التطبيقات الأساسيةLinuxOperatingSystemحول هذه الاتفاقية.
/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).struct ftrace_ops، يتم السير من رمز ftrace_ops_list افتراضيًا. قيد 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عرض شجرة هرمية للعمليات والخيوط الجارية، مشابهة لأمر pstree في لينكس.
الخيارات:
--show-threads - تضمين الخيوط بالإضافة إلى العمليات. عند التمكين، يعرض كلاً من TGID و TID لكل إدخال.--use-real-parent - استخدام حقل real_parent بدلاً من parent لبناء هيكل الشجرة. يظهر حقل real_parent العملية الأم الأصلية قبل أي إعادة توجيه (مفيد لتتبع سلاسل إنشاء العملية حتى بعد خروج العمليات الأم).ملاحظات:
[TGID TID] عند عرض الخيوط، أو [TGID] عند إخفاء الخيوط. TGID (معرف مجموعة الخيوط) هو ما يسمى عادة PID. بالنسبة للخيوط الرئيسية (حيث TGID == TID)، ستكون كلتا القيمتين متطابقتين..carveاستخراج منطقة من الذاكرة الافتراضية إلى القرص. يستخرج هذا الأمر محتوى الذاكرة الخام من نطاق عنوان افتراضي معين باستخدام جدول صفحات معين، مفيد لاستخراج ذاكرة العملية أو محتويات الكومة أو مناطق الذاكرة الأخرى.
الوسائط:
ROOT_PAGE_TABLE - العنوان الفعلي لجدول الصفحات الجذر (سلسلة سداسية عشرية مع بادئة 0x اختيارية). يحدد مساحة العنوان لاستخدامها في الترجمة.VIRTUAL_ADDRESS - العنوان الافتراضي لبدء الاستخراج منه (سلسلة سداسية عشرية مع بادئة 0x اختيارية).SIZE - عدد البايتات للاستخراج.DESTINATION_PATH - مسار ملف الإخراج حيث ستكتب الذاكرة المستخرجة.ملاحظات:
.dumpاستخراج الملفات من ذاكرة التخزين المؤقت للملفات في النواة لاستعادة الملفات مباشرة من الذاكرة. يكرر هذا الأمر جميع المهام وواصفات الملفات المفتوحة الخاصة بها، مستخرجًا محتويات الملف من ذاكرة التخزين المؤقت للصفحات.
الوسائط:
OUTPUT - دليل الإخراج للملفات المستخرجة. يتم تنظيم الملفات حسب TGID (مثل tgid_1234/path/to/file).ملاحظات:
تم تصميم mquire من أجل: