首页
社区
课程
招聘
[求助]内核里面有哪些方法遍历指定进程模块
发表于: 2011-12-29 15:44 7834

[求助]内核里面有哪些方法遍历指定进程模块

2011-12-29 15:44
7834
内核里面有哪些方法遍历指定进程模块 请简单的阐述下 谢谢

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
peb
ZwQueryVirtualMemory
内核和用户态通信,用户态去取(这个不知道符不符合你的要求)
2011-12-29 15:59
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
谢谢这个应该是可以 但是还有其他的吗。
2011-12-29 16:01
0
雪    币: 51
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
5种。听别人说的。
2011-12-29 19:29
0
雪    币: 287
活跃值: (578)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
Eprocess->VadRoot
这个要熟悉内存管理,这是只要存在的模块就无法被隐藏的,ZwQueryVirtualMemory也就是遍厉这个结构
2011-12-30 16:28
0
雪    币: 222
活跃值: (69)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
HANDLE	GetModuleBaseAddressOfProcess(IN PEPROCESS pPe/*=NULL*/,
	IN PCWSTR lpModuleName/*=L"ntdll.dll"*/)
{

	if(pPe ==NULL )return NULL ;

	HANDLE hModule = NULL;
	RTL_OSVERSIONINFOW os={0};
	ULONG_PTR uPebPtr;
	ULONG_PTR uLdr=NULL ;
	ULONG uPebOffset=0;
	ULONG uLdrOffset=0xc;
	UNICODE_STRING usModuleName={0};
	if(lpModuleName )
		RtlInitUnicodeString (&usModuleName ,lpModuleName );

	RtlGetVersion (&os);	
	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 _WIN64
			//win7x64 sp1, 2008R2x64 sp1
			uPebOffset=0x338;
			uLdrOffset=0x18;
#else
			//win7x32 sp1
			uPebOffset=0x1a8;
#endif
		}
	}	
	if(uPebOffset==0)
	{
		dprintf ("this function do not supported current os.\r\n");
		return NULL ;
	}	
	
	KeDetachProcess();
	KeAttachProcess(pPe );
	__try{		
		uPebPtr =(ULONG_PTR)((UCHAR *)pPe +uPebOffset);
		if((uLdr=*(ULONG_PTR*)uPebPtr)==NULL )
		{			
			return NULL;
		}
		uLdr +=uLdrOffset;
		PEB_LDR_DATA *pld=(PEB_LDR_DATA*)(*(ULONG_PTR*)uLdr);	
		LIST_ENTRY *pList=pld->InLoadOrderModuleList.Flink;	
		LIST_ENTRY *p=pList;		
		do{
			PLDR_MODULE pModule=(PLDR_MODULE)p;	
			if(pModule->BaseAddress)
			{
				if(lpModuleName )
				{
					if(RtlEqualUnicodeString(&usModuleName ,&pModule->BaseDllName,TRUE ))
					{
						hModule=pModule->BaseAddress;
						dprintf("\"%ws\" base address = %#x\r\n",pModule->BaseDllName.Buffer,hModule);
						break; 
					}
				}else{
					dprintf("BaseAddr = %#x\t ---> %ws\r\n",
						pModule->BaseAddress,pModule->BaseDllName.Buffer);
				}
			}
			p=p->Flink;
		}while(p!=pList);
	
	}__except (1){
		
		dprintf ("This is an exception on GetModuleBaseAddressOfProcess()...\r\n");
	}
	KeDetachProcess();	
	return hModule;
}

2011-12-30 18:29
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
谢谢各位。。这些正是想要的
2012-1-1 22:29
0
游客
登录 | 注册 方可回帖
返回
//