当前位置: 首页 > news >正文

Linux内核进程管理子系统有什么第三十八回 —— 进程主结构详解(34)

接前一篇文章:Linux内核进程管理子系统有什么第三十七回 —— 进程主结构详解(33)

本文内容参考:

Linux内核进程管理专题报告_linux rseq-CSDN博客

《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超

《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社

特此致谢!

进程管理核心结构 —— task_struct

8. 进程权限相关成员

进程权限相关成员包括以下几个:

	/* Process credentials: *//* Tracer's credentials at attach: */const struct cred __rcu		*ptracer_cred;/* Objective and real subjective task credentials (COW): */const struct cred __rcu		*real_cred;/* Effective (overridable) subjective task credentials (COW): */const struct cred __rcu		*cred;

这几个字段的描述如下:

上一回讲了Subjective和Objective的概念,Subjective说白了就是“我能操作谁”,而Objective则是“谁能操作我”。

那么相对应地:

(1)struct cred *real_cred

real_cred字段是一个指针,指向主体和真实客体证书。

real_cred代表谁能操作本进程。实质上就是我这个进程操作别人时所具有的权限是什么。

(2)struct cred *cred

cred字段也是一个指针,指向有效客体证书。

cred代表本进程能操作谁。实质上就是别人操作我这个进程时需要具有的权限是什么。

(3)struct cred *ptracer_cred

要弄清楚这个字段的含义,需要先对ptrace进行知识补强。

知识补强 —— ptrace

如果想在用户空间程序中实现或模拟对进程的跟踪(trace)功能,特别是想要“attach”(附着)到一个特定的进程,可以使用多种方法。例如,使用ptrace(process trace)系统调用。

ptrace是一种机制,允许一个进程(称为tracer)监控另一个进程(称为trace)的执行。这在调试和系统监控方面非常有用。

使用ptrace机制的一般流程如下:

1)包含必要的头文件

首先需要包含<sys/ptrace.h>和<sys/types.h>等头文件。

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

2)使用ptrace附加到进程

可以使用ptrace函数配合PTRACE_ATTACH选项来附加到目标进程。

pid_t pid = 1234; // 目标进程的PIDif (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {perror("ptrace");exit(EXIT_FAILURE);
}// 等待目标进程状态改变
waitpid(pid, NULL, 0);

3)执行跟踪操作

一旦附加成功,就可以读取或修改寄存器、内存等,或者简单地继续执行进程。

// 继续执行目标进程
if (ptrace(PTRACE_CONT, pid, NULL, NULL) == -1) {perror("ptrace");exit(EXIT_FAILURE);
}

4)分离进程

当完成跟踪后,应该使用PTRACE_DETACH选项来分离进程。

if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1) {perror("ptrace");exit(EXIT_FAILURE);
}

将以上步骤综合起来的完整ptrace示例代码如下:

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main(int argc, char **argv)
{pid_t pid = 1234; //目标进程的PID,需要根据实际情况修改long w;if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1){perror("ptrace");exit(EXIT_FAILURE);}waitpid(pid, &w, 0); //等待子进程状态改变printf("Attached to process %d\n", pid);if (ptrace(PTRACE_CONT, pid, NULL, NULL) == -1){ //继续执行目标进程perror("ptrace");exit(EXIT_FAILURE);}waitpid(pid, &w, 0); //等待子进程状态改变以继续执行或停止等操作...//更多操作...if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1){ //分离进程perror("ptrace");exit(EXIT_FAILURE);}printf("detached from process %d\n", pid);return 0;
}

注意:

  • 在使用ptrace时,需要有足够的权限(通常是root权限),因为大多数情况下,只有超级用户才能对其他用户的进程进行跟踪。

  • 在实际使用中,确保处理好错误情况,例如目标进程不存在或没有足够的权限。

了解了ptrace机制后,struct cred *ptracer_cred这一字段的含义就好理解多了。其意义是:

在附着到某进程时,追踪者(tracer)需要具有的权限。

task_struct结构中进程权限相关成员的更多内容请看下回。

http://www.dtcms.com/a/357628.html

相关文章:

  • 叠叠问题解决
  • iPaaS实施的前提是先进行集成关系的梳理
  • 从自定义日期类角度解析运算符重载,友元函数(friend)
  • AI助力PPT创作:秒出PPT与豆包AI谁更高效?
  • 实现动态数组
  • 【NJU-OS-JYY笔记】操作系统:设计与实现
  • 【开题答辩全过程】以 基于Vue Spring Boot的教师资格证考试助力系统设计与实现为例,包含答辩的问题和答案
  • 黑客之都CSP-J模拟赛题解
  • C6.6:交流参量、电压增益、电流增益的学习
  • 企业级-搭建CICD(持续集成持续交付)实验手册
  • 【面试场景题】三阶段事务提交比两阶段事务提交的优势是什么
  • TypeScript: Symbol.iterator属性
  • 蓝蜂蓝牙模组:破解仪器仪表开发困境
  • 打通安卓、苹果后,小米澎湃OS 3又盯上了Windows
  • 【系列05】端侧AI:构建与部署高效的本地化AI模型 第4章:模型量化(Quantization)
  • AntSK知识库多格式导入技术深度解析:从文档到智能,一站式知识管理的技术奇迹
  • 第十二节 Spring 注入集合
  • 零知识证明的刑事证据困境:隐私权与侦查权的数字博弈
  • Windows 11 跳过 OOBE 的方法和步骤
  • 企业级数据库管理实战(二):数据库权限最小化原则的落地方法
  • 现状摸底:如何快速诊断企业的“数字化健康度”?
  • 嵌入式Linux驱动开发 - 蜂鸣器驱动
  • 25.8.29_NSSCTF——[BJDCTF 2020]Easy_WP
  • VeOmni 全模态训练框架技术详解
  • 深入理解Go 与 PHP 在参数传递上的核心区别
  • 变量声明方式
  • 嵌入式第四十一天(数据库)
  • 海量小文件问题综述和解决攻略(二)
  • C++ DDS框架学习
  • 超详细讲解urllib库的使用