Frage

Neben dem LD_PRELOAD Trick und Linux-Kernel-Module, die eine bestimmte syscall mit einem von Ihnen zur Verfügung gestellten ersetzen, gibt es eine Möglichkeit, eine syscall (offen zum Beispiel) abzufangen, so dass es zuerst durch Ihre Funktion geht, bevor es das erreicht Ist offen?

War es hilfreich?

Lösung

Wenn Sie wirklich benötigen eine Lösung, könnten Sie in der DR rootkit interessiert sein, die nur erreicht dies, http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2 der Artikel darüber ist hier http://www.theregister.co.uk/2008/09/04/linux_rootkit_released/

Andere Tipps

Warum können Sie nicht / nicht will, den LD_PRELOAD Trick verwenden, ?

Beispielcode hier:

/*
 * 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);
}

Von dem, was ich verstehe, ... es ist so ziemlich der LD_PRELOAD Trick oder ein Kernel-Modul. den Fall aus, um Ihre Funktion Es gibt nicht eine ganze Menge Mittelweg, wenn Sie es unter einem Emulator ausgeführt werden sollen oder muss Code Umschreiben auf dem tatsächlichen binären zu stoppen, um Ihre Funktion.

Angenommen, Sie das Programm nicht ändern können und nicht können (oder wollen nicht), um den Kernel zu ändern, die LD_PRELOAD Ansatz ist die beste, die Anwendung unter der Annahme ist ziemlich Standard und ist nicht wirklich eine, die in böswilliger Absicht, die versuchen Ihre Vergangenheit Interception zu erhalten. (In diesem Fall werden Sie eine der anderen Techniken benötigen.)

Valgrind kann verwendet werden, um jeden Funktionsaufruf abzufangen. Wenn Sie einen Systemaufruf in Ihrem fertigen Produkt abfangen müssen, dann wird dies kein Gebrauch sein. Wenn Sie jedoch sind versuchen während der Entwicklung abzufangen, dann kann es sehr nützlich sein. Ich habe diese Technik häufig verwendete Hash-Funktionen abfangen, so dass ich das zurückgegebene Hash zu Testzwecken steuern.

Falls Sie nicht wissen, Valgrind ist vor allem für die Suche nach Speicherlecks und andere Speicher Fehlern verwendet. Aber die zugrunde liegende Technologie ist im Grunde ein x86-Emulator. Es emuliert Ihr Programm und fängt ruft malloc / free usw. Die gute Sache ist, Sie müssen nicht neu kompiliert werden, es zu benutzen.

Valgrind hat ein Merkmal, dass sie Ausdruck Funktion Wrapping , die das Abhören von Funktionen zur Steuerung verwendet wird. Abschnitt 3.2 der Valgrind Handbuch . Sie können Setup-Funktion Verpackung für jede Funktion, die Sie mögen. Sobald der Anruf die alternative Funktion abgefangen wird, die Sie bereitstellen wird dann aufgerufen.

Einige Anwendungen können strace / ptrace nicht zu laufen, so dass die einzige wirkliche Option habe ich habe, ist systemtap mit

Trick

Systemtap kann eine Reihe von System abfangen ruft, wenn aufgrund seiner Wild Card Anpassung nötig. Systemtap ist nicht C, sondern eine eigene Sprache. Im Basis-Modus sollte der systemtap verhindert, dass Sie dumme Dinge zu tun, aber es kann in „Expertenmodus“, die damit ein Entwickler C fallen zurück zu verwenden, wenn das erforderlich ist.

auch laufen

Es ist erforderlich, dass Sie Ihren Kernel patchen (oder zumindest nicht), und sobald ein Modul kompiliert wurde, können Sie es von einem Test- / Entwicklungsfeld kopieren und einfügen (via insmod) auf einem Produktionssystem .

Ich habe noch eine Linux-Anwendung zu finden, das eine Art und Weise zu umgehen / vermeiden, erwischt von systemtap gefunden hat.

Wenn Sie wollen einfach nur sehen was geöffnet ist, erhalten Sie bei ptrace () Funktion aussehen wollen, oder den Quellcode des Command strace-Dienstprogramm. Wenn Sie wirklich wollen abfangen der Anruf, um vielleicht etwas anderes machen tun, denke ich, die Optionen, die Sie aufgelistet - LD_PRELOAD oder ein Kernel-Modul - sind Ihre einzigen Optionen

.

Ich habe die Syntax nicht diese ordnungsgemäß mit einem LKM freihändig zu tun, aber dieser Artikel gibt einen guten Überblick darüber, was Sie tun müssen, würden: http://www.linuxjournal.com/article/4378

Sie können auch Patch nur die sys_open Funktion. Es beginnt in Zeile 1084 der Datei / open.c als von Linux-2.6.26.

Sie können auch sehen, wenn Sie nicht inotify verwenden können, systemtap oder SELinux alle für Sie diese Protokollierung zu tun, ohne dass Sie ein neues System aufbauen müssen.

Wenn Sie gerade tun wollen es für Debugging-Zwecke suchen in strace, die in der Spitze des ptrace (2) Systemaufruf aufgebaut, die Sie Code anschließen kann, wenn ein Systemaufruf erfolgt. Siehe den PTRACE_SYSCALL Teil der man-Seite.

Klingt wie Sie auditd benötigen.

auditd ermöglicht weltweite Verfolgung aller syscalls oder Zugriffe auf Dateien, mit Protokollierung. Sie können Tasten für bestimmte Ereignisse festlegen, die Sie interessieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top