سؤال

إلى جانب LD_PRELOAD خدعة و نواة لينكس وحدات محل معين syscall مع واحد التي تقدمها لك , هل هناك أي إمكانية اعتراض syscall مفتوحة ( على سبيل المثال) ، بحيث يذهب أولا من خلال وظيفة الخاص بك قبل أن تصل إلى الفعلية مفتوحة ؟

هل كانت مفيدة؟

المحلول

إذا كنت حقا بحاجة إلى حل كنت قد تكون مهتمة في الدكتور rootkit أن يحقق هذا فقط ، http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2 مقالة حول هذا الموضوع هنا http://www.theregister.co.uk/2008/09/04/linux_rootkit_released/

نصائح أخرى

لماذا لا / لا ترغب في استخدام LD_PRELOAD خدعة?

رمز المثال هنا:

/*
 * File: soft_atimes.c
 * Author: D.J. Capelis
 *
 * Compile:
 * gcc -fPIC -c -o soft_atimes.o soft_atimes.c
 * gcc -shared -o soft_atimes.so soft_atimes.o -ldl
 *
 * Use:
 * LD_PRELOAD="./soft_atimes.so" command
 *
 * Copyright 2007 Regents of the University of California
 */

#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>

extern int errorno;

int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);

int open(const char * pathname, int flags, mode_t mode)
{
    _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
    if(flags & O_CREAT)
        return _open(pathname, flags | O_NOATIME, mode);
    else
        return _open(pathname, flags | O_NOATIME, 0);
}

int open64(const char * pathname, int flags, mode_t mode)
{
    _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
    if(flags & O_CREAT)
        return _open64(pathname, flags | O_NOATIME, mode);
    else
        return _open64(pathname, flags | O_NOATIME, 0);
}

من ما أفهم...هذا هو الى حد كبير LD_PRELOAD خدعة أو وحدة النواة.ليس هناك الكثير من الوسط إلا إذا كنت ترغب في تشغيله تحت مقلدا والتي يمكن فخ إلى وظيفة الخاص بك أو رمز إعادة الكتابة على الثنائية الفعلية إلى فخ إلى وظيفة الخاص بك.

على افتراض انك لا يمكن تعديل البرنامج و لا يمكن (أو لا تريد) تعديل النواة ، LD_PRELOAD النهج هو أفضل واحد ، على افتراض أن التطبيق الخاص بك هو المعيار إلى حد ما و ليس في الواقع واحدة ضار تحاول الحصول على الماضي اعتراض.(في هذه الحالة سوف تحتاج إلى واحدة من التقنيات الأخرى.)

Valgrind يمكن استخدامها لاعتراض أي استدعاء دالة.إذا كنت بحاجة إلى اعتراض مكالمة النظام في المنتج النهائي الخاص بك ثم هذا سوف يكون من أي استخدام.ومع ذلك ، إذا كنت في محاولة لاعتراض خلال التنمية ثم أنها يمكن أن تكون مفيدة جدا.وكثيرا ما تستخدم هذه التقنية لاعتراض وظائف التجزئة بحيث يمكنني التحكم عاد التجزئة لأغراض الاختبار.

في حال كنت لا تعلم ، Valgrind وهي تستخدم أساسا من أجل العثور على تسرب الذاكرة و الذاكرة الأخرى ذات الصلة الأخطاء.ولكن التكنولوجيا الأساسية هي في الأساس إلى x86 المحاكي.فإنه يحاكي البرنامج و اعتراض المكالمات malloc/الحرة الخ.الشيء الجيد هو أنك لا تحتاج إلى ترجمة إلى استخدامه.

Valgrind لديها ميزة أنها مصطلح وظيفة التغليف, التي تستخدم في التحكم اعتراض من الوظائف.انظر القسم 3.2 من Valgrind دليل للحصول على التفاصيل.يمكنك وظيفة الإعداد التفاف على أي وظيفة تريدها.بمجرد الاتصال يتم اعتراضها البديل وظيفة التي تقدمها ثم الاحتجاج.

بعض التطبيقات يمكن خداع strace/ptrace عدم الترشح ، وبالتالي فإن الخيار الحقيقي الوحيد لدي هو استخدام systemtap

Systemtap يمكن اعتراض مجموعة من المكالمات النظام إذا لزم يكون راجعا إلى البرية بطاقة مطابقة.Systemtap ليس ج ، ولكن لغة منفصلة.في الوضع الأساسي ، systemtap ينبغي أن تمنعك من القيام بأشياء غبية ، ولكن أيضا يمكن أن تعمل في "وضع الخبراء" أن يعود إلى السماح مطور للاستخدام ج إذا كان هذا هو المطلوب.

أنها لا تتطلب منك أن التصحيح النواة (أو على الأقل لا ينبغي) و مرة وحدة تم جمعها ، يمكنك نسخه من اختبار/صندوق التنمية وأدخله (عبر insmod) على نظام الإنتاج.

لم تجد تطبيق لينكس التي وجدت طريقة للتغلب/تجنب الوقوع من قبل systemtap.

إذا كنت ترغب فقط في مشاهدة ما فتحت كنت تريد أن تبدو في ptrace() وظيفة ، أو التعليمات البرمجية المصدر فلكس strace فائدة.إذا كنت فعلا تريد أن اعتراض الدعوة إلى ربما تجعل تفعل شيئا آخر ، أعتقد أن الخيارات المدرجة - LD_PRELOAD أو نواة الوحدة - هي الخيارات الخاصة بك فقط.

ليس لدي جملة للقيام بذلك بأمان مع LKM مرتجلا ، ولكن توفر هذه المقالة لمحة جيدة عن ما سوف تحتاج إلى القيام به: http://www.linuxjournal.com/article/4378

يمكنك أيضا مجرد تصحيح sys_open وظيفة.ويبدأ على خط 1084 من ملف/فتح.ج كما لينكس-2.6.26.

قد ترى أيضا إذا لم تتمكن من استخدام inotify, systemtap أو سيلينو أن تفعل كل هذا التسجيل دون الحاجة إلى بناء نظام جديد.

إذا كنت فقط تريد أن تفعل ذلك لأغراض التصحيح ننظر إلى strace ، والتي بنيت في أعلى ptrace(2) نظام الاتصال الذي يسمح لك لربط ما يصل رمز عند استدعاء النظام القيام به.ترى PTRACE_SYSCALL جزء من صفحة.

يبدو أنك تحتاج auditd.

Auditd يسمح العالمية تتبع كل syscalls أو الوصول إلى الملفات ، مع تسجيل.يمكنك تعيين مفاتيح الأحداث المحددة التي كنت مهتما في.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top