【问题标题】:getting a list of kernel objects windows获取内核对象窗口列表
【发布时间】:2014-07-10 09:58:03
【问题描述】:
  • 嗨!

我打赌一个多星期,我无法完整地了解如何获取内核对象列表。我的算法如下:

  • 1) 连接 NTDLL.dll (LoadLibrary)
  • 2) GetProcAddress (variable_Library_name, "NtQueryDirectoryObject") 和预告结构:_OBJDIR_INFORMATION, _OBJECT_ATTRIBUTES
  • 3) 尝试将函数 NtOpenDirectoryObject 应用于以下列表 对象

这里有一段代码负责使用函数NtOpenDirectoryObject:

 OBJDIR_INFORMATION *ssinfo  =(OBJDIR_INFORMATION* ) HeapAlloc(GetProcessHeap(), 0, 0x800);
           ///////////////////////
                    HANDLE hFile,hThread,hMapFile;
  HMODULE hNtdll ,hKernel;
  DWORD dwThreadId;
  OBJECT_ATTRIBUTES obj;
  WCHAR  * uString=L"\\BaseNamedObjects";
  UNICODE_STRING str;
  DWORD i,a,iStrLen,b=0;
  char sObjName[30],sTmp[50];
  LPVOID lpMapAddress;
  FARPROC pWinExec,pExitThread;
  bool bFound;
  char* sCommand;
            /////////////////////////////////////////////////////////////////
            NtQueryDirectoryObject = (NTQUERYDIRECTORYOBJECT )GetProcAddress(hinstLib,"NtQueryDirectoryObject");
            InitializeObjectAttributes (&obj, &str, 0, 0, 00);
            NtOpenDirectoryObject(&hFile,0x20001,&obj);

完整代码(包括结构定义)位于:http://pastebin.com/pDNb3GTn

调用带参数NtOpenDirectoryObject的函数时得到异常c0000005,表示访问被阻塞。

请告诉我,我做错了什么,我的错误在哪里。可以不使用本机api吗?谢谢你的帮助

【问题讨论】:

  • 首先,您在WCHAR* uString 中输入的名称永远不会连接到UNICODE_STRING str,因此您传递给NtOpenDirectoryObjectOBJECT_ATTRIBUTES 对象中没有名称。

标签: c windows winapi ntdll


【解决方案1】:

异常c0000005 是访问冲突。这并不意味着访问被阻止。这意味着访问了无效的内存,例如访问了 NULL/未初始化的指针,或者您未正确对齐数据并访问超出分配范围的内容。

正如 Andrew 所说,您根本没有初始化 UNICODE_STRING。试试这个:

hNtdll = LoadLibrary("ntdll.dll");
NtOpenDirectoryObject = (NTOPENDIRECTORYOBJECT) GetProcAddress(hNtdll, "NtOpenDirectoryObject");
...
if (NtOpenDirectoryObject)
{ 
    // add these three lines
    str.Length = lstrlenW(uString) * sizeof(WCHAR);  
    str.MaximumLength = str.Length; 
    str.Buffer = uString;

    InitializeObjectAttributes (&obj, &str, 0, NULL, NULL);
    NtOpenDirectoryObject(&hFile, 0x20001, &obj);
}

【讨论】:

  • Andrew, Remy,非常感谢,我真的踩到了——很少用winapi写,但是现在有一个新问题,我打开了对象目录,以及如何循环遍历所有的列表屏幕上的命名对象?我知道我需要使用另一个本机函数 - NtQueryDirectoryObject,但是如何迭代和显示所有对象 - 没有发生,因为目录很多。可以递归,但我不明白如何实现它......或者尝试另一个函数 - GetKernelObjectSecurity?非常感谢您的帮助,甚至有点不舒服...
  • Remy,非常感谢例如,我理解了逻辑,但是有这样一个问题:如何从库ntddk.h连接到我的项目函数,它没有连接这个头文件。只需要使用必要的功能,而不需要将它们连接到整个 WDK 库。例如,在这里我连接了 NTOPENDIRECTORYOBJECT:pastebin.com/1NSLBbRa。例如,是否有可能在没有 ntddk.h 和其他功能的情况下导致并声明 NTSTATUS?提前非常感谢您...
  • 当然可以。如果您没有某些东西的头文件,您将不得不在自己的代码中手动声明它。在 MSDN 中搜索声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2014-01-07
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2018-05-26
  • 2014-04-30
相关资源
最近更新 更多