博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ring0句柄表遍历
阅读量:7244 次
发布时间:2019-06-29

本文共 2101 字,大约阅读时间需要 7 分钟。

NTSTATUS ScanProcessHandleTable(PEPROCESS EProcess)

{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PHANDLE_TABLE HandleTable = NULL;
PVOID TableCode = NULL;
ULONG Flag = 0;
if (EProcess==NULL)
{
return Status;
}

HandleTable = (PHANDLE_TABLE)(*((ULONG*)((UINT8*)EProcess + _HANDLE_TABLE_OFFSET_EPROCESS)));//windbg调试可以看到

if (HandleTable==NULL)
{
return Status;
}

TableCode = HandleTable->TableCode;

TableCode = (ULONG)TableCode & 0xFFFFFFFC;//与的结果是0 是第一个表 以此类推
Flag = (ULONG)(HandleTable->TableCode) & 0x03; //00 01 10 11
switch (Flag)
{
case 0:
{
EnumTable0(TableCode);
break;
}
case 1:
{
EnumTable1(TableCode);
break;
}
case 2:
{
EnumTable2(TableCode);
break;
}
case 3:
{
EnumTable3(TableCode);
break;
}
}
}

NTSTATUS EnumTable0(PVOID TableCode)

{
PHANDLE_TABLE_ENTRY HandleTableEntry = NULL;
ULONG i = 0;
HandleTableEntry = (PHANDLE_TABLE_ENTRY)((ULONG*)((UINT8*)TableCode + _FFFFFFFE));
for (i = 0; i<_MAX; i++)
{
if (MmIsAddressValid((PVOID)HandleTableEntry)) //判断该虚拟内存是否合法
{
PVOID ObjectHeader = (PVOID)((ULONG)(HandleTableEntry->Object) & 0xFFFFFFF8);//这样得对象头
if (MmIsAddressValid(ObjectHeader))
{
DbgPrint("ObjectHeader:%p\r\n",ObjectHeader);
PVOID ObjectBody = (PVOID)((UINT8*)ObjectHeader + _BODY_OFFSET_OBJECT_HEADER);//加0x18就是对象体的位置
if (MmIsAddressValid(ObjectBody)) //这里应当判断对象是否合法
{
DbgPrint("Object:%p\r\n", ObjectBody);
__ObjectCount++;
}
}
}
HandleTableEntry++; //结构体指针++ 一加一个结构体
}
return STATUS_SUCCESS;
}

NTSTATUS EnumTable1(PVOID TableCode)

{
do
{
EnumTable0(*(ULONG*)TableCode);
(UINT8*)TableCode += sizeof(ULONG);

} while (*(ULONG*)TableCode != 0 && MmIsAddressValid(*(ULONG*)TableCode));

return STATUS_SUCCESS;

}
NTSTATUS EnumTable2(PVOID TableCode)
{
do
{
EnumTable1(*(ULONG*)TableCode);
(UINT8*)TableCode += sizeof(ULONG);

} while (*(ULONG*)TableCode != 0 && MmIsAddressValid(*(ULONG*)TableCode));

return STATUS_SUCCESS;

}
NTSTATUS EnumTable3(PVOID TableCode)
{
do
{
EnumTable2(*(ULONG*)TableCode);
(UINT8*)TableCode += sizeof(ULONG);

} while (*(ULONG*)TableCode != 0 && MmIsAddressValid(*(ULONG*)TableCode));

return STATUS_SUCCESS;

}

转载于:https://www.cnblogs.com/L-Sunny/p/8389425.html

你可能感兴趣的文章
suse11安装测试redis
查看>>
如何使用Audition消除音乐中的人声
查看>>
mpvue开发小程序手机书店详情页封面预览问题
查看>>
1.windows下Redis安装
查看>>
ubuntu下添加程序开机自启动脚本
查看>>
02Data
查看>>
CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
查看>>
埋点测试基础篇--什么是站包
查看>>
Linux下搭建SVN服务器及自动更新项目文件到web发布目录(www)
查看>>
63ES6_数据类型_表达式
查看>>
VSFTPD配置虚拟用户 -V2
查看>>
洛谷——P3353 在你窗外闪耀的星星
查看>>
shell 脚本编程
查看>>
数据库优化工程师必看 第一部分(索引、视图)
查看>>
如何谨慎选择企业外部培训师
查看>>
nagios常见错误排查
查看>>
我的友情链接
查看>>
一、Java内存数据库实践之深入浅出Redis - Redis介绍
查看>>
学习小笔记---大话PHP设计模式
查看>>
Linux 用户态与内核态的交互-netlink
查看>>