c - 获取内核对象窗口列表

标签 c windows winapi ntdll

  • 嗨!

我打赌一个多星期了,我无法形成一个完整的图来说明如何获得内核对象列表。我的算法如下:

  • 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,这意味着访问被阻止。

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

最佳答案

异常 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);
}

关于c - 获取内核对象窗口列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788603/

相关文章:

c - 如何使用按位运算将结构体值分配给其他结构体值?

c++ - CreateWindowEx 失败

c# - 使用 C# 禁用窗口的动画效果

c++ - 获取上次激活窗口的窗口句柄

C - 如何输入字符串并将其插入到字符串数组中?

c - C语言中blank是怎么定义的?

c - 是否可以在 C 中使用指针数学访问结构中的数据?

wpf - wnd.Show(Me) 无法在 WPF 中工作

java - 如何在 java 中的 Windows 启动时启动我的应用程序

python - 如何获取 subprocess.check_output() python 模块的输出?