fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:2731回复:8

Hook了ZwTerminateProcess,如何得到所要Terminae的进程的名称?

楼主#
更多 发布于:2005-01-21 09:34
我Hook了ZwTerminateProcess,当参数handle为空时,terminate的是当前进程,这种情况可以用一些现成的方法获得当前进程的name;
但是如果参数handle非空时,如何根据这handle获得ZwTerminateProcess所要terminate的进程的名称。

请高手们指点一下了,谢谢!!

最新喜欢:

agchenagchen
在交流中学习。。。
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-01-21 11:03
PsLookupProcessByProcessId()?
---内核开发合作或提供基础技术服务QQ:22863668 ---
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-21 11:15
但是那个要找的进程的ID是不知道的。
在交流中学习。。。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-21 11:43
进程handle是进程的一个索引,如何根据handle得到这个进程的ID,网上有说95下之间的关系,哪位给指点一下NT/2K系统中如何根据handle获得process ID。
在交流中学习。。。
pursuer_zhao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-21 12:52
ObQueryNameString?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
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));
在交流中学习。。。
pursuer_zhao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-21 18:47
ObQueryNameString(pProcObject,pProcName,1024,&ActualLength);

第一个参数有误吧!
按你的声明这个函数的第一参数应该是&pProcObject吧?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-24 09:39
定义确实有点问题,应该是
PVOID pProcObject;

但是该了以后,结果还是一样的:
pProcName->Length = 0;
pProcName->Buffer = NULL;

但是 ActualLength = 8;
在交流中学习。。。
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
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]
琢磨悟真知
游客

返回顶部