[转载]谈谈进程句柄表

进程句柄表解析

[转载]谈谈进程句柄表

信息来源:cvc
文章作者:pjf

Windows有许多种类的句柄,其中比较有趣的是内核对象(进程、
线程、文件、事件、互斥量等)的句柄。此HANDLE值仅仅是句柄表的
一个索引值。下面讨论一下进程句柄表相关结构以及一个应用例子:
向一个正运行程序的文件Write。
  一、Windows98、WindowsNT(NT未验证):句柄表的格式为一个DWORD
指明大小,后跟若干项,每项两DWORD:内核对象指针与标志掩码。
98上的例子:PHT Address = 0x8162C628
        Flag=0        Handle=0
        Flag=0x1F0FFF    Handle=0x8162C5E4
        ......
顺便说一句,第一项未用,第二项即为该进程句柄。0x8162C5E4即是
该进程数据库地址。
  二、Windows 2000:为了防止拷贝费时,Windows2000用一个三
级表来寻找对应项。(就可以在扩充时只用分配新内存而无需拷贝原
来各项。)
  1、首先,EPROCESS中的ObjectHandle指向表头:
         struct _OBJECT_TABLE{
              ULONG Unkown1;//总为0
              ULONG HandleCount;//所有有效项数
              PVOID PAT;//最高级指针
              PEPROCESS ThisProcess;
              ULONG Unknown2;
              ULONG Unknown3;
              ULONG TotalCount;//纪录第三级表分配的内存
                         //可容多少项
              LIST_ENTRY link;
               ......//??上面的名字随便取的
              }_HANDLE_TABLE;
例子:00 00 00 00 27 00 00 00-00 D0 3B E1 20 24 85 FE
    04 02 00 00 00 1E 00 00-00 01 00 00 00 F3 CE FE
    68 DD 87 FE 00 00 00 00-00 00 00 00 00 00 00 00
                 ......
  2、上面的PAT就是一个指针数组,有256项,每项指向中级表PMT
例子:00 D4 3B E1 00 00 00 00-00 00 00 00 00 00 00 00
                 ......
  3、PMT与PAT类似,指向次级表PLT。
例子:00 D8 3B E1 00 00 00 00-00 00 00 00 00 00 00 00
                 ......
  4、PLT中每项8字节,其中第一个DWORD为内核对象的指针稍加修改,
第二项也是标志掩码。
    第一个表项未用,总为00 00 00 00 01 00 00 00,最后以项初
始化为00 00 00 00 FF FF FF FF,表结束。

例子:00 00 00 00 01 00 00 00-58 42 2D 61 1F 00 0F 00
    48 3F F4 7E 03 00 10 00-E8 F0 C4 7E 03 00 10 00
                  ......
    00 00 00 00 31 00 00 00-00 00 00 00 32 00 00 00
                  ......
    00 00 00 00 FF 00 00 00-00 00 00 00 FF FF FF FF

每项格式很清楚(见InsideWindows2000),内核对象头可由第一个DWORD
与0x80000000相或(低三位清为0)。内核对象头开始两DWORD为句柄计数
与引用计数等等,对象头偏移0x18处(未查过所有对象类型)即为实际的
内核对象。

   正在运行的程序对应的EXE文件你不能往里写东西,现在就对句柄表
和它指向的内核对象修改来实现这一点:
   用GENERIC_READ打开文件,此时不能写。传句柄给驱动,驱动找到
掩码与内核对象,改之,就可在此程序中对那个EXE肆意修改。
2000驱动片断(运行没错就草草了事了):
      PETHREAD PEThread=0;
PEPROCESS PEProcess=0;
PHANDLE_TABLE PHTable;
PFILE_OBJECT file;
ULONG index;
UCHAR pointer1,pointer2,pointer3;
switch( ControlCode)
{
case IOCTL_******:
_asm cli
PEThread=(PETHREAD)(ULONG)Irp->Tail.Overlay.Thread;
PEProcess=(PEPROCESS)PEThread->ThreadsProcess;
PHTable=PEProcess->ObjectTable;
index=((PULONG)Irp->AssociatedIrp.SystemBuffer)[0];
pointer3=(UCHAR)(index&0x000000FF);
pointer2=(UCHAR)((index&0x0000FF00)>>8);
pointer1=(UCHAR)((index&0x00FF0000)>>16);
file=(PFILE_OBJECT)((PULONG)PHTable)[2];
file=(PFILE_OBJECT)((PULONG)file)[pointer1];
file=(PFILE_OBJECT)((PULONG)file)[pointer2];
((PULONG)file)[pointer3/2+1]=0x0012019f;//可写的掩码
file=(PFILE_OBJECT)((PULONG)file)[pointer3/2];
file=(PFILE_OBJECT)((ULONG)file|0x80000000);
file=(PFILE_OBJECT)((ULONG)file+0x18);
file->WriteAccess=TRUE;//这可以不改
_asm sti
           ......

9x中简单多了,首先找出异或码可由进程ID得出进程数据库,再得出句柄表基址,就可访问,就在ring3即可,略了。对于Hume发的那个贴,你仔细在9x上由句柄表得出的“对象”中分析,但未必有收获,9x这方面远不及nt。
<think>嗯,用户让我谈谈进程管理的理解。首先,我得明确进程管理在操作系统中的角色。进程是程序执行的实例,对吧?那操作系统怎么管理这些进程呢?可能需要从进程的创建、调度、同步、通信和终止这几个方面入手。 进程的生命周期应该包括创建、就绪、运行、阻塞和终止这些状态。用户可能想知道进程是怎么在这些状态之间转换的,比如通过什么事件触发状态变化。比如,当进程等待I/O操作时,会从运行态转到阻塞态,完成后再回到就绪态。 然后是进程调度,这部分可能涉及调度算法。比如先来先服务、短作业优先、轮转调度、优先级调度这些。需要解释每种算法的优缺点,以及适用场景。比如实时系统可能用优先级调度,而交互式系统可能用轮转调度保证响应时间。 进程同步和通信也很重要。多个进程访问共享资源时会出现竞争条件,所以需要同步机制,比如信号量、互斥锁。进程间通信的方式有管道、消息队列、共享内存、套接字等。这些机制的区别和适用情况可能需要说明。 还有进程控制块(PCB),它是操作系统管理进程的关键数据结构,存储进程的状态、寄存器、PID等信息。用户可能对PCB的作用不太清楚,需要解释清楚。 可能还需要提到多道程序设计如何提高CPU利用率,以及现代操作系统中的多线程和进程的关系。比如线程是轻量级的进程,共享同一进程的资源,但调度更高效。 用户可能对进程和程序的区别有疑问,所以应该明确进程是动态的执行过程,而程序是静态的代码。此外,守护进程、僵尸进程、孤儿进程这些概念也可能需要简要说明。 最后,要确保结构清晰,分点回答,用例子帮助理解,比如用生产者-消费者问题说明同步机制。同时注意使用正确的中文术语和LaTeX格式,比如调度算法名称用$...$包裹,独立公式如状态转换图用$$...$$。</think>### 对进程管理的理解(分步骤说明) #### 一、进程的定义与核心概念 1. **进程的本质** 进程是**程序的一次执行实例**,包含代码、数据、堆栈、寄存器状态和系统资源(如打开的文件)。 - 与程序的区别:程序是静态的代码文件,进程是动态的执行实体(例如:$程序=菜谱$,$进程=按菜谱烹饪的过程$)。 2. **进程控制块(PCB)** 操作系统通过**PCB(Process Control Block)** 管理进程,存储以下信息: - 进程ID(PID) - 进程状态(运行/就绪/阻塞等) - 程序计数器(PC) - CPU寄存器值 - 内存分配 - I/O状态 #### 二、进程生命周期与状态转换 1. **进程的5种基本状态** - **新建(New)**:进程被创建 - **就绪(Ready)**:等待CPU分配 - **运行(Running)**:占用CPU执行 - **阻塞(Blocked)**:等待I/O等事件 - **终止(Terminated)**:执行结束 2. **状态转换示例** $$ \text{新建} \xrightarrow{\text{分配资源}} \text{就绪} \xrightarrow{\text{调度}} \text{运行} \xrightarrow{\text{I/O请求}} \text{阻塞} \xrightarrow{\text{事件完成}} \text{就绪} $$ #### 三、进程调度算法 1. **调度目标** 提高CPU利用率、减少响应时间、保证公平性。 2. **经典算法对比** | 算法类型 | 特点 | 公式示例(平均等待时间) | |------------------|-------------------------------|--------------------------| | 先来先服务(FCFS) | 非抢占,适合长作业 | $W_{\text{avg}} = \frac{\sum (完成时间 - 到达时间)}{n}$ | | 短作业优先(SJF) | 最小化平均等待时间 | 通过预测作业长度排序 | | 时间片轮转(RR) | 公平性高,适合交互式系统 | 时间片大小影响吞吐量 | #### 四、进程同步与通信 1. **同步问题示例:生产者-消费者** - **问题描述**:共享缓冲区需互斥访问 - **解决方案**:使用信号量(Semaphore) ``` semaphore mutex = 1; // 互斥锁 semaphore empty = N; // 空缓冲区数量 semaphore full = 0; // 满缓冲区数量 ``` 2. **进程通信(IPC)方式** - **共享内存**:高速但需同步 - **消息传递**:通过系统调用(如管道、Socket) - **远程过程调用(RPC)**:跨网络通信 #### 五、现代扩展与挑战 1. **线程与进程的关系** - 线程是轻量级进程,共享同一进程的资源(如内存空间)。 - 多线程提高并发性,但需处理线程安全问题(例如:$竞态条件$)。 2. **容器化技术的影响** 容器(如Docker)通过**命名空间(Namespace)** 和**控制组(Cgroup)** 实现进程隔离,优化资源管理。 --- ### 总结 进程管理是操作系统的核心功能,需协调: 1. 资源分配(CPU、内存) 2. 状态监控与调度 3. 同步与通信机制 其设计直接影响系统性能(如吞吐量$T = \frac{\text{完成任务数}}{\text{时间}}$)和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值