阅读:2733回复:8
Hook了ZwTerminateProcess,如何得到所要Terminae的进程的名称?
我Hook了ZwTerminateProcess,当参数handle为空时,terminate的是当前进程,这种情况可以用一些现成的方法获得当前进程的name;
但是如果参数handle非空时,如何根据这handle获得ZwTerminateProcess所要terminate的进程的名称。 请高手们指点一下了,谢谢!! |
|
最新喜欢:agchen
|
驱动老牛
|
沙发#
发布于:2005-01-21 11:03
PsLookupProcessByProcessId()?
|
|
板凳#
发布于:2005-01-21 11:15
但是那个要找的进程的ID是不知道的。
|
|
|
地板#
发布于:2005-01-21 11:43
进程handle是进程的一个索引,如何根据handle得到这个进程的ID,网上有说95下之间的关系,哪位给指点一下NT/2K系统中如何根据handle获得process ID。
|
|
|
地下室#
发布于:2005-01-21 12:52
ObQueryNameString?
|
|
5楼#
发布于:2005-01-21 14:28
我用ObReferenceObjectByHandle先取进程对象,然后用ObQueryNameString取进程对象的名称,结果取出来的UNICODE字符串为空,也不知道哪里出了问题。
NTSTATUS ntstatus; PVOID *pProcObject; PUNICODE_STRING pProcName; ULONG ActualLength; ntstatus = ObReferenceObjectByHandle( ProcessHandle, 0, NULL, KernelMode, (PVOID*)&pProcObject, NULL ); if(ntstatus != STATUS_SUCCESS) { return ntstatus; } pProcName = (UNICODE_STRING *)ExAllocatePool(PagedPool,1024); RtlZeroMemory(pProcName,1024); pProcName->MaximumLength = 1024; ntstatus = ObQueryNameString(pProcObject,pProcName,1024,&ActualLength); if(ntstatus != STATUS_SUCCESS) { ExFreePool(pProcName); ObDereferenceObject(pProcObject); return ntstatus; } DbgPrint(("OK.Query ProcName = %ws , Len = %d , ActualLen = %d [%x]\n", pProcName->Buffer,pProcName->Length, ActualLength, pProcObject)); |
|
|
6楼#
发布于:2005-01-21 18:47
ObQueryNameString(pProcObject,pProcName,1024,&ActualLength);
第一个参数有误吧! 按你的声明这个函数的第一参数应该是&pProcObject吧? |
|
7楼#
发布于:2005-01-24 09:39
定义确实有点问题,应该是
PVOID pProcObject; 但是该了以后,结果还是一样的: pProcName->Length = 0; pProcName->Buffer = NULL; 但是 ActualLength = 8; |
|
|
8楼#
发布于:2005-01-24 16:46
2000下我已经搞定了 :D
我在测试测试看看其他系统 NTSTATUS rc; CHAR szProcessName[32] = {0},szpn[32]={0}; PEPROCESS p=NULL; char *nameptr = NULL; rc = ObReferenceObjectByHandle(ProcessHandle,0x0001,NULL,KernelMode,(PVOID*)&p,NULL); if(NT_SUCCESS(rc)) { if( gProcessNameOffSet ) { nameptr = (PCHAR)p + gProcessNameOffSet; strncpy( szpn, nameptr, 16 ); pszImageName = szpn; // ulProcessId = p->UniqueProcessId; } else { strcpy( szpn, "???"); pszImageName = szpn; } } DbgPrint("In HookTerminateProcess Name= %s hCurrentProcessId = 0x%X hCurrentThreadId=0x%X,ProcessHandle =0x%X PV=%s \n",szProcessName,hCurrentProcessId,hCurrentThreadId,ProcessHandle,pszImageName); rc = pfnOldTerMinateProcess(ProcessHandle,status); return rc; [编辑 - 1/24/05 by wywwwl] |
|
|