/proc目录简介
首先来介绍一下/proc目录,它是一个虚拟的目录,其下面的文件和目录也都是虚拟的,不占用实际的存储空间,而是存在于系统内存中。proc以文件系统的方式为访问系统内核的操作提供接口,它是动态从系统内核中读出所需信息的。
- /proc/cmdline:显示内核启动的命令行。
- /proc/cpuinfo:显示系统cpu的信息。
- /proc/filesystems,显示当前注册了的文件系统列表,nodev表示为虚拟文件系统。
- /proc/interrupts:显示当前系统的中断信息.
- /proc/ioports:被占用的输入/输出地址范围列表。
- /proc/kmsg:输出内核消息日志。
- /proc/loadavg:监控cpu平均负载,其数值为所有核上cpu占用的累加值,前三个分别表示最近1、5、15分钟的平均负载,第四个表示当前运行进程数和进程总数,最后一个表示最近运行的进程id。
- /proc/locks:打开文件上的加锁信息。
- /proc/meminfo:显示物理及虚拟内存使用情况。
- /proc/misc:内核函数misc_register登记的设备驱动程序。
- /proc/modules:加载的内核模块列表。
- /proc/mounts:当前系统所安装的文件系统信息(包括手动安装的)。
- /proc/stat: 系统简要信息。
- /proc/uptime:分别表示系统启动时间和系统空闲时间。
- /proc/version:系统内核版本。
- /proc/net: 其实际挂载点是/proc/self/net,能够显示当前各种网络情况,例如通过tcp文件可以查看tcp连接数及连接情况。
- /proc/sys 报告各种不同的内核参数,某些参数能在root的情况下进行修改。
- /proc/devices 当前挂载的所有软硬件设备(字符设备和块设备),包括主设备号和设备名称。
- /proc/asound:声卡相关的信息。
- /proc/buddyinfo:每个内存区中每个order有多少块可用,和内存碎片问题有关。
- /proc/bus: 输入设备信息。
- /proc/cgroups:查看cgroups子系统信息。
- /proc/diskstats:用于显示磁盘、分区和统计信息。
- /proc/execdomains:安全相关的信息。
- /proc/fb:帧缓冲设备信息。
- /proc/iomem:记录物理地址的分配情况。
- /proc/kallsyms:内核符号表信息。
- /proc/pagetypeinfo:内存分页信息。
- /proc/partitions:分区信息
- /proc/sched_debug:cpu调度信息。
- /proc/softirqs:软中断情况。
- /proc/vmallocinfo:vmalloc内存分配信息。
- /proc/vmstat:统计虚拟内存信息。
- /proc/pid:显示进程相关的所有信息。
懒得整理成表格了,那天要是看我有空就叫我整理成表格吧
/proc/xx/进程目录
在/proc目录下面还有很多目录的名字是数字,这些目录保存了当前系统中运行的所有进程的信息,数字对应的是进程的pid。
例子:
普通用户只能查看本进程相关的信息,需要取得root权限后才能查看其它进程信息,例如查看进程7289目录内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| 127|sagit:/proc/7289 $ ls -l total 0 dr-xr-xr-x 2 shell shell 0 2023-07-27 15:49 attr -rw-r--r-- 1 shell shell 0 2023-07-27 15:49 autogroup -r-------- 1 shell shell 0 2023-07-27 15:49 auxv -r--r--r-- 1 shell shell 0 2023-07-27 15:49 cgroup --w------- 1 shell shell 0 2023-07-27 15:49 clear_refs -r--r--r-- 1 shell shell 0 2023-07-27 15:43 cmdline -rw-r--r-- 1 shell shell 0 2023-07-27 15:49 comm -rw-r--r-- 1 shell shell 0 2023-07-27 15:49 coredump_filter -r--r--r-- 1 shell shell 0 2023-07-27 15:49 cpuset lrwxrwxrwx 1 shell shell 0 2023-07-27 15:49 cwd -> /proc/7289 -r-------- 1 shell shell 0 2023-07-27 15:49 environ lrwxrwxrwx 1 shell shell 0 2023-07-27 15:42 exe -> /system/bin/sh dr-x------ 2 shell shell 0 2023-07-27 15:42 fd dr-x------ 2 shell shell 0 2023-07-27 15:49 fdinfo -r-------- 1 shell shell 0 2023-07-27 15:49 io -r--r--r-- 1 shell shell 0 2023-07-27 15:49 limits dr-x------ 2 shell shell 0 2023-07-27 15:49 map_files -r--r--r-- 1 shell shell 0 2023-07-27 15:49 maps -rw------- 1 shell shell 0 2023-07-27 15:49 mem -r--r--r-- 1 shell shell 0 2023-07-27 15:49 mountinfo -r--r--r-- 1 shell shell 0 2023-07-27 15:49 mounts -r-------- 1 shell shell 0 2023-07-27 15:49 mountstats dr-xr-xr-x 10 shell shell 0 2023-07-27 15:49 net dr-x--x--x 2 shell shell 0 2023-07-27 15:49 ns -rw-r--r-- 1 shell shell 0 2023-07-27 15:49 oom_adj -r--r--r-- 1 shell shell 0 2023-07-27 15:49 oom_score -rw-r--r-- 1 shell shell 0 2023-07-27 15:42 oom_score_adj -r-------- 1 shell shell 0 2023-07-27 15:49 pagemap -r-------- 1 shell shell 0 2023-07-27 15:49 personality --w------- 1 shell shell 0 2023-07-27 15:49 reclaim lrwxrwxrwx 1 shell shell 0 2023-07-27 15:49 root -> / -rw-rw-rw- 1 shell shell 0 2023-07-27 15:49 sched_group_id -rw-r--r-- 1 shell shell 0 2023-07-27 15:49 sched_init_task_load -rw-r--r-- 1 shell shell 0 2023-07-27 15:49 sched_wake_up_idle -r--r--r-- 1 shell shell 0 2023-07-27 15:49 schedstat -r--r--r-- 1 shell shell 0 2023-07-27 15:46 smaps -r-------- 1 shell shell 0 2023-07-27 15:49 stack -r--r--r-- 1 shell shell 0 2023-07-27 15:43 stat -r--r--r-- 1 shell shell 0 2023-07-27 15:49 statm -r--r--r-- 1 shell shell 0 2023-07-27 15:48 status -r-------- 1 shell shell 0 2023-07-27 15:49 syscall dr-xr-xr-x 3 shell shell 0 2023-07-27 15:49 task -r--r--r-- 1 shell shell 0 2023-07-27 15:49 time_in_state -rw-rw-rw- 1 shell shell 0 2023-07-27 15:49 timerslack_ns -rw-rw-rw- 1 shell shell 0 2023-07-27 15:49 top_app -r--r--r-- 1 shell shell 0 2023-07-27 15:48 wchan
|
进程目录文件或目录的分析
cmdline
该(虚拟)文件包含了启动该进程的整个命令行。它未曾格式化:程序与其参数之间没有空格,行末也没有换行。
cwd
该符号链接指向该进程的当前工作目录。现在我见过的基本都是根目录,从上面的输出就能看出它链接到的是根目录。
environ
该文件包含为该进程定义的所有环境变量,格式为 变量 = 值
。与 cmdline
文件一样,其内容未曾格式化过:各个变量之间没有分行,文件末尾也没有换行。
exe
这是指向该进程所执行的可执行程序文件的符号链接。上面的输出可以看出链接到/system/bin/adb,一般的用户进程是链接到/system/bin/app_process,这是zygote进程的实际实现文件,因为所有进程都是zygote孵化出来的,所以这里都会链接到它。
fd
在此子目录中包含了该进程当前打开的所有描述符。下面看一下进程7289的输出:
1 2 3 4 5 6
| sagit:/proc/7289 $ ls -l fd total 0 lrwx------ 1 shell shell 64 2023-07-27 15:50 0 -> /dev/pts/0 lrwx------ 1 shell shell 64 2023-07-27 15:50 1 -> /dev/pts/0 lrwx------ 1 shell shell 64 2023-07-27 15:50 10 -> /dev/tty lrwx------ 1 shell shell 64 2023-07-27 15:50 2 -> /dev/pts/0
|
实际上,这是该进程打开的文件描述符列表,每个描述符由一个符号链接表示,其名称为该描述符的编号,并指向该描述符打开的文件。注意这些符号链接的权限:它们的意义仅代表被相应描述符打开的文件的权限。
maps
这个文件中显示了该进程的虚拟地址空间的分布情况。该文件有6列,自左至右各列为:
- 地址:库在进程里地址范围
- 权限:虚拟内存的权限,r=读,w=写,x=,s=共享,p=私有;
- 偏移量:库在进程里地址范围
- 设备:映像文件的主设备号和次设备号,当设备号为 0 且没有 inode 号或文件名时,它就是一个匿名映射,表示没有节点与内存相对应;
- 节点:映像文件的节点号;
- 路径: 映像文件的路径
- 每项都与一个vm_area_struct结构成员对应。
利用进程8423来举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| sagit:/proc/7289 $ cat maps 5a29274000-5a292cc000 r-xp 00000000 103:1d 7356 /system/bin/sh 5a292e2000-5a292e4000 r--p 0005e000 103:1d 7356 /system/bin/sh 5a292e4000-5a292e5000 rw-p 00060000 103:1d 7356 /system/bin/sh 5a292e5000-5a292e7000 rw-p 00000000 00:00 0 7cfd800000-7cfdc00000 rw-p 00000000 00:00 0 [anon:libc_malloc] 7cfdd59000-7cfdd5b000 r-xp 00000000 103:1d 6092 /system/lib64/libnetd_client.so 7cfdd5b000-7cfdd78000 ---p 00000000 00:00 0 7cfdd78000-7cfdd79000 r--p 0000f000 103:1d 6092 /system/lib64/libnetd_client.so 7cfdd79000-7cfdd7a000 rw-p 00010000 103:1d 6092 /system/lib64/libnetd_client.so 7cfdd83000-7cfde55000 r-xp 00000000 103:1d 6091 /system/lib64/libc++.so 7cfde55000-7cfde6c000 ---p 00000000 00:00 0 7cfde6c000-7cfde76000 r--p 000d6000 103:1d 6091 /system/lib64/libc++.so 7cfde76000-7cfde77000 rw-p 000e0000 103:1d 6091 /system/lib64/libc++.so 7cfde77000-7cfde7a000 rw-p 00000000 00:00 0 [anon:.bss] 7cfde9e000-7cfdea0000 r-xp 00000000 103:1d 6374 /system/lib64/libdl.so 7cfdea0000-7cfdebd000 ---p 00000000 00:00 0 7cfdebd000-7cfdebe000 r--p 0000f000 103:1d 6374 /system/lib64/libdl.so 7cfdebe000-7cfdebf000 rw-p 00000000 00:00 0 [anon:.bss] 7cfdec7000-7cfdfb6000 r-xp 00000000 103:1d 6620 /system/lib64/libc.so 7cfdfb6000-7cfdfd1000 ---p 00000000 00:00 0 7cfdfd1000-7cfdfd7000 r--p 000fa000 103:1d 6620 /system/lib64/libc.so 7cfdfd7000-7cfdfd9000 rw-p 00100000 103:1d 6620 /system/lib64/libc.so 7cfdfd9000-7cfdfda000 rw-p 00000000 00:00 0 [anon:.bss] 7cfdfda000-7cfdfdb000 r--p 00000000 00:00 0 [anon:.bss] 7cfdfdb000-7cfdfe3000 rw-p 00000000 00:00 0 [anon:.bss] 7cfe01b000-7cfe052000 r-xp 00000000 103:1d 6495 /system/lib64/libm.so 7cfe052000-7cfe06a000 ---p 00000000 00:00 0 7cfe06a000-7cfe06b000 r--p 0003f000 103:1d 6495 /system/lib64/libm.so 7cfe06b000-7cfe06c000 rw-p 00040000 103:1d 6495 /system/lib64/libm.so 7cfe06f000-7cfe08f000 r--s 00000000 00:13 16938 /dev/__properties__/u:object_r:default_prop:s0 7cfe08f000-7cfe090000 rw-p 00000000 00:00 0 [anon:linker_alloc] 7cfe09f000-7cfe0a0000 r--p 00000000 00:00 0 [anon:atexit handlers] 7cfe0a0000-7cfe0c0000 r--s 00000000 00:13 17058 /dev/__properties__/properties_serial 7cfe0c0000-7cfe0c2000 rw-p 00000000 00:00 0 [anon:System property context nodes] 7cfe0c2000-7cfe0c9000 r--s 00000000 00:13 16892 /dev/__properties__/property_info 7cfe0c9000-7cfe0ca000 rw-p 00000000 00:00 0 [anon:linker_alloc_vector] 7cfe0ca000-7cfe0cb000 rw-p 00000000 00:00 0 [anon:arc4random data] 7cfe0cb000-7cfe0cc000 rw-p 00000000 00:00 0 [anon:linker_alloc_vector] 7cfe0cc000-7cfe0cd000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] 7cfe0cd000-7cfe0ce000 rw-p 00000000 00:00 0 [anon:linker_alloc] 7cfe0ce000-7cfe0ee000 r--s 00000000 00:13 16938 /dev/__properties__/u:object_r:default_prop:s0 7cfe0ee000-7cfe0f0000 rw-p 00000000 00:00 0 [anon:linker_alloc_vector] 7cfe0f0000-7cfe0f1000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] 7cfe0f1000-7cfe0f2000 r--p 00000000 00:00 0 [anon:linker_alloc] 7cfe0f2000-7cfe112000 r--s 00000000 00:13 16936 /dev/__properties__/u:object_r:debug_prop:s0 7cfe112000-7cfe113000 ---p 00000000 00:00 0 7cfe113000-7cfe114000 rw-p 00000000 00:00 0 7cfe114000-7cfe115000 ---p 00000000 00:00 0 7cfe115000-7cfe135000 r--s 00000000 00:13 17058 /dev/__properties__/properties_serial 7cfe135000-7cfe137000 rw-p 00000000 00:00 0 [anon:System property context nodes] 7cfe137000-7cfe272000 r-xp 00000000 103:1d 7367 /system/bin/linker64 7cfe272000-7cfe279000 r--s 00000000 00:13 16892 /dev/__properties__/property_info 7cfe279000-7cfe27a000 r--p 00000000 00:00 0 [anon:linker_alloc] 7cfe27a000-7cfe27b000 rw-p 00000000 00:00 0 [anon:linker_alloc_vector] 7cfe27b000-7cfe27c000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] 7cfe27c000-7cfe27d000 rw-p 00000000 00:00 0 [anon:linker_alloc_vector] 7cfe27d000-7cfe27e000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] 7cfe27e000-7cfe27f000 r--p 00000000 00:00 0 [anon:atexit handlers] 7cfe27f000-7cfe280000 ---p 00000000 00:00 0 [anon:thread signal stack guard] 7cfe280000-7cfe284000 rw-p 00000000 00:00 0 [anon:thread signal stack] 7cfe284000-7cfe285000 rw-p 00000000 00:00 0 [anon:arc4random data] 7cfe285000-7cfe286000 ---p 00000000 00:00 0 [anon:bionic TLS guard] 7cfe286000-7cfe289000 rw-p 00000000 00:00 0 [anon:bionic TLS] 7cfe289000-7cfe28a000 ---p 00000000 00:00 0 [anon:bionic TLS guard] 7cfe28a000-7cfe28b000 r--p 00000000 00:00 0 [vvar] 7cfe28b000-7cfe28c000 r-xp 00000000 00:00 0 [vdso] 7cfe28c000-7cfe297000 r--p 00145000 103:1d 7367 /system/bin/linker64 7cfe297000-7cfe298000 rw-p 00150000 103:1d 7367 /system/bin/linker64 7cfe298000-7cfe29b000 rw-p 00000000 00:00 0 7cfe29b000-7cfe29c000 r--p 00000000 00:00 0 7cfe29c000-7cfe2a3000 rw-p 00000000 00:00 0 7fc781b000-7fc783c000 rw-p 00000000 00:00 0 [stack]
|
对于每个so文件会出现多次:
看它们的权限就明白了,r-xp是代码段,r--p是只读数据段,rw-p是读写数据段。
smap
这是进程使用内存的详细说明 , 比 maps 信息更详细
root
该符号链接指向该进程使用的根目录。通常为 /
stat
包含了进程的众多信息和与CPU相关的信息,所有值都是从系统启动开始累计到当前时刻的。
1 2
| sagit:/proc/8423 # cat stat 8423 (.DungeonShooter) S 28120 28120 0 0 -1 1077952832 379799 22501 52 0 52306 7718 21 6 16 -4 142 0 128300431 10283085824 250149 18446744073709551615 411018997760 411019016668 549174228864 549174220000 484306082512 0 4608 1 1619039484 0 0 0 17 3 0 0 0 0 0 411019127392 411019128832 411669524480 549174229540 549174229639 549174229639 549174231006 0
|
解释:
- pid = 8423 进程(包括轻量级进程,即线程)号
- comm = .DungeonShooter 应用程序或命令的名字
- task_state = S 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
- ppid = 28120 父进程ID
- pgid = 28120(第二个) 线程组号
- sid = 0 该任务所在的会话组ID
- 后面字段参考文章没说......那天查到了在看看..
statm
包含了进程的内存页面相关的信息。
1 2
| sagit:/proc/8423 # cat statm 2510783 250132 79509 5 0 2222893 0
|
解释:
- size(pages):任务虚拟地址空间大小,VmSize/4
- Resident(pages):正在使用的物理内存大小,VmRSS/4
- Shared(pages):共享页数
- Trs(pages):程序所拥有的可执行虚拟内存大小, VmExe/4
- Lrs(pages):被映像倒任务的虚拟内存空间的库的大小,VmLib/4
- Drs(pages):程序数据段和用户态的栈的大小,(VmData+ VmStk )/4
- dt(pages):脏页数量
status
该文件包含该进程的众多信息:可执行文件名、当前状态、PID 和 PPID、实际及有效的 UID 和 GID、内存使用情况、以及其他。请注意,stat
和 statm
现已过时。它们包含的信息现存于 status
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| sagit:/proc/8423 # cat status Name: .DungeonShooter State: S (sleeping) Tgid: 8423 Pid: 8423 PPid: 28120 TracerPid: 0 Uid: 10164 10164 10164 10164 Gid: 10164 10164 10164 10164 Ngid: 0 FDSize: 512 Groups: 3002 3003 9997 20164 50164 VmPeak: 10244096 kB VmSize: 10042076 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 1003672 kB VmRSS: 997928 kB VmData: 8882068 kB VmStk: 8448 kB VmExe: 20 kB VmLib: 389332 kB VmPTE: 4088 kB VmPMD: 60 kB VmSwap: 24468 kB Threads: 142 SigQ: 0/22094 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000001200 SigIgn: 0000002800000001 SigCgt: 00000006608094fc CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000000000000000 CapAmb: 0000000000000000 Seccomp: 2
Speculation_Store_Bypass: unknown Cpus_allowed: ff Cpus_allowed_list: 0-7 Mems_allowed: 1 Mems_allowed_list: 0 voluntary_ctxt_switches: 3962 nonvoluntary_ctxt_switches: 545
|
解释:
- Name: 应用程序或命令的名字
- State: 任务的状态,运行/睡眠/僵死/
- SleepAVG: 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。
- Tgid: 线程组号
- Pid: 任务ID
- Ppid: 父进程ID
- TracerPid: 接收跟踪该进程信息的进程的ID号
- Uid: Uid euid suid fsuid
- Gid: Gid egid sgid fsgid
- Ngid
- FDSize: 该字段是表示当前进程分配过的文件描述符的近似的最高值。如果刚开始打开了18个文件,则这里的FDSize等于32,若大于32,则以32为单位递增,例如33则是64;这个32的单位是依赖于系统位数的,如果是32位则是32,若是64位系统则是以64倍增。
- Groups:
- VmPeak: 虚拟内存峰值大小
- VmSize(KB): 已经使用的虚拟内存大小
- VmLck(KB): 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
- VmPin(KB):
- VmHWM(KB): 进程所使用的物理内存的峰值
- VmRSS(KB): 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
- VmData(KB): 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
- VmStk(KB): 任务在用户态的栈的大小 (stack_vm)
- VmExe(KB): 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
- VmLib(KB): 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
- VmPTE: 该进程的所有页表的大小,单位:kb
- VmPMD
- VmSwap:进程所使用的交换区的大小
- Threads: 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。
- SigQ: 待处理信号的个数
- SigPnd: 屏蔽位,存储了该线程的待处理信号
- ShdPnd: 屏蔽位,存储了该线程组的待处理信号
- SigBlk: 存放被阻塞的信号
- SigIgn: 存放被忽略的信号
- SigCgt: 存放被俘获到的信号
- CapInh (Inheritable): 能被当前进程执行的程序的继承的能力
- CapPrm (Permitted): 进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性
- CapEff (Effective): 进程的有效能力
- CapBnd: 是系统的边界能力,我们无法改变它。
- Cpus_allowed: 指出该进程可以使用CPU的亲和性掩码,因为我们指定为4块CPU,所以这里就是F(1111)。
- Cpus_allowed_list: 指出该进程可以使用CPU的列表,这里是0-7。
- voluntary_ctxt_switches: 表示进程主动切换的次数.
- nonvoluntary_ctxt_switches: 表示进程被动切换的次数.
你问没写到的?我懒得查了
mem
这是一个很重要的虚拟文件,它可以用来访问该进程的内存页面,你可以通过open、read、lseek函数来访问里面的内容。如果你用cat来打印里面的内容是会出错的。
mem是进程的内存映射文件 , 通过 smaps 可以获取各个模块的地址,将 mem 看做一个文件 , 使用 fseek 跳转到对应偏移地址中 , 可以读取对应地址内存中的数据。
task
task 目录是该进程的子线程
oom_adj
这是进程的优先级
oom_adj 值越小 , 进程优先级越高 , 越不容易被杀死
逆向相关大的
纯属总结:
- mem (!!!!)
- 可以通过这个来修改内存,这很符合我对安卓逆向的想象。
- maps / smaps
- task
- environ
- cwd / cmd