Сохраняет она все что нужно в поле 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
Комментариев нет:
Отправить комментарий