- 嗨!
我打赌一个多星期了,我无法形成一个完整的图来说明如何获得内核对象列表。我的算法如下:
- 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/