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

RtlLookupAtomInAtomTable函数分析之RtlpAtomMapAtomToHandleEntry函数的作用是验证其正确性

第一部分:
NTSTATUS
RtlLookupAtomInAtomTable(
    IN PVOID AtomTableHandle,
    IN PWSTR AtomName,
    OUT PRTL_ATOM Atom OPTIONAL
    )
{
    NTSTATUS Status;
    PRTL_ATOM_TABLE p = (PRTL_ATOM_TABLE)AtomTableHandle;
    PRTL_ATOM_TABLE_ENTRY a;
    RTL_ATOM Temp;

    RTL_PAGED_CODE();
    if (!RtlpLockAtomTable( p )) {
        return STATUS_INVALID_PARAMETER;
        }
    try {
        if (RtlpGetIntegerAtom( AtomName, &Temp )) {
            if (Temp >= RTL_ATOM_MAXIMUM_INTEGER_ATOM) {
                Temp = RTL_ATOM_INVALID_ATOM;
                Status = STATUS_INVALID_PARAMETER;
                }
            else {
                Status = STATUS_SUCCESS;
                }

            if (ARGUMENT_PRESENT( Atom )) {
                *Atom = Temp;
                }
            }
        else
        if (*AtomName == UNICODE_NULL) {
            Status = STATUS_OBJECT_NAME_INVALID;
            }
        else {
            a = RtlpHashStringToAtom( p, AtomName, NULL, NULL );                    //关键地方
            if (a == NULL) {
                Status = STATUS_OBJECT_NAME_NOT_FOUND;
                }
            else {
                if (RtlpAtomMapAtomToHandleEntry( p, (ULONG)a->HandleIndex ) != NULL) {            //关键地方
                    Status = STATUS_SUCCESS;
                    if (ARGUMENT_PRESENT( Atom )) {
                        *Atom = a->Atom;
                        }
                    }
                else {
                    Status = STATUS_INVALID_HANDLE;
                    }
                }
            }
        }
    except (EXCEPTION_EXECUTE_HANDLER) {
        Status = GetExceptionCode();
        }

    RtlpUnlockAtomTable( p );

    return Status;
}

第二部分:AtomTable->ExHandleTable说明原子表也是个句柄表


PRTL_ATOM_TABLE_ENTRY
RtlpAtomMapAtomToHandleEntry(
    IN PRTL_ATOM_TABLE AtomTable,
    IN ULONG HandleIndex
    )
{
#if defined(NTOS_KERNEL_RUNTIME)
    PHANDLE_TABLE_ENTRY ExHandleEntry;
    PRTL_ATOM_TABLE_ENTRY a;
    EXHANDLE ExHandle;

    ExHandle.GenericHandleOverlay = 0;
    ExHandle.Index = HandleIndex;

    ExHandleEntry = ExMapHandleToPointer( AtomTable->ExHandleTable,
                                          ExHandle.GenericHandleOverlay
                                        );


typedef struct _EXHANDLE {

    union {

        struct {

            //
            //  Application available tag bits
            //

            ULONG TagBits : 2;

            //
            //  The handle table entry index
            //

            ULONG Index : 30;

        };

        HANDLE GenericHandleOverlay;

#define HANDLE_VALUE_INC 4 // Amount to increment the Value to get to the next handle

        ULONG_PTR Value;
    };

} EXHANDLE, *PEXHANDLE;


1: kd> t
nt!RtlLookupAtomInAtomTable+0xc9:
80d51ca1 e862f6ffff      call    nt!RtlpAtomMapAtomToHandleEntry (80d51308)
1: kd> t
nt!RtlpAtomMapAtomToHandleEntry:
80d51308 55              push    ebp
1: kd> dv
      AtomTable = 0xe13d6010
    HandleIndex = 0x1f


第三部分:

NTKERNELAPI
PHANDLE_TABLE_ENTRY
ExMapHandleToPointer (
    IN PHANDLE_TABLE HandleTable,
    IN HANDLE Handle
    )
{
    EXHANDLE LocalHandle;
    PHANDLE_TABLE_ENTRY HandleTableEntry;

    PAGED_CODE();

    LocalHandle.GenericHandleOverlay = Handle;

    if ((LocalHandle.Index & (LOWLEVEL_COUNT - 1)) == 0) {
        return NULL;
    }

    //
    //  Translate the input handle to a handle table entry and make
    //  sure it is a valid handle.
    //

    HandleTableEntry = ExpLookupHandleTableEntry( HandleTable,
                                                  LocalHandle );

1: kd> t
nt!RtlpAtomMapAtomToHandleEntry+0x11:
80d51319 e89e030600      call    nt!ExMapHandleToPointer (80db16bc)
1: kd> t
nt!ExMapHandleToPointer:
80db16bc 55              push    ebp
1: kd> dv
    HandleTable = 0xe140afb8
         Handle = 0x0000007c


第四部分:

PHANDLE_TABLE_ENTRY
ExpLookupHandleTableEntry (
    IN PHANDLE_TABLE HandleTable,
    IN EXHANDLE tHandle
    )

1: kd> dv
    HandleTable = 0xe140afb8
        tHandle = struct _EXHANDLE
1: kd> dx -r1 ((ntkrnlmp!_HANDLE_TABLE *)0xe140afb8)
((ntkrnlmp!_HANDLE_TABLE *)0xe140afb8)                 : 0xe140afb8 [Type: _HANDLE_TABLE *]
    [+0x000] TableCode        : 0xe140d000 [Type: unsigned long]
    [+0x004] QuotaProcess     : 0x0 [Type: _EPROCESS *]
    [+0x008] UniqueProcessId  : 0x1cc [Type: void *]
    [+0x00c] HandleTableLock  [Type: _EX_PUSH_LOCK [4]]
    [+0x01c] HandleTableList  [Type: _LIST_ENTRY]
    [+0x024] HandleContentionEvent [Type: _EX_PUSH_LOCK]
    [+0x028] DebugInfo        : 0x0 [Type: _HANDLE_TRACE_DEBUG_INFO *]
    [+0x02c] ExtraInfoPages   : 0 [Type: long]
    [+0x030] FirstFree        : 0x90 [Type: unsigned long]
    [+0x034] LastFree         : 0x0 [Type: unsigned long]
    [+0x038] NextHandleNeedingPool : 0x800 [Type: unsigned long]
    [+0x03c] HandleCount      : 35 [Type: long]                //一共35个句柄0x23
    [+0x040] Flags            : 0x0 [Type: unsigned long]
    [+0x040 ( 0: 0)] StrictFIFO       : 0x0 [Type: unsigned char]

1: kd> dv
    HandleTable = 0xe140afb8
        tHandle = struct _EXHANDLE
1: kd> dx -r1 (*((ntkrnlmp!_EXHANDLE *)0xb9f32678))
(*((ntkrnlmp!_EXHANDLE *)0xb9f32678))                 [Type: _EXHANDLE]
    [+0x000 ( 1: 0)] TagBits          : 0x0 [Type: unsigned long]
    [+0x000 (31: 2)] Index            : 0x1f [Type: unsigned long]
    [+0x000] GenericHandleOverlay : 0x7c [Type: void *]
    [+0x000] Value            : 0x7c [Type: unsigned long]


1: kd> dt HANDLE_TABLE_ENTRY 0xe140d000
ntdll!HANDLE_TABLE_ENTRY
   +0x000 Object           : (null)
   +0x000 ObAttributes     : 0
   +0x000 InfoTable        : (null)
   +0x000 Value            : 0
   +0x004 GrantedAccess    : 0xfffffffe
   +0x004 GrantedAccessIndex : 0xfffe
   +0x006 CreatorBackTraceIndex : 0xffff
   +0x004 NextFreeTableEntry : 0n-2
1: kd> dt HANDLE_TABLE_ENTRY 0xe140d000+8*1f
ntdll!HANDLE_TABLE_ENTRY
   +0x000 Object           : 0xe194ebd1 Void
   +0x000 ObAttributes     : 0xe194ebd1
   +0x000 InfoTable        : 0xe194ebd1 _HANDLE_TABLE_ENTRY_INFO
   +0x000 Value            : 0xe194ebd1
   +0x004 GrantedAccess    : 0
   +0x004 GrantedAccessIndex : 0
   +0x006 CreatorBackTraceIndex : 0
   +0x004 NextFreeTableEntry : 0n0

第五部分: +0x000 Value            : 0xe194ebd1    转换为ntdll!_RTL_ATOM_TABLE_ENTRY结构

1: kd> dt ntdll!_RTL_ATOM_TABLE_ENTRY 0xe194ebd0
   +0x000 HashLink         : (null)
   +0x004 HandleIndex      : 0x1f
   +0x006 Atom             : 0xc01f
   +0x008 ReferenceCount   : 1
   +0x00a Flags            : 0 ''
   +0x00b NameLength       : 0x14 ''
   +0x00c Name             : [1] 0x43
1: kd> dx -id 0,0,896d1020 -r1 (*((ntdll!unsigned short (*)[1])0xe194ebdc))
(*((ntdll!unsigned short (*)[1])0xe194ebdc))                 [Type: unsigned short [1]]
    [0]              : 0x43 [Type: unsigned short]
1: kd> db 0xe194ebdc
e194ebdc  43 00 41 00 64 00 64 00-72 00 65 00 73 00 73 00  C.A.d.d.r.e.s.s.
e194ebec  43 00 6f 00 6d 00 62 00-6f 00 45 00 78 00 5f 00  C.o.m.b.o.E.x._.
e194ebfc  54 00 68 00 69 00 73 00-00 00 54 89 09 06 09 0c  T.h.i.s...T.....

相关文章:

RtlLookupAtomInAtomTable函数分析之RtlpAtomMapAtomToHandleEntry函数的作用是验证其正确性

第一部分: NTSTATUS RtlLookupAtomInAtomTable( IN PVOID AtomTableHandle, IN PWSTR AtomName, OUT PRTL_ATOM Atom OPTIONAL ) { NTSTATUS Status; PRTL_ATOM_TABLE p (PRTL_ATOM_TABLE)AtomTableHandle; PRTL_ATOM_TABLE_ENTRY a; …...

Python----数据分析(Matplotlib五:pyplot的其他函数,Figure的其他函数, GridSpec)

一、pyplot的其他函数 1.1、xlabel 在matplotlib中, plt.xlabel() 函数用于为当前活动的坐标轴(Axes)设置x轴的 标签。当你想要标识x轴代表的数据或单位时,这个函数非常有用。 plt.xlabel(xlabel text) 1.2、ylabel 在matplotl…...

C语言——链表

大神文献:https://blog.csdn.net/weixin_73588765/article/details/128356985 目录 一、链表概念 1. 什么是链表? 1.1 链表的构成 2. 链表和数组的区别 数组的特点: 链表的特点: 二者对比: 二…...

使用免费IP数据库离线查询IP归属地

一、准备工作 1.下载免费IP数据库 首先,访问 MaxMind官网(https://www.maxmind.com/en/home)如果你还没有MaxMind账号,可以通过此链接地址(https://www.maxmind.com/en/geolite2/signup)进行账号注册&…...

MySQL(单表)知识点

文章目录 1.数据库的概念2.下载并配置MySQL2.1初始化MySQL的数据2.2注册MYSQL服务2.3启动MYSQL服务2.4修改账户默认密码2.5登录MYSQL2.6卸载MYSQL 3.MYSQL数据模型3.1连接数据库 4.SQL简介4.1SQL的通用语法4.2SQL语句的分类4.3DDL语句4.3.1数据库4.3.2表(创建,查询,修改,删除)4…...

1.15-16-17-18迭代器与生成器,函数,数据结构,模块

目录 15,Python3 迭代器与生成器15-1 迭代器15-1-1 基础知识15-1-2 迭代器与for循环工作原理 15-2 生成器(本质就是迭代器)15-2-1 yield 表达式15-2-2 三元表达式15-2-3 列表生成式15-2-4 其他生成器(——没有元祖生成式——&…...

window下的docker内使用gpu

Windows 上使用 Docker GPU需要进行一系列的配置和步骤。这是因为 Docker 在 Windows 上的运行环境与 Linux 有所不同,需要借助 WSL 2(Windows Subsystem for Linux 2)和 NVIDIA Container Toolkit 来实现 GPU 的支持。以下是详细的流程: 一、环境准备 1.系统要求 Window…...

CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现

文章目录 CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.构造POC2.复现CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现 0x01 前言 免责声明:请勿利用文章内的相…...

DR和BDR的选举规则

在 OSPF(开放最短路径优先)协议中,DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 的选举是为了在广播型网络(如以太网…...

Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

第七课:Python反爬攻防战:Headers/IP代理与验证码

在爬虫开发过程中,反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制,并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码,帮助读者更好地理解和…...

MySql的安装及数据库的基本操作命令

1.MySQL的安装 1.1进入MySQL官方网站 1.2点击下载 1.3下拉选择MySQL社区版 1.4选择你需要下载的版本及其安装的系统和下载方式 直接安装以及压缩包 建议选择8.4.4LST LST表明此版本为长期支持版 新手建议选择红框勾选的安装方式 1.5 安装包下载完毕之后点击安装 2.数据库…...

VsCode导入时选择相对路径

自动导入时总是以db://开头了,而我们通常需要的是相对路径,对VsCode进行如下设置: 打开 VSCode 设置: 使用快捷键 Ctrl ,(Windows/Linux)或 Cmd ,(Mac)。 或者在菜单栏中选择 …...

计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量

一、引言 在科技快速发展的背景下,3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域,车辆需实时、准确感知周围环境中的目标物体,如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…...

创新监管,保障生产安全

在现代工业生产中,电气焊作业是不可或缺的一环,但同时也伴随着一定的安全风险。为了提高焊接作业的安全性,迪格特电子科技有限公司开发了电气焊安全作业管理平台,该平台通过智能化监管系统,实现了对焊机联网的全面监管…...

深入解析 C# 中的泛型:概念、用法与最佳实践

C# 中的 泛型(Generics) 是一种强大的编程特性,允许开发者在不预先指定具体数据类型的情况下编写代码。通过泛型,C# 能够让我们编写更灵活、可重用、类型安全且性能优良的代码。泛型广泛应用于类、方法、接口、委托、集合等多个方…...

AI数字人源码开发---SaaS化源码部署+PC+小程序一体化

#数字人#数字人分身#123数字人#数字人分身源码部署搭建 AI数字人源码开发步骤 确定功能需求:首先确定需要实现的功能和特性,包括语音识别、自然语言处理、人脸识别等功能。这些功能将构成AI数字人的核心功能。 开发AI数字人源码:使用合适的…...

Mysql-经典故障案例(1)-主从同步由于主键问题引发的故障

故障报错 Could not execute Write_rows event on table test.users; Duplicate entry 3 for key PRIMARY, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the events master log mysql-bin.000031, end_log_pos 329 这是由于从库存在与主库相同主键值&#xff0c…...

ElasticSearch 分词器介绍及测试:Standard(标准分词器)、English(英文分词器)、Chinese(中文分词器)、IK(IK 分词器)

ElasticSearch 分词器介绍及测试:Standard(标准分词器)、English(英文分词器)、Chinese(中文分词器)、IK(IK 分词器) ElasticSearch 分词器介绍及测试1. Standard Analyz…...

​DeepSeek:如何通过自然语言生成HTML文件与原型图?

在当今快节奏的开发与设计环境中,快速生成HTML文件或原型图是每个开发者与设计师的迫切需求。虽然DeepSeek无法直接生成图片,但它却能够通过自然语言生成流程图、原型图以及交互式页面,甚至可以直接输出HTML代码。本文将详细介绍如何与DeepSe…...

【Redis】终极缓存四连杀:缓存预热、缓存击穿、缓存穿透、缓存雪崩,真的懂了吗?

🎯 前言 你有没有遇到过这种情况: 刚上线的新功能,所有用户一窝蜂冲进来,服务器被打爆?🚀(缓存预热)某个热点数据突然失效,数据库压力瞬间飙升,仿佛遭遇 DD…...

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭: Request Controller(接单员):负责处理你的点餐请求,记录你的口味、桌号等信息。Response Controller&#xff08…...

Linux网络相关内容与端口

网络相关命令 ping命令测试连接状态 wget命令:非交互式文件下载器,可以在命令行内下载网络文件 使用ctrlc可以中止下载 curl命令:可以发送http网络请求,用于文件下载、获取信息等 其实和浏览器打开网站一样,cu…...

Spring Boot + MyBatis + MySQL:快速搭建CRUD应用

一、引言 1. 项目背景与目标 在现代Web开发中,CRUD(创建、读取、更新、删除)操作是几乎所有应用程序的核心功能。本项目旨在通过Spring Boot、MyBatis和MySQL技术栈,快速搭建一个高效、简洁的CRUD应用。我们将从零开始&#xff…...

日新F1、瑞研F600P 干线光纤熔接(熔接损耗最大0.03DB)

Ⅰ. 设备特性对比与实测验证 1. 日新F1(两马达)极限参数 切割角度:必须≤0.3(双边累计误差<0.6) ▶ 实测案例:切割0.35时,损耗波动达0.05-0.08dB(超干线标准&#xff09…...

分布式网络

分布式网络(Distributed Network)指的是一种计算机网络架构,其中计算资源(计算、存储、数据处理等)分布在多个物理或逻辑上的节点上,而不是集中在单一的服务器或数据中心中。这种架构的主要目标是提高系统的…...

【招聘精英】

我们公司是一个位于石家庄的一个科技型新型技术公司。主要做人力资源、用工、科技等方面。 有意向回石家庄的或者已经在石家庄的技术大咖、软件大牛、产品大佬、UI大神可以来了解一下。 现在招聘 高级前端开发 高级java开发 其他岗位也可以联系。 有意向的朋友可以私信我。 -…...

ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件

NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…...

MongoDB用户管理和复制组

用户管理 1、建用户时,use到的库就是此用户的验证库 2、登录时必须明确指定验证库才能登录 3、通常管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库 4、如果直接登录到数据库,不进行use(示例&#xff…...

GoLang的select是什么?在什么时候场景下用

在 Go 语言中,select 是专门用于处理通道(Channel)多路复用的关键字,它可以同时监听多个通道的读写操作,并根据就绪的通道执行对应的逻辑。以下是 select 的用法和典型应用场景: 一、基本用法 select 语法…...