两个搜索特征:
(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