16.系统和进程信息

/proc文件系统

许多现代UNIX实现提供了一个/proc虚拟文件系统。该文件系统主流于/proc目录中,包含了各种用于展示内核信息的文件,并且允许通过常规文件I/O来方便地读取,有时还可以修改这些信息。

之所以称为虚拟,是因为其包含的文件和子目录并未存储于磁盘上,而是由内核在进程访问此类信息时,动态创建而成。
以下是Linux专有的细节。

获取与进程有关的信息:/proc/PID

对于系统中每个进程,内核都提供了命名为/proc/PID(其中PID是进程的ID)的目录。此目录中的各种文件和子目录包含了进程的相关信息。
例如:
/proc/1目录下的文件可以获取init进程的信息,该进程的ID总是1。

$cat /proc/1/status
Name:	systemd
Umask:	0000
State:	S (sleeping)
Tgid:	1
Ngid:	0
Pid:	1
PPid:	0
...

每个/proc/PID目录下的文件节选
| 文件 | 描述(进程属性) |
|–|–|–|
| cmdline | 以\0分隔的命令行参数 |
| cwd | 指向当前工作目录的符号链接 |
| Environ | NAME=value 键值对环境列表,以\0分隔 |
| exe | 指向正在执行文件的符号链接 |
| fd | 文件目录,包含了指向由进程打开文件的符号链接 |
| maps | 内存映射 |
| mem | 进程虚拟内存(在I/O操作之前必须调用lseek()移至有效偏移量) |
| mounts | 进程的安装点 |
| root | 指向根目录的符号链接 |
| status | 各种信息(比如,进程ID、凭证、内存使用量、信号) |
| task | 为进程中的每个线程均包含一个子目录(始于Linux2.6) |

/proc/PID/fd 目录

/proc/PID/fd目录为进程打开的每个文件描述符都包含了一个符号链接,每个符号链接的名称都与描述符的数值相匹配。例如,/proc/1968/1ID为1968的进程中指向标准输出的符号链接。
为方便起见,任何进程都可使用符号链接/proc/self来访问其自己的/proc/PID目录。

线程:/proc/PID/task 目录

Linux2.4增加了线程组的概念,正式支持POSIX线程模型。
因为线程组中的一些属性对于线程而言是唯一的,所以Linux2.4/proc/PID目录下增加了
一个task子目录。
针对进程的每个线程,内核提供了以/proc/PID/task/TID命名的子目录,其中TID是该线程的线程ID(此值等同于在线程中调用gettid()函数的返回值)。

每个/proc/PID/task/TID都有一套类似于/proc/PID目录内容的文件和目录。因为线程共享了多个属性,所以这些文件中许多信息对各个线程而言是相同的。

/proc 目录下的系统信息

在这里插入图片描述

目录目录中文件表达的信息
/proc各种系统信息
/proc/net有关网络和套接字的状态信息
/proc/sys/fs文件系统相关设置
/proc/sys/kernel各种常规的内核设置
/proc/sys/net网路和套接字的设置
/proc/sys/vm内存管理设置
/proc/sysvipc有关System V IPC 对象的信息

访问/proc 文件

通常使用shell脚本来访问/proc目录下的文件。
例如:

# echo 100000 > /proc/sys/kernel/pid_max
# cat /proc/sys/kernel/pid_max
1000000

也可以从程序中使用常规I/O系统调用来访问/proc目录下的文件。安在访问时有一些限制:

  • /proc 目录下的一些文件是只读的,即这些文件仅用于显示内核信息,但无法对其进行修改。/proc/PID 目录下的大多数文件就属于此类型。
  • /proc 目录下的一些文件仅能尤其文件拥有者(或特权级进程)读取。例如,/proc/PID 目录下的所有文件都属于拥有相应进程的用户,而且即使是对文件的属主,其中的部分文件(如:/proc/PID/environ 文件)也仅仅授予了读权限。
  • 除了/proc/PID 子目录中的文件,/proc 目录中的其他文件大多属于root用户,并且也仅有root用户能够修改那些可修改的文件。

访问 /proc/PID 目录中的文件

/proc/PID 目录内容变化不定,随着相应进程ID的进程创建而生,又随进程的终止而灭。访问时,要处理好进程已经的情况。

示例程序

/*proc.c*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>

#define MAX_LINE 100

int main(int argc, char **argv)
{
    int fd;
    char line[MAX_LINE];
    ssize_t n;
    fd = open("/proc/sys/kernel/pid_max", (argc > 1) ? O_RDWR : O_RDONLY);
    if( fd == -1)
    {
        printf("open");
        exit(EXIT_FAILURE);
    }
    n = read(fd, line, MAX_LINE);
    if( n == -1)
    {
        printf("read");
        exit(EXIT_FAILURE);
    }
    if(argc > 1)
        printf("Old value:");
    printf("%.*s", (int)n, line);
    if(argc > 1)
    {
        if(write(fd, argv[1], strlen(argv[1]) != strlen(argv[1])))
        {
            printf("write() failed");
            exit(EXIT_FAILURE);
        }
        system("echo /proc/sys/kernel/pid_max now contains"
                "cat /proc/sys/kernel/pid_max");
    }
    exit(EXIT_SUCCESS);
}

系统标识: uname()

uname()系统调用返回了一系列关于主机系统的标识信息,存储于utsbuf所指向的结构中。

#include <sys/utsname.h>
int uname(struct utsname *utsbuf);
	Returns 0 on success, or -1 on error

utsbuf参数是一个指向utsname结构的指针,其定义如下:

#define _UTSNAME_LENGTH 65
struct utsname{
	char sysname[_UTSNAME_LENGTH]; /*Implementation name*/
	char nodename[_UTSNAME_LENGTH]; /*Node name on network*/
	char release[_UTSNAME_LENGTH]; /*Implementation release level*/
	char version[_UTSNAME_LENGTH]; /*Release version level*/
	char machine[_UTSNAME_LENGTH]; /*Haedware on which system 
									is running*/
	
#ifdef _GNU_SOURCE		/*Following is Linux-specific*/
	char domainname[_UTSNAME_LENGTH];/*NIS domain name of host*/
#endif
};

其中:

  • sysnamereleaseversionmachine由内核自动设置。
  • nodenamesethostname()系统调用设置。通常该值类似于系统DNS域名中的前缀主机名。
  • domainnamesetdomainname()系统调用设置。该值是主机的网络信息服务
    (NIS)域名(与主机域名不同)。

示例程序:

/*uname.c*/
#define _GNU_SOURCE
#include <sys/utsname.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    struct utsname uts;
	if(uname(&uts) == -1)
	{
		printf("uname");
		exit(EXIT_FAILURE);
	}
    printf("Node name:  %s\n", uts.nodename);
    printf("System name:    %s\n", uts.sysname);
    printf("Release:    %s\n", uts.release);
    printf("Version:    %s\n", uts.version);
    printf("Machine:    %s\n", uts.machine);
#ifdef _GNU_SOURCE
    printf("Domain name:    %s\n", uts.domainname);
#endif
    exit(EXIT_SUCCESS);
}
$gcc uname.c -o uname
$./uname
Node name:  sixqaq
System name:    Linux
Release:    5.13.0-27-generic
Version:    #29~20.04.1-Ubuntu SMP Fri Jan 14 00:32:30 UTC 2022
Machine:    x86_64
Domain name:    (none)

进阶

关于 /proc 文件系统的深入信息可见诸于proc(5)手册页、内核源文件 Documentation/filesystems/proc.txt以及Documentation/sysctl目录下的各种文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PCHunter 是一款功能强大的系统安全信息查看工具,在 PCHunter 中您不但可以深入的查看系统各类信息,还可以很方便的揪出电脑的木马病毒,同时还可以在线修复各种系统问题。由于本工具大量使用 Windows 内核技术,尤其是为了做一些检测而使用了些 Windows 未公开的内核数据结构,虽然我们一直尽力避免或减小这给本软件可能带来的稳定性上的影响,但我们无法保证这对本软件稳定性绝对没有影响。 Windows 系统信息查看工具 PCHunter 中文版Windows 系统信息查看工具 PCHunter 中文版 PCHunter 软件的功能 1、进程、线程、进程模块、进程窗口、进程内存信息查看,杀进程、杀线程、卸载模块等功能 2、内核驱动模块查看,支持内核驱动模块的内存拷贝 3、SSDT、Shadow SSDT、FSD、KBD、TCPIP、Nsiproxy、Tdx、Classpnp、Atapi、Acpi、SCSI、IDT、GDT信息查看,并能检测和恢复ssdt hook和inline hook 4、CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等近20多种Notify Routine信息查看,并支持对这些Notify Routine的删除 5、端口信息查看,目前不支持2000系统 6、查看消息钩子 7、内核模块的iat、eat、inline hook、patches检测和恢复 8、磁盘、卷、键盘、网络层等过滤驱动检测,并支持删除 9、注册表编辑 10、进程iat、eat、inline hook、patches检测和恢复 11、文件系统查看,支持基本的文件操作 12、查看(编辑)IE插件、SPI、启动项、服务、Hosts文件、映像劫持、文件关联、系统防火墙规则、IME 13、ObjectType Hook检测和恢复 14、DPC定时器检测和删除 15、MBR Rootkit检测和修复 16、内核对象劫持检测 17、WorkerThread枚举 18、Ndis中一些回调信息枚举 19、硬件调试寄存器、调试相关API检测 20、枚举SFilter/Flgmgr的回调 21、系统用户名检测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barbyQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值