阅读:2392回复:10
如何根据一个irp判定发出它的进程
如何根据一个irp判定发出它的进程?用户态的进程名和核心态的进程名一样吗?如果不一样,一一对应吗?用什么函数来得到呢?
|
|
最新喜欢:![]() |
沙发#
发布于:2003-05-11 18:33
at passive irql,you can get process full path from EPROCESS,please see my routine.hope it is usful to you:
VOID IFW_GetCurrentProcessName(PUCHAR PAppName) { ULONG EProcess; ULONG Peb; ULONG ProcessParam; BOOLEAN AllDirectory=FALSE; UINT i; //Get Current Process EPROCESS // try { EProcess=(ULONG)PsGetCurrentProcess( ); if (MmIsAddressValid((PVOID)EProcess)) { //Get Current Process PEB // Peb=*(ULONG*)(EProcess+0x1B0); if(MmIsAddressValid((PVOID)Peb)) { //Get Current Process PROCESS_PARAMETERS // ProcessParam=*(ULONG*)(Peb+0x10); if(MmIsAddressValid((PVOID)ProcessParam)) { //Get Current Process UNICODE_STRING ImageFile // ANSI_STRING ansiImageFile; NTSTATUS Rc; PUNICODE_STRING uniImageFile=(PUNICODE_STRING)(ProcessParam+0x38); Rc=RtlUnicodeStringToAnsiString(&ansiImageFile,uniImageFile,TRUE); if(NT_SUCCESS(Rc)) { strncpy(PAppName,ansiImageFile.Buffer,ansiImageFile.Length); RtlFreeAnsiString(&ansiImageFile); } } } } } except(EXCEPTION_EXECUTE_HANDLER) { strcpy(PAppName,\"SYSTEM\"); } //Handle for Null... // if(strlen(PAppName)==0) { strcpy(PAppName,\"SYSTEM\"); return; } //Handle for \\\\??\\\\ImagePath // if(PAppName[0]==\'\\\\\') { UCHAR TempPath[255]; memset(TempPath,0,255); strcpy(TempPath,PAppName); strcpy(PAppName,&TempPath[4]); return; } } |
|
板凳#
发布于:2003-05-11 21:32
fossilme,大哥你是根据什么指定偏移量的? PEB这个结构是在那个头文件中定义的?多谢!
|
|
地板#
发布于:2003-05-11 22:27
可是你没有用到irp啊?她是问你怎样根据irp判断的啊/?
|
|
地下室#
发布于:2003-05-12 09:19
可是你没有用到irp啊?她是问你怎样根据irp判断的啊/? 当前进程 是不是 就是发送IRP的进程? |
|
5楼#
发布于:2003-05-12 09:30
再问:fossilme,大哥你是根据什么指定偏移量的? PEB这个结构是在那个头文件中定义的?多谢!
btw,拦截irp请求时,执行那个代码。 |
|
6楼#
发布于:2003-05-12 18:23
up2
|
|
7楼#
发布于:2007-03-06 01:19
不对啊,我取得很多时候都不准确啊,不是exeploer,就是systme阿,没有在我想要的时候取到正确的
|
|
8楼#
发布于:2007-03-08 12:37
加入以下汇编代码试试看:
_asm { mov eax,pIrp; //EAX=IRP对象指针 mov eax,[eax+50h]; //EAX=IRP对象的当前PKTHREAD mov eax,[eax+20h]; //PKTHREAD对象偏移0X20的地方是RING3应用程序的PEB cmp eax,80000000; ja exit; cmp eax,7ff00000; jb exit; mov ecx,[eax+20h]; //PID,RING3应用程序PEB偏移0X20的地方是PID mov edx,[eax+24h]; //TID,RING3应用程序PEB偏移0X20的地方是TID exit: } |
|
9楼#
发布于:2007-03-08 12:54
用语言来这样描述:
通过IRP得到内核线程对象KTHREAD的指针,然后从内核线程对象偏移0X20的地方取出PEB, 如果0X7FF00000 < PEB < 0X80000000就说明是RING3应用程序的PEB,然后从PEB偏 移0X20的地方取出PID,从PEB偏移0X24的地方取出TID。 DDK里大概是这样写: DWORD peb=*(DWORD *)(pIrp->PKTHREAD+0x20/4); if(peb > 0x7ff00000 && peb < 0x80000000) { DWORD pid=*(DWORD *)(peb+0x20/4); DWORD tid=*(DWORD *)(peb+0x24/4); } 呵呵,有些内核对象的名字不记得了! |
|
10楼#
发布于:2007-03-12 21:57
如果是tdi 的话
可以在IRP_MJ_CREATE 中调用 ULONG pid = (ULONG)PsGetCurrentProcess(); char *procName = (char*)pid + 0x1fc; 这样就得到了 发送进程的名称procName |
|