Làm thế nào một quá trình có thể có tên khác nhau trong đầu ra ps?


8

Gần đây tôi đã phải dọn sạch một máy chủ bị hack. Quá trình độc hại sẽ xuất hiện dưới dạng "ai" hoặc "ifconfig eth0" hoặc đại loại như thế trong đầu ra "ps aux", thậm chí khó thực thi chỉ là một mớ chữ cái, được hiển thị trong / Proc / [pid] / status.

Tôi tò mò về cách quá trình quản lý để che giấu chính nó như thế.


Loại thực thi là gì?
cuonglm

Đó là nhị phân, không phải là kịch bản shell nếu đó là những gì bạn yêu cầu.
Pentium100

Câu trả lời:


4

Thao tác tên trong danh sách quy trình là một thực tế phổ biến. Ví dụ: tôi có trong quá trình liệt kê các mục sau:

root      9847  0.0  0.0  42216  1560 ?        Ss   Aug13   8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root     20186  0.0  0.0  78880  2672 ?        S    Aug13   2:44  \_ dovecot-auth
dovecot  13371  0.0  0.0  39440  2208 ?        S    Oct09   0:00  \_ pop3-login
dovecot   9698  0.0  0.0  39452  2640 ?        S    Nov07   0:00  \_ imap-login
ericb     9026  0.0  0.0  48196  7496 ?        S    Nov11   0:00  \_ imap [ericb 192.168.170.186]

Dovecot sử dụng cơ chế này để dễ dàng hiển thị những gì mỗi quá trình đang làm.

Về cơ bản, nó đơn giản như thao tác với argv[0]tham số trong C. argvlà một mảng các con trỏ tới các tham số mà quá trình đã được bắt đầu. Vì vậy, một lệnh ls -l /some/directorysẽ có:

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null

Bằng cách phân bổ một số bộ nhớ, đặt một số văn bản vào bộ nhớ đó và sau đó đặt địa chỉ của bộ nhớ đó vào argv[0]tên quy trình được hiển thị sẽ được sửa đổi thành văn bản mới.


2
Nó không hoạt động như thế. Chỉ argv[0]vào một vị trí khác không thay đổi quá trình xuất hiện ps. Nhân không quan tâm đến các con trỏ trong argv. Thay vào đó, kernel ghi nhớ phạm vi bộ nhớ của các đối số thực tế và làm cho nó hiển thị với pscác công cụ khác. Những công cụ đó sau đó sẽ phải xác định ranh giới giữa các đối số bằng cách tìm kiếm chấm dứt NUL giữa mỗi đối số.
kasperd

4

Thay đổi argv [] không khả dụng. Trên Linux, bạn không thể thay đổi argv [0] để trỏ đến chuỗi dài hơn. Bạn sẽ phải ghi đè lên các đối số hiện có và chú ý không ghi đè lên các biến môi trường theo sau trong không gian địa chỉ.

libbsd cung cấp một triển khai setproctitle (3) cho Linux, giúp việc này dễ dàng hơn nhiều.


3

Trong ngôn ngữ như C, một quá trình có thể thay đổi tên của nó bằng cách thay đổi argv[0].

Thí dụ:

#include <stdio.h>

int main(int argc, char *argv[]) {
    argv[0][2] = 'A';
    sleep(10);
    return 0;
}

Sau đó biên dịch nó:

$ gcc test.c
$ ls
a.out
$ ./a.out

Trong thiết bị đầu cuối khác:

$ ps -ef | grep '[a].out'
$ ps -ef | grep '[A].out'
cuonglm  17979 17569  0 14:51 pts/0    00:00:00 ./A.out

Ngôn ngữ cấp cao hơn cũng cho phép bạn thực hiện điều này, ví dụ trong Perl, bạn có thể sửa đổi biến $ 0 để thay đổi tên quy trình.


1

Có hai cách tiêu chuẩn Linux để làm điều này, một trong số đó đến từ glibc và có thể được chuyển sang các hệ thống không phải Linux khác:

Có thể thay đổi argv[0]được sử dụng để hoạt động, nhưng ít nhất trên hệ thống Linux hiện tại của tôi, nó không làm gì với đầu ra ps.

Xem câu trả lời này để biết thêm chi tiết và ví dụ về mã: https://stackoverflow.com/a/55584492/737303

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.