在xp系统下ZwOpenProcess失败问题求助
本帖最后由 c9080 于 2017-5-5 22:30 编辑最近写了段代码发现了一个问题。
VOID TerminateProcess(WCHAR* wProcessName)
{
NTSTATUS nStatus = STATUS_SUCCESS;
HANDLE hProcess = NULL;
OBJECT_ATTRIBUTES oa = { 0 };
UNICODE_STRING usProcessName = { 0 };
RtlInitUnicodeString(&usProcessName, wProcessName);
InitializeObjectAttributes(&oa, &usProcessName,OBJ_KERNEL_HANDLE, NULL, NULL);
nStatus = ZwOpenProcess(&hProcess, GENERIC_ALL, &oa, NULL);
if (!NT_SUCCESS(nStatus))
{
KdPrint(("ZwOpenProcess fail Error:%X", nStatus));
goto END;
}
nStatus = ZwTerminateProcess(hProcess, (NTSTATUS)0);
if (!NT_SUCCESS(nStatus))
{
KdPrint(("ZwTerminateProcess fail Error:%X", nStatus));
goto END;
}
END:
if (hProcess)
{
ZwClose(hProcess);
}
return;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDri, PUNICODE_STRING pReg)
{
NTSTATUS nStatus = STATUS_SUCCESS;
KdPrint(("DriverEntry..."));
pDri->DriverUnload = Unload;
TerminateProcess(L"NOTEPAD.EXE");
return nStatus;
}
这段代码是通过名称访问目标代码,没有通过常用的PID来访问方式。
依据ZwOpenProcess Document文中:
但是在XP系统加载驱动测试发现问题如图:
通过查阅资料没有相关问题,在此求助大牛指点迷经! 本帖最后由 c9080 于 2017-5-5 22:32 编辑
+#define STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003B 本帖最后由 c9080 于 2017-5-5 22:33 编辑
我知道按照进程ID是可以成功打开目标进程,但是根据文档介绍在XP下是可以根据OBJECTNAME的方式访问,为什么我这里尝试不成功? 你看一下WRK就知道了。只能通过PID打开进程的,不能通过进程名打开进程的。 Tesla.Angela 发表于 2017-5-6 08:22
你看一下WRK就知道了。只能通过PID打开进程的,不能通过进程名打开进程的。
但是我根据WDK文档里写的In Windows Server 2003, Windows XP, and Windows 2000, the caller has the option of supplying either a client ID or an object name (but not both). If the ObjectName field of the structure pointed to by ObjectAttributes contains a non-NULL pointer to an object name, ClientId must be NULL.在XP下测试,为什么失败呢? 本帖最后由 tangptr@126.com 于 2017-5-7 00:54 编辑
请注意它说的是对象名称(Object Name)而不是映像名称(Image Name)经我测试,进程对象没有对象名称,详情请枚举一遍进程,取得EPROCESS,然后用ObQueryNameString查一下它的对象名称,或者直接看下图。
顺便附上代码:
void EnumProcessName()
{
NTSTATUS st;
ULONG i;
for(i=4;i<=0x400000;i+=4)
{
PEPROCESS txps;
st=PsLookupProcessByProcessId(i,&txps);
if(NT_SUCCESS(st) && txps)
{
ULONG lRet;
st=ObQueryNameString(txps,NULL,0,&lRet);
if(st==STATUS_INFO_LENGTH_MISMATCH)
{
POBJECT_NAME_INFORMATION ObjNameInf=ExAllocatePool(NonPagedPool,lRet);
st=ObQueryNameString(txps,ObjNameInf,lRet,&lRet);
if(NT_SUCCESS(st))
{
DbgPrint("Process:0x%p\t Name:%wZ",txps,&ObjNameInf->Name);
ExFreePool(ObjNameInf);
}
}
ObDereferenceObject(txps);
}
}
} tangptr@126.com 发表于 2017-5-7 00:49
请注意它说的是对象名称(Object Name)而不是映像名称(Image Name)经我测试,进程对象没有对象名称,详 ...
谢谢tangptr大神,受教了!
页:
[1]