`
andyjackson
  • 浏览: 58086 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

WINDOWS核心编程——内核对象

阅读更多

今天想把看的第三章的心得写下来。

这章主要介绍了内核对象。在WINDOWS中,内核对象是由操作系统来管理,尽管用户能够创建它,但是在创建之后,用户对该内核对象的操作都是委托给操作系统。

通常用户创建和使用的对象分为:用户对象(如 HICON CreateIcon(prama))、GDI对象函数以及内核对象。像访问令牌、事件对象、文件对象、文件映像对象、进程对象、信号量等都属于内核对象。在内核对象第一次被创建的是,系统会根据给定的参数初始化,其中有一个参数:PSECURITY_ATTRIBUTES,是SECURITY_ATTRIBUTES的指针,SECURITY_ATTRIBUTES的结构如下:

typedef struct _SECUTIRTY_ATTRIBUTES
{
    DWORD nLength;//length of itself
    LPVOID lpSecurityDescirptor;//安全描述符
    BOOL bInheritHandle;//表明该内核对象是否可以被继承
} SECURITY_ATTRIBUTES;

并返回一个该内核对象的句柄给创建函数所在的进程(首先要在该进程的句柄表中,找到一块空白的位置,存放该内核对象所在的地址)。

以后如果自己进程的其他线程的函数创建该内核对象时,操作系统会将该内核对象的计数器加一,然后返回该内核对象的一个句柄(对于中间可能出项的异常,就不在讨论)。关闭内核对象,类似地,操作系统会先通过传入的对象的句柄在进程的句柄表中验证该对象确实有权限访问它。然后进行相反的操作,当该内核对象的计数器为0时,操作系统会自动销毁它。

 

然而,在WINDOWS内部,内核对象的句柄是与进程相关的。但是,进程间有时候必须要共享内核对象,解决这个问题,有几种方法:

首先是使用对象句柄继承。 也就是说,对于父子进程间,可以在父进程中创建该内核对象的时候,设置它的bInheritHandle值为TRUE。然后使用 CreateProcess创建子进程的时候,同样需要设这个值为TRUE。当然也可以在父进程中设置一个变量的方法来实现。

 

如果想让某个进程的子进程部分由继承该内核对象,可以通过SetHandleInformationg来设置,该内核对象是否能够被继承。

BOOL SetHandleInformation(
   HANDLE hObject, 
   DWORD dwMask,
   DWORD dwFlags
)
/*
*@hObject:标志一个有效地句柄
*@dwMask:告诉函数我想修改那个或者哪些标志,目前每个句柄都关联了两个标志
*/
#define HANDLE_FLAG_INHERIT   0x00000001
//告诉句柄是否需要继承
#define HANDLE_FLAG_FROM_CLOSE   0X00000002
//告诉句柄是否允许关闭句柄

通过上面的方式,就可以让内核对象可选择性的被继承。

 

 

第二种方式是为对象命名。 事实上,大多数的内核对象都可以命名。例如:

HANDLE hMutex= CreateMutex(NULL, FALSE, TEXT("test"));
//创建一个叫做“test”的互斥量内核对象,并获得它的句柄
HANDLE hMutex1 = OpenMutex(NULL,FALSE,Text("test"));
//获得一个叫做“test”的互斥量对象
if(GetLastError()==ERROR_FILE_NOT_FOUND){
   //说明没有找到“test”
}else if(GetLastError()==ERROR_INVALID_HANDLE){
   //找到,但是类型不同
}
//上面两种情况下,hMutex1=NULL
//如果找到,且匹配,则会查看OpenMutex的第一个参数:dwDesirdAccess,看他想要的权限是否是允许的 

 

最后一种方式是复制对象的句柄。 使用DuplicateHandle函数:

BOOL DuplicateHandle
(
HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
PHANDLE hTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions
);
//这个函数是获得一个进程的句柄表的一条记录,然后copy到目标进程的进程句柄表中
 

考虑这样一个场景,假设进程S能够访问一个对象,并希望进程T也能够访问,那么就可以在S中调用DuplicatieHandle函数:

//create a mutex object accessible by Process S
HANDLE hObjInProcessS = CreateMutex(NULL, FALSE,NULL);

//get a handle to Process T's kernel object
//dwProcessIdT 就是T的进程标识符,假设已经获得
HANDLE hProcessT = OpenProcess(PROCESS_ALL_ACCESS,FLASE, dwProcessIdT);

HANDLE hObjInProcessT;
//give T access to our hObjInProcessS
DuplicateHandle(GetCurrentProcess(),hObjInProcessS, hProcessT, &hObjInProcessT, 0, FALSE, 
DUPLICATE_SAME_ACCESS);
//通过进程间通信的方式,是T获得这个句柄。
CloseHandle(hProcessT);
CloseHandle(hProcessS);

  注意:进程S中永远不要调用CloseHandle(hObjInProcessT);另外,这种方式存在潜在的失败风险,如果进程S中的hObjInProcessT的句柄值已经被另外的内核对象占据,那么会强行将先前的内核对象关闭。

 

未完待续……

 

 

 

 

分享到:
评论

相关推荐

    Windows编程入门——字节跳动.pptx

    Windows 编程入门涵盖了 Windows 操作系统、Windows 基本编程理论、API 文档、字符集与字符编码、内核对象、线程 API、WinDbg、SDK、PE 文件格式、文件系统等多个方面的知识点,是 Windows 编程的必备知识。

    寒江独钓--windows内核安全编程光盘源码_寒江独钓windows内核安全编程_

    《寒江独钓--Windows内核安全编程》是一份深入探讨Windows操作系统内核安全编程的珍贵资源,由知名技术专家“寒江独钓”编著。这份资料包含了丰富的Windows内核驱动开发实例,覆盖了从磁盘驱动、文件系统驱动到网络...

    寒江独钓——Windows内核安全编程

    《寒江独钓——Windows内核安全编程》是一本深入探讨Windows操作系统内核安全的专著。书名取自古诗词,寓意在信息技术的海洋中独自探索深奥的内核安全领域,暗示了作者对这一主题的独到见解和深入研究。这本书主要...

    寒江独钓——Windows内核安全编程 package2

    《寒江独钓——Windows内核安全编程》这一系列教程,是针对Windows操作系统内核安全编程的深度探讨。在Windows操作系统中,内核是系统的核心部分,它负责管理硬件资源,提供基本的服务供上层软件调用。内核安全编程...

    多任务编程---1 windows内核对象

    ### 多任务编程——Windows内核对象 #### 引言 在探讨Windows多任务编程时,内核对象是一个核心概念,对于深入理解Windows操作系统的工作原理至关重要。本文将围绕这一主题展开,详细介绍Windows内核对象的基本...

    天书夜读——从汇编语言到windows内核编程

    《天书夜读——从汇编语言到Windows内核编程》是一本深入探讨计算机底层原理和技术的书籍,尤其关注汇编语言与操作系统内核的交互。汇编语言是计算机科学的基础,它允许程序员直接控制硬件,是理解计算机工作原理的...

    深入浅出讲解Windows程序设计——Visual+C++课

    这包括了解Windows的内核、进程和线程管理、以及内存管理等核心概念。在学习Visual C++进行Windows程序开发时,通常会用到Windows API(应用程序编程接口),它是操作系统提供的一系列函数和宏,用来帮助开发者访问...

    Windows内核情景分析——采用开源代码ReactOS(上册).pdf

    1. Windows内核概述:介绍Windows操作系统的核心部分,即内核,它是操作系统中管理硬件资源和软件资源的程序集合。内核负责进程调度、内存管理、文件系统、网络通信以及安全机制等基本功能。 2. ReactOS项目介绍:...

    操作系统实验——Windows 控制台命令.docx

    5. **Windows核心系统服务**: - **Windows执行体**:包含了系统服务、设备驱动程序、文件系统、网络堆栈等。 - **Windows内核**:处理调度、内存管理、中断处理等核心功能。 - **设备驱动程序**:为硬件设备提供...

    Windows高级编程指南

    1. **内核模式与用户模式**:在Windows操作系统中,程序运行在两种不同的模式下——内核模式和用户模式。内核模式允许程序直接访问硬件资源,而用户模式则对程序的操作进行了限制,以提高系统的稳定性和安全性。 2. ...

    windows 内核 pdf

    《Windows内核PDF》资源包含了两本重量级的书籍——官方英文原版的"Microsoft Windows Internals"和潘爱民翻译的"Windows内核原理与实现",这为深入理解Windows操作系统内核提供了宝贵的资料。 "Microsoft Windows ...

    深入解析Windows操作系统 第4版——Microsoft Windows Server 2003/Windows XP/Windows 2000技术内幕

    - **内核模块**:介绍了Windows内核的基本结构与功能,包括进程管理、内存管理、设备驱动等核心组件。 - **驱动程序模型**:分析了不同版本Windows中的驱动程序模型(如WDM、NDIS等),以及它们如何与内核交互以提供...

    内核漏洞利用技术文章集合

    内核漏洞利用技术是网络安全领域中的重要研究方向,它涉及到操作系统的核心部分——内核的安全性。内核是操作系统的心脏,负责管理硬件资源、调度进程、处理系统调用等关键任务,因此,任何针对内核的漏洞都可能导致...

    Rootkits:Subverting the Windows Kernel 源代码

    Windows内核是操作系统的核心部分,负责管理和调度系统资源。攻击者常利用内核漏洞植入根套件,如通过权限提升、驱动程序注入等方法。一旦成功,根套件可以控制网络连接、文件系统、内存管理等关键功能。 **三、C++...

    Windows编程启示录.pdf

    - **Win32 API**:详细介绍Windows编程中最常用的API之一——Win32 API,包括其功能和用法。 - **COM组件对象模型**:讲解COM模型的基本概念以及如何利用它来构建组件化应用程序。 - **.NET Framework**:介绍.NET ...

    Windows操作系统核心技术--讲义和试验

    《Windows操作系统核心技术——讲义与实验》是一份深入探讨Windows操作系统内部机制的教育资源,涵盖了从底层硬件交互到高级编程接口的广泛主题。这份资料主要针对Java、VB.NET、.NET、C/C++以及C#等编程语言的...

    windows内核开发之键盘记录源码

    本文将聚焦于一个特定的内核开发实例——键盘记录器,通过分析“ctrl2cap”这个源码,揭示其在Windows内核层实现键盘监控和记录的原理。 键盘记录器,顾名思义,是一种可以捕捉并存储用户键盘输入的程序。在系统...

    Windows驱动编程 电子书

    在IT领域,Windows驱动编程是构建操作系统与硬件设备交互的核心技术。这三本电子书——"MSWDM.chm"、"WALTONEY.CHM"和"WindowsWDMDriver.chm"显然涵盖了这一主题,旨在帮助读者深入理解并掌握Windows驱动程序的开发...

Global site tag (gtag.js) - Google Analytics