首页
社区
课程
招聘
[分享]64位驱动取当前进程的全路径
发表于: 2011-12-25 05:33 7751

[分享]64位驱动取当前进程的全路径

2011-12-25 05:33
7751
#if DBG
#define dprintf DbgPrint
#else
#define dprintf
#endif
PCWSTR GetCurrentProcessPathName(void) 
{
	UNICODE_STRING imagName={0};
	RTL_OSVERSIONINFOW os={0};
	ULONG_PTR uProcessPtr;
	ULONG_PTR uImagNameAddr=NULL ;
	ULONG uPebOffset=0;
	ULONG uParamOffset=0x10;
	ULONG uImagNameOffset=0x3c;


	RtlGetVersion (&os);
	dprintf ("MajorVer=%d\tMinorVer=%d\tBuildNumber=%d\r\n",
		os.dwMajorVersion,os.dwMinorVersion,os.dwBuildNumber);
	if(KeGetCurrentIrql() != PASSIVE_LEVEL)
		return NULL;

	if(os.dwMajorVersion==5)
	{
		switch(os.dwMinorVersion)
		{
		case 1://xp sp3
			uPebOffset=0x1b0;
			break;
		case 2://2003 sp2
			uPebOffset=0x1a0;
			break;
		}
	}
	else if(os.dwMajorVersion==6)
	{
		switch(os.dwMinorVersion)
		{
		case 0://2008
			break;
		case 1:
#ifdef _AMD64_
			//win7x64 sp1, 2008R2x64 sp1
			uPebOffset=0x338;
			uParamOffset =0x20;
			uImagNameOffset=0x68;
#else
			//win7x32 sp1
			uPebOffset=0x1a8;
#endif
		}
	}	
	if(uPebOffset==0)
	{
		dprintf ("this function do not supported current os.\r\n");
		return NULL ;
	}
	uProcessPtr =(ULONG_PTR)PsGetCurrentProcess();

	uImagNameAddr=(uProcessPtr+uPebOffset);	
    if((uImagNameAddr =*(ULONG_PTR*)uImagNameAddr)==0)return NULL ;

	uImagNameAddr+=uParamOffset;
	if((uImagNameAddr =*(ULONG_PTR*)uImagNameAddr)==0)return NULL;

	uImagNameAddr+=uImagNameOffset;	
	if((uImagNameAddr =*(ULONG_PTR*)uImagNameAddr)==0)return NULL ;		
	dprintf ("Process full path name: %ws\r\n",(PCWSTR)uImagNameAddr );	
	return (PCWSTR)uImagNameAddr;

}
//64位只在win2008 R2 sp1 下测试

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (5)
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
硬编码啊
2011-12-25 12:13
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
不能说是 硬编码
分析的很仔细
让我感觉很奇怪的 一个结构体 难道偏移会不同吗?
麻烦 楼主看一下 是不是 有什么Size 什么的值 你没有逆出来 什么的
结构体 应该不区分操作系统版本的
2011-12-25 12:35
0
雪    币: 135
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如果结构体里有指针呢 64位的指针 8个字节 剩下的 你懂的
2011-12-25 13:38
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不同系统 难道不是不同的偏移么
我也感觉很奇怪
记得应该是有区别的
2011-12-25 21:00
0
雪    币: 222
活跃值: (69)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
32位的 _PEB 是相同的,但32位的_PEB和64 位的就不同了
_EPROCESS每个系统都不一样
2011-12-25 23:01
0
游客
登录 | 注册 方可回帖
返回
//