1
  • 你好!

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

  • 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吗?感谢您的帮助

4

1 回答 1

2

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

正如安德鲁所说,你根本没有初始化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);
}
于 2014-05-21T20:50:41.027 回答