(继续) 关于枚举系统中内核对象的一些问题

yxwsbobo 2010-02-09 10:33:05
NT_SUCCESS 宏是怎么定义的?

搜了半天勉强算搜到一个
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

明显和 MSDN
NT_SUCCESS(Status)
Evaluates to TRUE if the return value specified by Status is a success type (0 − 0x3FFFFFFF) or an informational type (0x40000000 − 0x7FFFFFFF).

所说的不一样

可能这个原因弄的我无法自己好好调试




关于代码 有些疑问

     // 枚举已经打开的句柄,取其名称
     HMODULE hNtDll = NULL; // nt.dll句柄
     ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
     NTQUERYOBJECT NtQueryObject = NULL;
     SYSTEM_HANDLE_INFORMATION *hInfo = NULL;
     int nNumHandle = 0, i;      // 句柄数量
     NTSTATUS Status;
     ULONG nSize, nCount;
     char cBuffer[0x40000], cInfoBuffer[0x1000];
     OBJECT_ALL_INFORMATION *pInfo;
     OBJECT_NAME_INFORMATION* pName;
     DWORD nId = GetProcessId(hProcess);


     // 取导出函数
    hNtDll = GetModuleHandle( "ntdll.dll" );
    ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( hNtDll, "ZwQuerySystemInformation" );
    NtQueryObject = ( NTQUERYOBJECT )GetProcAddress( hNtDll, "NtQueryObject" );

     // 查询句柄信息
     Status = ZwQuerySystemInformation(SystemHandleInformation,
         cBuffer,
         0x40000,
         &nSize);

     if(NT_SUCCESS(Status))
     {
         nNumHandle = *(PULONG)cBuffer;
         hInfo = (SYSTEM_HANDLE_INFORMATION*)(cBuffer + 4);
         nCount = 0;
         for(i = 0; i < nNumHandle; i++)
         {
              if(hInfo[i].ProcessId != nId) continue;
              Status = NtQueryObject(hInfo[i].Handle, ObjectAllInformation, cInfoBuffer, 0x1000, &nSize);
              if(NT_SUCCESS(Status))
              {
                   pInfo = (OBJECT_ALL_INFORMATION*)cInfoBuffer;
                   nCount++;
……………………….
              }
         }
     }



中的
hInfo[i].ObjectTypeNumber
也就是
引用
ObjectTypeNumber
A number which identifies the type of object to which the handle refers.The number
can be translated to a name by using the information returned by ZwQueryObject.

这是一个handle所指向的对象的类型对应的数?莫非就是内核对象类型?使用 ZwQueryObject 可以把数转换成名字,可我查了一下
引用
If the call to the ZwQueryObject function occurs in user mode, you should use the name "NtQueryObject" instead of "ZwQueryObject".

NtQueryObject其实就是用户模式下的ZwQueryObject ,而NtQueryObject马上就能见到,这个ObjectTypeNumber准确的说是什么啊

引用
Status = NtQueryObject(hInfo[i].Handle, ObjectAllInformation, cInfoBuffer, 0x1000, &nSize);

这里我估计写错了, 测试发现这里的hInfo[i].Handle 总是4*n(n>0) 也就是4的倍数,
或者说
hInfo[i].ProcessId 是4的时候
hInfo[i].Handle 从4,8,12 ..... max

然后
hInfo[i].ProcessId 会变成 260
hInfo[i].Handle 从 刚才的max 又编程4 然后增加到 OtherMax

NtQueryObject 应该是查询一个内核对象,我认为第一个参数不应该是这样的 不知道说的对不?




...全文
986 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxwsbobo 2010-02-10
  • 打赏
  • 举报
回复
引用 27 楼 tr0j4n 的回复:
NumberOfObjectsTypes成员为所有的对象类型在ObjectTypeInformation数组中的计数



和我想的一样,可是矛盾出来了,我们现在是查询的一个对象的数据

ntStatus = pfnNtQueryObject((HANDLE)pSysHandleInfo[i].Handle,ObjectAllInformation, cInfoBuffer,0x10000,&ulSize);


ObjectTypeInformation数组中 有NumberOfObjectsTypes 个类型,有什么用? 难道一个内核对象可能有多种类型吗?
MoXiaoRab 2010-02-10
  • 打赏
  • 举报
回复
引用 22 楼 yxwsbobo 的回复:
C/C++ code
ntStatus= pfnNtQueryObject((HANDLE)pSysHandleInfo[i].Handle,ObjectAllInformation,
cInfoBuffer,0x10000,&ulSize);

估计这次真的是最后一个问题了,瞌睡就去睡吧~~

这个函数 查询一个内核对象的所有信息

结果是
pAllInfo = (POBJECT_ALL_INFORMATION)cInfoBuffer;


可pAllInfo.NumberOfObjectsTypes  是什么?  不是一个内核对象吗? 那么内核对象类型应该只有一种啊,为什么有这个?他说的是什么意思

NumberOfObjectsTypes成员为所有的对象类型在ObjectTypeInformation数组中的计数
yxwsbobo 2010-02-10
  • 打赏
  • 举报
回复
另外 再公布意见事

果然我猜的是对的。。。。 这次是真的对的。。。。 有确凿证据



被调用函数

HANDLE GetProcessKernelObject(DWORD ProcessId)
{

HMODULE hNtDll = NULL;
ZWQUERYSYSTEMINFORMATION pfnZwQuerySystemInformation = NULL;
NTQUERYOBJECT pfnNtQueryObject = NULL;
PSYSTEM_HANDLE_INFORMATION pSysHandleInfo = NULL;
POBJECT_ALL_INFORMATION pAllInfo =NULL;
POBJECT_NAME_INFORMATION pNameInfo = NULL;


ULONG nNumberHandle =0;
NTSTATUS ntStatus = 0;
ULONG ulSize,ulCount;
char cBuffer[0x80000],cInfoBuffer[0x10000];

hNtDll = GetModuleHandle(TEXT("ntdll.dll"));
pfnZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(hNtDll,"ZwQuerySystemInformation");
pfnNtQueryObject = (NTQUERYOBJECT)GetProcAddress(hNtDll,"NtQueryObject");

ntStatus = pfnZwQuerySystemInformation(SystemHandleInformation,cBuffer,0x80000,&ulSize);

if(NT_SUCCESS(ntStatus))
{
DWORD n = ulSize/sizeof(SYSTEM_HANDLE_INFORMATION);
nNumberHandle = *(PULONG)cBuffer;
pSysHandleInfo = (PSYSTEM_HANDLE_INFORMATION)(cBuffer +4);
ulCount = 0;

for(ULONG i=0;i!=nNumberHandle;++i)
{

if(pSysHandleInfo[i].ProcessId != ProcessId)
continue;


ntStatus = pfnNtQueryObject((HANDLE)pSysHandleInfo[i].Handle,ObjectAllInformation,cInfoBuffer,0x10000,&ulSize);
ntStatus = pfnNtQueryObject((HANDLE)pSysHandleInfo[i].Handle,ObjectNameInformation,cInfoBuffer,0x10000,&ulSize);
if(NT_SUCCESS(ntStatus))
{
pAllInfo = (POBJECT_ALL_INFORMATION)cInfoBuffer;
pNameInfo = (POBJECT_NAME_INFORMATION)cInfoBuffer;
if(_tcsstr(pNameInfo->NameBuffer,TEXT("QQ")) !=NULL)
{
MessageBox(NULL,pNameInfo->NameBuffer,TEXT("发现"),NULL);
}
}
}
}
return NULL;
}


调用方式
GetProcessKernelObject(4636);//4636是QQGAME的进程


在自己的程序中调用这个函数后 没有任何反应,但如果注入到QQGAME里面再调用这个 会弹出5个对话框,其中有我要的QQGame_Mutex0x/01/2003

这绝对能证明
我猜测 NtQueryObject 接受的第一个参数是 当前进程的内核对象句柄




这样的话 就对这几个函数有较为深刻的认识了 恩~~~~ 天黑了 睡觉~
yxwsbobo 2010-02-10
  • 打赏
  • 举报
回复

ntStatus = pfnNtQueryObject((HANDLE)pSysHandleInfo[i].Handle,ObjectAllInformation,
cInfoBuffer,0x10000,&ulSize);


估计这次真的是最后一个问题了,瞌睡就去睡吧~~

这个函数 查询一个内核对象的所有信息

结果是
pAllInfo = (POBJECT_ALL_INFORMATION)cInfoBuffer;


可pAllInfo.NumberOfObjectsTypes 是什么? 不是一个内核对象吗? 那么内核对象类型应该只有一种啊,为什么有这个?他说的是什么意思

haze_1111 2010-02-10
  • 打赏
  • 举报
回复
先mark一下~~~~~~~~
yxwsbobo 2010-02-10
  • 打赏
  • 举报
回复
引用 24 楼 wineggdrop 的回复:
NtQueryObject第一个参数是要得到信息的对象句柄,如果这个对象句柄并不属于当前进程的话,你要使用DuplicateHandle()等先处理才有效。


谢谢,看书的时候这个函数还真看的不打明白


Windows核心编程有如下解释:

该函数最常见额一种用法可能涉及系统中同时运行的3个不同的进程,调用DuplicateHandle时,它的第一个参数和第三个参数(hSourceProcessHandle and hTargetProcessHandle)是内核对象句柄,这2个句柄本身必须相对与调用DuplicateHandle函数的那个进程(此句我不太明白,这样的话不就是必须有3个进程了?前面为什么还了个大多?)此外这2个参数的标识符必须是进程内核对象,传递其他内核对象,函数调用失败
WinEggDrop 2010-02-10
  • 打赏
  • 举报
回复
NtQueryObject第一个参数是要得到信息的对象句柄,如果这个对象句柄并不属于当前进程的话,你要使用DuplicateHandle()等先处理才有效。
MoXiaoRab 2010-02-10
  • 打赏
  • 举报
回复
这个值一般为0或1
MoXiaoRab 2010-02-09
  • 打赏
  • 举报
回复
可以。用ZwClose吧。
CloseHandle有的时候不行

注意提下Debug权限
yxwsbobo 2010-02-09
  • 打赏
  • 举报
回复
引用 8 楼 sjdev 的回复:
NtQueryObject 接受的第一个参数:
The handle of the object for which information is being queried.



恩 我知道他的功能是查询第一个参数指向的内核对象 的信息的

我弄错的是另一个地方

由于我刚开始缓冲区不够,得到的信息也有问题,以这个错误的信息自然弄的我莫名其妙了。。





这样的话,hInfo[i].Handle所得到的句柄,就是指向 这个进程内的内核对象并且不会增加使用记数
TO Tr0j4n LastQs:
不注入到目标进程 直接 CloseHandle(hInfo[i].Handle) 可以不,这个关系到对 hInfo[i].Handle的理解
yxwsbobo 2010-02-09
  • 打赏
  • 举报
回复
事实证明我又错了。。。


不同进程的 HANDLE)pSysHandleInfo[i].Handle 也不同 恩


不错 你是对的。。。。

不过有一点挺奇怪

HANDLE 是 VOID* 应该是4字节 但是 pSysHandleInfo[i].Handle 却只有2字节。。
MoXiaoRab 2010-02-09
  • 打赏
  • 举报
回复
引用 17 楼 yxwsbobo 的回复:
吃分的感觉很爽啊???


那么多分了又不缺分  想要分 自己拿个小号问问题不就好了嘛~~~~ 


事实证明有一点我说对了

我猜测 NtQueryObject 接受的第一个参数是 当前进程的内核对象句柄?

当我在进程ID中输入 QQ游戏大厅的进程ID 和迅雷进程的ID

NtQueryObject((HANDLE)pSysHandleInfo[i].Handle,ObjectNameInformation,cInfoBuffer,0x10000,&ulSize);
得到的名字字符串 前6个是一模一样的,其中包括本代码所在的程序中的字符串 后面的没测试我估计也一样

那就是倒分了。

分代表别人对我的认可,和自己倒分没意思的
yxwsbobo 2010-02-09
  • 打赏
  • 举报
回复
吃分的感觉很爽啊???


那么多分了又不缺分 想要分 自己拿个小号问问题不就好了嘛~~~~


事实证明有一点我说对了

我猜测 NtQueryObject 接受的第一个参数是 当前进程的内核对象句柄?

当我在进程ID中输入 QQ游戏大厅的进程ID 和迅雷进程的ID

NtQueryObject((HANDLE)pSysHandleInfo[i].Handle,ObjectNameInformation,cInfoBuffer,0x10000,&ulSize);
得到的名字字符串 前6个是一模一样的,其中包括本代码所在的程序中的字符串 后面的没测试我估计也一样
MoXiaoRab 2010-02-09
  • 打赏
  • 举报
回复
呵呵。等着你结贴呢。我今天得谢谢你
yxwsbobo 2010-02-09
  • 打赏
  • 举报
回复
OK 3Q~~


我增加了一倍 从 0x40000 变成 0x80000 OK了~~~



我先研究研究在结贴~~
yxwsbobo 2010-02-09
  • 打赏
  • 举报
回复
引用 10 楼 tr0j4n 的回复:
看返回值是不是STATUS_INFO_LENGTH_MISMATCH,可能是缓冲区长度不够



对 就是长度不够 我再弄长点试试
MoXiaoRab 2010-02-09
  • 打赏
  • 举报
回复
引用 11 楼 yxwsbobo 的回复:
找到原因了 相同的代码 放在虚拟机上 XP 可以运行良好


悲剧

什么原因?你什么系统?居然不能运行?
MoXiaoRab 2010-02-09
  • 打赏
  • 举报
回复
进不去的话,Status=?
yxwsbobo 2010-02-09
  • 打赏
  • 举报
回复
找到原因了 相同的代码 放在虚拟机上 XP 可以运行良好


悲剧
MoXiaoRab 2010-02-09
  • 打赏
  • 举报
回复
看返回值是不是STATUS_INFO_LENGTH_MISMATCH,可能是缓冲区长度不够
加载更多回复(9)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧