根据Handle获取进程名的方法
2013-08-13 09:24
399 查看
写ZwTerminateProcess hook的时候hook到ZwTerminateProcess的参数是HANDLE ProcessHandle和NTSTATUS ExitStatus。结构如下:
NTSTATUS
ZwTerminateProcess(
IN HANDLE ProcessHandle,
IN NTSTATUS ExitStatus
);
当ProcessHandle为null的时候,表明改进程结束自身进程。当该进程结束其他进程是,ProcessHandle指向这个被结束进程的process object。为了获取被结束进程的名称,要进行以下操作。
1. 通过ObReferenceObjectByHandle获得该进程的EPROCESS指针。
2. 通过未公开函数PsGetProcessImageFileName来获取进程名称。
PsGetProcessImageFileName结构如下:
UCHAR * PsGetProcessImageFileName(
__in PEPROCESS Process
);
具体代码如下:
NTSTATUS
ZwTerminateProcess(
IN HANDLE ProcessHandle,
IN NTSTATUS ExitStatus
);
当ProcessHandle为null的时候,表明改进程结束自身进程。当该进程结束其他进程是,ProcessHandle指向这个被结束进程的process object。为了获取被结束进程的名称,要进行以下操作。
1. 通过ObReferenceObjectByHandle获得该进程的EPROCESS指针。
2. 通过未公开函数PsGetProcessImageFileName来获取进程名称。
PsGetProcessImageFileName结构如下:
UCHAR * PsGetProcessImageFileName(
__in PEPROCESS Process
);
具体代码如下:
void GetProcessNamebyHandle(HANDLE handle,PCHAR Name) { PEPROCESS Process; NTSTATUS status; char *nameptr=NULL; status = ObReferenceObjectByHandle(handle,0,NULL,KernelMode,&Process,NULL); if(!NT_SUCCESS(status)) { DbgPrint("GetProcessNamebyHandle failed\n"); strcpy(nameptr,"Unkown"); return; } //KdPrint(("Process:%x\n",Process)); nameptr =PsGetProcessImageFileName(Process); strncpy(Name,nameptr,PROCNAMELEN); Name[PROCNAMELEN]=0x00; return; }
FakedZwTerminateProcess代码如下:
NTSTATUS FakedZwTerminateProcess(IN HANDLE ProcessHandle,
IN NTSTATUS ExitStatus) { char aProcessName[PROCNAMELEN]; char killedProName[PROCNAMELEN]; NTSTATUS status; status = RealZwTerminateProcess(ProcessHandle, ExitStatus); if(NT_SUCCESS(status)&&NT_SUCCESS(ExitStatus)) { GetProcessName(aProcessName); if(ProcessHandle==NULL) { strncpy(killedProName,aProcessName,sizeof(aProcessName)); } else { GetProcessNamebyHandle(ProcessHandle,killedProName); } sprintf(output,"TerminateProcess: %s --> %s\n",aProcessName,killedProName); KdPrint(("%s\n",output)); } return status; }
其中GetProcessName(aProcessName)函数是获取调用ZwTerminateProcess的当前进程。
相关文章推荐
- 根据Handle获取进程名的方法
- 根据进程结合GetModuleHandle获取当前主模块句柄
- 根据进程结合GetModuleHandle获取当前主模块的句柄
- shell获取进程ID的方法
- 获取JAVA当前进程PID的两种方法
- paip. C#.NET循环获取不同随机数的方法根据时间
- CMD魔法堂:获取进程路径和PID值的方法集
- delphi根据进程ID获取进程路径
- Windows下获取Dump文件以及进程下各线程调用栈的方法总结
- Windows黑客基础(2):获取其他进程的HANDLE
- 【进程处理】2,枚举进程方法二,可获取进程用户名等
- 根据sessionid获取session的被Servlet2.1抛弃getsession方法的解决方案
- 获取Linux进程运行在哪个CPU内核上面的方法
- 内核驱动程序中获取当前用户进程的进程名的一种方法
- Shell脚本中获取进程ID的方法
- JQuery中根据属性或属性值获得元素(6种情况获取方法)
- delphi 获取其他进程句柄的几种方法
- 根据获取Enum名获取对应的值通用方法(仅限值为int的)
- Android根据经纬度获取城市名的方法
- 根据WSDL的URL来获取服务中的所有方法