athank
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望50点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2392回复:10

如何根据一个irp判定发出它的进程

楼主#
更多 发布于:2003-05-11 15:11
如何根据一个irp判定发出它的进程?用户态的进程名和核心态的进程名一样吗?如果不一样,一一对应吗?用什么函数来得到呢?

最新喜欢:

alenyangalenya...
fossilme
驱动牛犊
驱动牛犊
  • 注册日期2003-01-24
  • 最后登录2011-01-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望16点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
}
}


Newandold
驱动牛犊
驱动牛犊
  • 注册日期2003-01-10
  • 最后登录2004-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-11 21:32
fossilme,大哥你是根据什么指定偏移量的? PEB这个结构是在那个头文件中定义的?多谢!
x_j_ting
驱动牛犊
驱动牛犊
  • 注册日期2003-03-30
  • 最后登录2005-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-11 22:27
 可是你没有用到irp啊?她是问你怎样根据irp判断的啊/?
Jamine0101111
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2003-08-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-12 09:19
可是你没有用到irp啊?她是问你怎样根据irp判断的啊/?


当前进程 是不是 就是发送IRP的进程?


Newandold
驱动牛犊
驱动牛犊
  • 注册日期2003-01-10
  • 最后登录2004-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-12 09:30
再问:fossilme,大哥你是根据什么指定偏移量的? PEB这个结构是在那个头文件中定义的?多谢!


btw,拦截irp请求时,执行那个代码。
Newandold
驱动牛犊
驱动牛犊
  • 注册日期2003-01-10
  • 最后登录2004-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-12 18:23
up2
guobing_xu
驱动牛犊
驱动牛犊
  • 注册日期2007-01-15
  • 最后登录2007-03-26
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-03-06 01:19
不对啊,我取得很多时候都不准确啊,不是exeploer,就是systme阿,没有在我想要的时候取到正确的
gxmgf
驱动牛犊
驱动牛犊
  • 注册日期2003-10-17
  • 最后登录2007-03-08
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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:

}
gxmgf
驱动牛犊
驱动牛犊
  • 注册日期2003-10-17
  • 最后登录2007-03-08
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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);
}

呵呵,有些内核对象的名字不记得了!
liuguidong123
驱动牛犊
驱动牛犊
  • 注册日期2005-06-24
  • 最后登录2009-03-19
  • 粉丝0
  • 关注0
  • 积分227分
  • 威望27点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-03-12 21:57
如果是tdi 的话
可以在IRP_MJ_CREATE 中调用
ULONG        pid       = (ULONG)PsGetCurrentProcess();
char        *procName = (char*)pid + 0x1fc;

这样就得到了 发送进程的名称procName
游客

返回顶部