找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5233|回复: 6

在xp系统下ZwOpenProcess失败问题求助

[复制链接]

8

主题

51

回帖

0

精华

银牌会员

积分
369
发表于 2017-5-5 22:26:40 | 显示全部楼层 |阅读模式
本帖最后由 c9080 于 2017-5-5 22:30 编辑

最近写了段代码发现了一个问题。
  1. VOID TerminateProcess(WCHAR* wProcessName)
  2. {
  3.         NTSTATUS nStatus = STATUS_SUCCESS;
  4.         HANDLE hProcess = NULL;
  5.         OBJECT_ATTRIBUTES oa = { 0 };
  6.         UNICODE_STRING usProcessName = { 0 };
  7.         RtlInitUnicodeString(&usProcessName, wProcessName);
  8.         InitializeObjectAttributes(&oa, &usProcessName,OBJ_KERNEL_HANDLE, NULL, NULL);
  9.         nStatus = ZwOpenProcess(&hProcess, GENERIC_ALL, &oa, NULL);
  10.         if (!NT_SUCCESS(nStatus))
  11.         {
  12.                 KdPrint(("ZwOpenProcess fail Error:%X", nStatus));
  13.                 goto END;
  14.         }
  15.         nStatus = ZwTerminateProcess(hProcess, (NTSTATUS)0);
  16.         if (!NT_SUCCESS(nStatus))
  17.         {
  18.                 KdPrint(("ZwTerminateProcess fail Error:%X", nStatus));
  19.                 goto END;
  20.         }
  21. END:
  22.         if (hProcess)
  23.         {
  24.                 ZwClose(hProcess);
  25.         }
  26.         return;
  27. }
复制代码
  1. NTSTATUS DriverEntry(PDRIVER_OBJECT pDri, PUNICODE_STRING pReg)
  2. {
  3.         NTSTATUS nStatus = STATUS_SUCCESS;
  4.         KdPrint(("DriverEntry..."));
  5.         pDri->DriverUnload = Unload;
  6.         TerminateProcess(L"NOTEPAD.EXE");
  7.         return nStatus;
  8. }
复制代码

这段代码是通过名称访问目标代码,没有通过常用的PID来访问方式。
依据ZwOpenProcess Document文中:
QQ图片20170505222219.png
但是在XP系统加载驱动测试发现问题如图:
QQ图片20170505222304.png
通过查阅资料没有相关问题,在此求助大牛指点迷经!

8

主题

51

回帖

0

精华

银牌会员

积分
369
 楼主| 发表于 2017-5-5 22:28:27 | 显示全部楼层
本帖最后由 c9080 于 2017-5-5 22:32 编辑

+#define STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003B

8

主题

51

回帖

0

精华

银牌会员

积分
369
 楼主| 发表于 2017-5-5 22:29:16 | 显示全部楼层
本帖最后由 c9080 于 2017-5-5 22:33 编辑

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

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2017-5-6 08:22:52 | 显示全部楼层
你看一下WRK就知道了。只能通过PID打开进程的,不能通过进程名打开进程的。

8

主题

51

回帖

0

精华

银牌会员

积分
369
 楼主| 发表于 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下测试,为什么失败呢?

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2017-5-7 00:49:32 | 显示全部楼层
本帖最后由 tangptr@126.com 于 2017-5-7 00:54 编辑

请注意它说的是对象名称(Object Name)而不是映像名称(Image Name)经我测试,进程对象没有对象名称,详情请枚举一遍进程,取得EPROCESS,然后用ObQueryNameString查一下它的对象名称,或者直接看下图。
捕获.JPG
顺便附上代码:
  1. void EnumProcessName()
  2. {
  3.         NTSTATUS st;
  4.         ULONG i;
  5.         for(i=4;i<=0x400000;i+=4)
  6.         {
  7.                 PEPROCESS txps;
  8.                 st=PsLookupProcessByProcessId(i,&txps);
  9.                 if(NT_SUCCESS(st) && txps)
  10.                 {
  11.                         ULONG lRet;
  12.                         st=ObQueryNameString(txps,NULL,0,&lRet);
  13.                         if(st==STATUS_INFO_LENGTH_MISMATCH)
  14.                         {
  15.                                 POBJECT_NAME_INFORMATION ObjNameInf=ExAllocatePool(NonPagedPool,lRet);
  16.                                 st=ObQueryNameString(txps,ObjNameInf,lRet,&lRet);
  17.                                 if(NT_SUCCESS(st))
  18.                                 {
  19.                                         DbgPrint("Process:0x%p\t Name:%wZ",txps,&ObjNameInf->Name);
  20.                                         ExFreePool(ObjNameInf);
  21.                                 }
  22.                         }
  23.                         ObDereferenceObject(txps);
  24.                 }
  25.         }
  26. }
复制代码

评分

参与人数 1水晶币 +100 收起 理由
Tesla.Angela + 100 赞一个!

查看全部评分

8

主题

51

回帖

0

精华

银牌会员

积分
369
 楼主| 发表于 2017-5-7 10:06:31 | 显示全部楼层
tangptr@126.com 发表于 2017-5-7 00:49
请注意它说的是对象名称(Object Name)而不是映像名称(Image Name)经我测试,进程对象没有对象名称,详 ...

谢谢tangptr大神,受教了!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表