пятница, 21 октября 2011 г.

RegisterApplicationRecoveryCallback

А вот например начиная с висты появилась такая местами документированная ф-ция
Сохраняет она все что нужно в поле PEB.WerRegistrationData, тип и назначение которого нигде не описано. Но когда это кого останавливало, бгг ?
Краткий просмотр ф-ции WerpRegisterRecovery говорит нам, что поле это присваивается в ф-ции WerpInitPEBStore примерно таким кодом:

  push    4               ; flProtect
  push    3000h           ; flAllocationType
  push    8D0h            ; dwSize
  push    edi             ; lpAddress
  call    ds:__imp__VirtualAlloc@16 ; VirtualAlloc(x,x,x,x)
  mov     [esi+230h], eax ; PEB.WerRegistrationData


размер структуры чуть ниже кладется в ее первый dword:

  mov     dword ptr [eax], 8D0h

Размер зависит от версии windows - под vista (на всех sp) он равен 0x10c8 байт, на w7 & w8 0x8d0 байт
Вся структура впрочем не нужна - интересен только следующий кусочек:

  push    [ebp+pRecoveryCallback]
  call    ds:__imp__RtlEncodeSystemPointer@4 ; RtlEncodeSystemPointer(x)
  mov     [edi+830h], eax

Смещение, по которому хранится закодированный указатель на pRecoveryCallback на разных версиях windows также разное - на vista 0x1030, на w7 & w8 0x830

Комментариев нет:

Отправить комментарий