百度空间 | 百度首页 
 
查看文章
 
PEB地址随机化
2008-04-07 21:46

XPSP2后系统引入了一个特性:PEB地址随机化,每个进程的PEB地址不固定,大概有14种可能。系统创建进程时设置PEB的地址。

NtCreateProcess / NtCreateProcessEx / PspCreateProcess / MmCreatePeb / MiCreatePebOrTeb

MiCreatePebOrTeb函数中根据当前时间计算随机值:

        PVOID HighestVadAddress;

        LARGE_INTEGER CurrentTime;

        HighestVadAddress = (PVOID) ((PCHAR)MM_HIGHEST_VAD_ADDRESS + 1);

        KeQueryTickCount (&CurrentTime);

        CurrentTime.LowPart &= ((X64K >> PAGE_SHIFT) - 1);

        if (CurrentTime.LowPart <= 1) {

            CurrentTime.LowPart = 2;

        }

        HighestVadAddress = (PVOID) ((PCHAR)HighestVadAddress - (CurrentTime.LowPart << PAGE_SHIFT));

所以在XPSP2系统以后不能认为PEB就处在0x7FFDF000处,不同的进程PEB地址会不一样。

如果是本进程,可以通过下面的指令取得,

mov eax,fs:[0x18]

mov eax,dword ptr [eax+0x30]

先取得TEB的地址,再取得PEB的地址。

如果要取得其它进程的PEB地址,可以通过NtQueryInformationProcess函数实现。

NtQueryInformationProcess(...)

{

    ......

    case ProcessBasicInformation:

        BasicInfo.ExitStatus = Process->ExitStatus;

        BasicInfo.PebBaseAddress = Process->Peb;

        BasicInfo.AffinityMask = Process->Pcb.Affinity;

        BasicInfo.BasePriority = Process->Pcb.BasePriority;

        BasicInfo.UniqueProcessId = (ULONG_PTR)Process->UniqueProcessId;

        BasicInfo.InheritedFromUniqueProcessId = (ULONG_PTR)Process->InheritedFromUniqueProcessId;

    ......

}

ULONG CEnumPebDlg::GetPebAddress(ULONG ulPID)

{

    HANDLE                      hProcess = NULL;

    ULONG                       ulPebAddr = 0;

    PROCESS_BASIC_INFORMATION   pbi = {0};

    ULONG                       dwReturnLength = 0;

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ulPID);

    if(hProcess != NULL)

    {

        if(g_lpNtQueryInformationProcess(hProcess,

                                         ProcessBasicInformation,

                                         &pbi,

                                         sizeof(PROCESS_BASIC_INFORMATION),

                                         &dwReturnLength) == 0)

        {

            ulPebAddr = (ULONG)pbi.PebBaseAddress;

        }

        CloseHandle(hProcess);

    }

    return ulPebAddr;

}



类别:windows 内核 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu