枚举进程(2)——利用EPROCESS/PEB地址特征进行内存搜索

本文介绍了两种内存搜索特征:(1)EPROCESS结构位于0x80000000到"system"进程EPROCESS之间,PEB指针也在此范围内;(2)PEB地址符合0x7FFD0000的模式。通过这些特征,可以高效地定位进程内存。在XP2系统测试中,需注意winlogon进程EPROCESS可能超出预期范围,需要适当调整搜索上限。
摘要由CSDN通过智能技术生成

 两个搜索特征:
(1)观察所有进程的EProcess结构地址,可以发现都在0x80000000到"system"进程的EPROCESS之间。
这就表明所有EPROCESS结构中的peb指针域也应该在这个区间。这就可以大致确定搜索范围。不过在实际测试(xp2)中发现winlogon的EPROCESS大于system的EPROCESS,因此还需要修正搜索范围的最大值。如果对效率要求比较高,还可以把搜索范围最小值设置的大一点,例如0x81800000,在xp2下EPROCESS都大于这个值,其他平台也可以对应的改。
(2)所有的PEB地址都符合0x7FFD0000这个特征。

========================================================================

typedef ULONG	DWORD ;

#define EPROCESS_SIZE		1
#define PEB_OFFSET			2
#define FILE_NAME_OFFSET		3
#define PROCESS_LINK_OFFSET		4
#define PROCESS_ID_OFFSET		5
#define EXIT_TIME_OFFSET		6

#define OBJECT_HEADER_SIZE		0x018 // 对象头大小
#define OBJECT_TYPE_OFFSET		0x008 // 类型在对象头结构中的偏移	

typedef enum {
	VALID_PAGE = 0,
	INVALID_PTE,
	INVALID_PDE	
} PAGE_STATUS ;

typedef struct _PROCESS_INFO {
	DWORD	EProcess ;
	DWORD	dwProcessId ;
	DWORD	dwPeb ;
	PUCHAR	pImageFileName ;
} PROCESS_INFO, *PPROCESS_INFO ;


DWORD GetPlantformDependentInfo ( DWORD dwFlag )
{ 
	DWORD current_build; 
	DWORD ans = 0; 

	PsGetVersion(NULL, NULL, ¤t_build, NULL); 

	switch ( dwFlag )
	{ 
	case EPROCESS_SIZE: 
		if (current_build == 2195) ans = 0 ;		// 2000,当前不支持2000,下同
		if (current_build == 2600) ans = 0x25C;		// xp
		if (current_build == 3790) ans = 0x270;		// 200
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值