Vor kurzem musste ich einen gehackten Server bereinigen. Der böswillige Prozess würde in der Ausgabe von "ps aux" als "who" oder "ifconfig eth0" oder so ähnlich erscheinen, selbst wenn die ausführbare Datei nur ein Durcheinander von Buchstaben war, das in / proc / [pid] / status angezeigt wurde.
Ich bin gespannt, wie der Prozess es geschafft hat, sich so zu maskieren.
Antworten:
Das Manipulieren des Namens in der Prozessliste ist eine gängige Praxis. ZB habe ich in meinem Prozess Folgendes aufgelistet:
Dovecot verwendet diesen Mechanismus, um einfach zu zeigen, was jeder Prozess tut.
Es ist im Grunde so einfach wie das Bearbeiten des
argv[0]
Parameters in C. Esargv
handelt sich um ein Array von Zeigern auf die Parameter, mit denen der Prozess gestartet wurde. Ein Befehlls -l /some/directory
hat also:Durch Zuweisen von Speicher, Einfügen von Text in diesen Speicher und anschließendes Einfügen der Adresse dieses Speichers in
argv[0]
den angezeigten Prozessnamen wurde der neue Text geändert.quelle
argv[0]
auf einen anderen Ort ändert nichts an der Darstellung des Prozessesps
. Der Kernel kümmert sich nicht um die Zeiger inargv
. Vielmehr merkt sich der Kernel, in welchem Speicherbereich sich die eigentlichen Argumente befinden, und macht dies fürps
andere Tools sichtbar . Diese Tools müssen dann die Grenzen zwischen den Argumenten identifizieren, indem sie nach der NUL-Terminierung zwischen den einzelnen Argumenten suchen.Das Ändern von argv [] ist nicht portierbar. Unter Linux können Sie argv [0] nicht einfach so ändern, dass es auf eine längere Zeichenfolge verweist. Sie müssten die vorhandenen Argumente überschreiben und darauf achten, die im Adressraum folgenden Umgebungsvariablen nicht zu überschreiben.
libbsd bietet eine Implementierung von setproctitle (3) für Linux, die dies erheblich vereinfacht.
quelle
In einer Sprache wie
C
kann ein Prozess seinen Namen durch Ändern ändernargv[0]
.Beispiel:
Dann kompiliere es:
In einem anderen Terminal:
In einer höheren Sprache können Sie dies auch tun. Beispiel
Perl
: Sie können die Variable $ 0 ändern, um den Prozessnamen zu ändern.quelle
Es gibt zwei Linux-Standardmethoden, von denen eine von glibc stammt und möglicherweise auf andere Nicht-Linux-Systeme portierbar ist:
pthread_setname_np()
ist wahrscheinlich die bessere Methodeprctl()
funktioniert auchEs ist möglich, dass das Ändern
argv[0]
früher funktioniert hat, aber zumindest auf meinem aktuellen Linux-System hat es nichts mit der Ausgabe in zu tunps
.In dieser Antwort finden Sie weitere Details und ein Codebeispiel: https://stackoverflow.com/a/55584492/737303
quelle