进程名的一些事

上传人:第*** 文档编号:38924868 上传时间:2018-05-09 格式:DOC 页数:5 大小:41KB
返回 下载 相关 举报
进程名的一些事_第1页
第1页 / 共5页
进程名的一些事_第2页
第2页 / 共5页
进程名的一些事_第3页
第3页 / 共5页
进程名的一些事_第4页
第4页 / 共5页
进程名的一些事_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《进程名的一些事》由会员分享,可在线阅读,更多相关《进程名的一些事(5页珍藏版)》请在金锄头文库上搜索。

1、Whats in a (Process) Name? Obtaining A Useful Name for the Executable Image in a Process The NT Insider, Vol 13, Issue 4, July - August 2006 | Published: 19-Sep-06| Modified: 19-Sep-06 声明:原文来自 ,所有权利归原作者所有,翻译并贴在这里的目 的只为学习和交流,除了商用你可以随意地使用这篇译文。但请不要删除声明。by jununfly 版本:20090203有些开发者需要或想要知道给定进程中正在执行的镜像的名。

2、传统上,通常都是用PsGetProcessImageFile Name 来达到这个目的的,它返回 Windows OS 用于维护每进程状态信息的 EPROCESS 结构中的一个域的内容。如我们从本地调试器信息中看到的(图 1),进程的镜像文件比 EPROCESS 结构中的一个域稍大一些。注意 EPROCESS 地址在 EBP+8 中,先整它 它也是此函数唯一的参数.Connected to Windows XP 2600 x86 compatible target, ptr64 FALSESymbol search path is: srv*c:symbolswebsymbols*http:/

3、 search path is:*WARNING: Local kernel debugging requires booting with /debug to work optimally.*Windows XP Kernel Version 2600 (Service Pack 2) MP (2 procs) Free x86 compatibleProduct: winNt, suite: Terminalserver SingleUserTSBuilt by: 2600.xpsp_sp2_gdr.050301-1519Kernel base = 0x804d7000 PsLoadedM

4、oduleList = 0x805624a0Debug session time: Mon Aug 7 13:29:53.486 2006 (GMT-4)System Uptime: 2 days 11:08:38.140lkd .reloadConnected to Windows XP 2600 x86 compatible target, ptr64 FALSELoading Kernel Symbols.Loading User Symbols.Loading unloaded module list.* ERROR: Symbol file could not be found. D

5、efaulted to export symbols for Clkd u nt!PsGetProcessImageFileNameNt!PsGetProcessImageFileName:8050a14a 8bff mov edi,edi8050a14c 55 push ebp8050a14d 8bec mov ebp,esp8050a14f 8b4508 mov eax,dword ptr ebp+88050a152 0574010000 add eax,174h8050a157 5d pop ebp8050a158 c20400 ret 48050a15b 8bce mov ecx,es

6、i图图 1 PsGetProcessImageFileName 的本地调试信息的本地调试信息不幸的是这个方法有一些问题:尽管已知,但此函数是未公开的这个域中包含的信息极其有限。它仅包含镜像文件名的首 16(ASCII)个字符.实际上第二个问题带来的麻烦很多,因为镜像文件的名本质上意味着什么都没有。例如,以前的内核模式驱动都通过检查这个域来使它们的服务生效。最怪异的现象是服务名叫svchost.exe 的,它是一个经常骗人的公有的名。 建议建议我们建议另一个获得此信息的模式如图 2typedef NTSTATUS (*QUERY_INFO_PROCESS) (_in HANDLE Process

7、Handle,_in PROCESSINFOCLASS ProcessInformationClass,_out_bcount(ProcessInformationLength) PVOID ProcessInformation,_in ULONG ProcessInformationLength,_out_opt PULONG ReturnLength);QUERY_INFO_PROCESS ZwQueryInformationProcess;NTSTATUS GetProcessImageName(PUNICODE_STRING ProcessImageName)NTSTATUS stat

8、us;ULONG returnedLength;ULONG bufferLength;PVOID buffer;PUNICODE_STRING imageName;PAGED_CODE(); / this eliminates the possibility of the IDLE Thread/Processif (NULL = ZwQueryInformationProcess) UNICODE_STRING routineName;RtlInitUnicodeString(ZwQueryInformationProcess = (QUERY_INFO_PROCESS)MmGetSyste

9、mRoutineAddress(if (NULL = ZwQueryInformationProcess) DbgPrint(“Cannot resolve ZwQueryInformationProcessn“);/ Step one - get the size we need/status = ZwQueryInformationProcess( NtCurrentProcess(), ProcessImageFileName,NULL, / buffer0, / buffer sizeif (STATUS_INFO_LENGTH_MISMATCH != status) return s

10、tatus;/ Is the passed-in buffer going to be big enough for us? / This function returns a single contguous buffer model./bufferLength = returnedLength - sizeof(UNICODE_STRING);if (ProcessImageName-MaximumLength Length = (USHORT) bufferLength;return STATUS_BUFFER_OVERFLOW;/ If we get here, the buffer

11、IS going to be big enough for us, so / lets allocate some storage./buffer = ExAllocatePoolWithTag(PagedPool, returnedLength, ipgD);if (NULL = buffer) return STATUS_INSUFFICIENT_RESOURCES;/ Now lets go get the data/status = ZwQueryInformationProcess( NtCurrentProcess(), ProcessImageFileName,buffer,re

12、turnedLength,if (NT_SUCCESS(status) / Ah, we got what we needed/imageName = (PUNICODE_STRING) buffer;RtlCopyUnicodeString(ProcessImageName, imageName);/ free our buffer/ExFreePool(buffer);/ And tell the caller what happened./ return status;图图 2 一个新建议一个新建议这个函数自身简单易懂.它依赖于一个未公开的函数(ZwQueryInformationPro

13、cess),但注意它的副本(NtQueryInformationProcess)是公开的。为了使用一个内核内存缓冲我们需要用 Zw的那个。关键点是为了在 auditing 子系统中提供执行镜像的全路径名 Windows 总是存储这个信息。这个 API 就使用了现有的被存储的路径名。其他进程的名其他进程的名这个函数被实现为提取当前进程的进程名。不过,你能用以下两种方法中的一种来获得一个不同进程的进程名:1. 如果你有这个进程的一个句柄,你可以用那个值代替 NtCurrentProcess()宏。(注意以我们的经验,我们通常有一个进程对象而非一个进程句柄 这俩不可互换).2. 如果有一个 EPRO

14、CESS 地址,就能用 KeStackAttachProcess 或或KeUnstackDetachProcess 来绑定到进程上。此技术代价沉重,如果你需要正常地执行这个操作最好时缓存这些信息。使用第二个技术时,一定要注意返回的名是一个被缓存的名。如果原始文件的名在其被缓存之后改变了,缓存的名保持不变。换句话说,如果执行镜像被重命名了,这通常是对一个正在运行的执行来说,返回名仍是原始文件的名。这个问题并不唯一.我们已经在一些文件上发现了同类现象(例如,XP 上的 CIFS 客户端实现就这样做了).因此,针对类似事件,可能需要额外的处理比如通过一个 FSFD 来加以保护。例如,你可能遇到一个依

15、赖于知道镜像的指定名的安全产品。二中选一二中选一?还有其他选项,驱动也能跟踪进程创建或拆卸事件的注册(PsSetCreateProcessNotifyRoutine) 或镜像加载(PsSetLoadImageNotifyRoutine). PsSetCreateProcessNotifyRoutine 限制能注册使用这个 API 的驱动的数量。因为 Windows OS 中有一个固定大小的表,它可能会使此调用失败。如果失败了,驱动需要确保它能处理这样的情况。PsSetLoadImageNotifyRoutine 也有同样的限制,但是是对所有的镜像加载来说,而不仅仅是原始进程镜像。因此,它包括了驱动,DLLs,执行等

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号