c9080 发表于 2017-5-5 22:26:40

在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:28:27

本帖最后由 c9080 于 2017-5-5 22:32 编辑

+#define STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003B

c9080 发表于 2017-5-5 22:29:16

本帖最后由 c9080 于 2017-5-5 22:33 编辑

我知道按照进程ID是可以成功打开目标进程,但是根据文档介绍在XP下是可以根据OBJECTNAME的方式访问,为什么我这里尝试不成功?

Tesla.Angela 发表于 2017-5-6 08:22:52

你看一下WRK就知道了。只能通过PID打开进程的,不能通过进程名打开进程的。

c9080 发表于 2017-5-6 16:13:16

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:49:32

本帖最后由 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);
                }
        }
}

c9080 发表于 2017-5-7 10:06:31

tangptr@126.com 发表于 2017-5-7 00:49
请注意它说的是对象名称(Object Name)而不是映像名称(Image Name)经我测试,进程对象没有对象名称,详 ...

谢谢tangptr大神,受教了!
页: [1]
查看完整版本: 在xp系统下ZwOpenProcess失败问题求助