首页
论坛
课程
招聘
smartqiu
雪    币: 206
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
11
回帖
42
粉丝
0

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

2011-12-25 05:33 5719

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

2011-12-25 05:33
5719
#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 下测试


[看雪官方培训]《安卓高级研修班(网课)》9月班开始招生!挑战极限、工资翻倍!

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