GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ist es möglich, einen bestimmten Pfad für einen Prozess vorzutäuschen?

LD_PRELOAD ist nicht allzu schwierig, und Sie müssen nicht root sein. Schalten Sie Ihre eigene C-Routine ein, die anstelle des echten open() aufgerufen wird in der C-Bibliothek. Ihre Routine prüft, ob die zu öffnende Datei "/tmp/adb.log" ist, und ruft das eigentliche Öffnen mit einem anderen Dateinamen auf. Hier ist Ihre shim_open.c:

/*
 * capture calls to a routine and replace with your code
 * gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
 * LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
 */
#define _FCNTL_H 1 /* hack for open() prototype */
#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#define OLDNAME "/tmp/adb.log"
#define NEWNAME "/tmp/myadb.log"

int open(const char *pathname, int flags, mode_t mode){
    static int (*real_open)(const char *pathname, int flags, mode_t mode) = NULL;

    if (!real_open) {
        real_open = dlsym(RTLD_NEXT, "open");
        char *error = dlerror();
        if (error != NULL) {
            fprintf(stderr, "%s\n", error);
            exit(1);
        }
    }
    if (strcmp(pathname,OLDNAME)==0) pathname = NEWNAME;
    fprintf(stderr, "opening: %s\n", pathname);
    return real_open(pathname, flags, mode);
}

Kompilieren Sie es mit gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c und testen Sie es, indem Sie etwas in /tmp/myadb.log einfügen und LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log ausführen . Dann versuchen Sie das LD_PRELOAD auf adb.


Hier ist ein sehr einfaches Beispiel für die Verwendung von util-linux ist unshare um einen Prozess in einen privaten Mount-Namensraum zu stellen und ihm eine andere Ansicht desselben Dateisystems zu geben, das sein Elternteil derzeit hat:

{   cd /tmp                      #usually a safe place for this stuff
    echo hey   >file             #some
    echo there >file2            #evidence
    sudo unshare -m sh -c '      #unshare requires root by default
         mount -B file2 file     #bind mount there over hey
         cat file                #show it
         kill -TSTP "$$"         #suspend root shell and switch back to parent
         umount file             #unbind there
         cat file'               #show it
    cat file                     #root shell just suspended
    fg                           #bring it back
    cat file2                    #round it off
}
there                            #root shell
hey                              #root shell suspended
hey                              #root shell restored
there                            #rounded

Mit dem unshare können Sie einem Prozess eine private Ansicht seines Dateisystems geben Dienstprogramm auf aktuellen Linux-Systemen, obwohl die Mount-Namespace-Einrichtung selbst für die gesamte 3.x-Kernel-Serie ziemlich ausgereift ist. Mit nsenter können Sie bereits vorhandene Namespaces aller Art eingeben Dienstprogramm aus demselben Paket, und Sie können mehr mit man herausfinden .


Linux
  1. Wie verwendet man Inotifywait, um ein Verzeichnis für die Erstellung von Dateien einer bestimmten Erweiterung zu überwachen?

  2. Linux – Ist es möglich, einen bestimmten Pfad für einen Prozess vorzutäuschen?

  3. Linux – Bestimmung einer bestimmten Datei, die für hohe E/A verantwortlich ist?

  4. Firefox-Protokolldatei finden?

  5. Bestes Protokolldatei-Überwachungstool für Ubuntu Server?

8 grundlegende Linux-Dateinavigationsbefehle für neue Benutzer

Syntax der logrotate-Konfigurationsdatei - mehrere Wildcard-Einträge möglich?

Protokollrotation von stdout?

Ist es möglich, dass ein Daemon-Prozess (d. H. Hintergrund) nach Tastendrücken von einer USB-Tastatur sucht?

Finden Sie heraus, welcher Prozess eine Datei ändert

So finden Sie die .pid-Datei für einen bestimmten Prozess