пятница, 4 марта 2011 г.

RtlRetrieveNtUserPfn

а вот например начиная с висты адреса таблиц для известной даже детскому юмористическому журналу ксакеп функции NtUserInitializeClientPfnArrays больше не хранятся где-то внутри user32.dll, а доставляются из ntdll.dll с помощью специально обученной функции RtlRetrieveNtUserPfn. Подозреваю это сделано для улучшения поддержки ASLR - ntdll.dll все равно должна грузиться всегда по одинаковому адресу, но для user32.dll после удаления оттуда всех таблиц callbacks это уже необязательно.
Таблиц как известно должно быть три - два указателя на таблицы функций типа PFNCLIENT и последняя - указатель на таблицу типа PFNCLIENTWORKER
Прототип RtlRetrieveNtUserPfn выглядит примерно так:

NTSYSAPI
NTSTATUS
NTAPI
RtlRetrieveNtUserPfn(PFNCLIENT **, PFNCLIENT **, PFNCLIENTWORKER **);

Возвращаемые таблицы лежат в read-only секции, но содержат простые функции-переходники на указатели в секции .data
Инициализируются же эти указатели в функции RtlInitializeNtUserPfn, прототип которой если меня зрение не обманывает выглядит примерно так:

NTSYSAPI
NTSTATUS
NTAPI
RtlInitializeNtUserPfn(
PFNCLIENT *, ULONG Tab1Size,
PFNCLIENT *, ULONG Tab2Size,
PFNCLIENTWORKER *, ULONG Tab3Size
);

Соотв-но нашлось еще одно три места, куда можно посветить фонариком

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

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