четверг, 9 сентября 2010 г.

ntdll official hooks

Не так давно я выкладывал ссылки на catalog of NTDLL kernel mode to user mode callbacks
В ntdll.dll есть и некоторое количество экспортируемых функций, позволяющих user mode программам ставить всякие разные хуки и callbacks. И некоторые из этих функций даже документированы !
Соотв-но я сугубо для себя запишу тут некоторые из них. Память алкоголика - вещь загадочная, так что список наверняка не полон, а большую часть я просто не знаю например

При чтении этого потока сознания весьма полезно сверяться периодически с ntdll.dll exported symbols 

Сначала немного о функции RtlEncodePointer (версия с 32битной windows xp):

lea     eax, [ebp+var_4]
push    eax
push    24h        ; ProcessCookie
push    0FFFFFFFFh ; current process handle
call    _ZwQueryInformationProcess@20
mov     eax, [ebp+var_4]
xor     eax, [ebp+arg_0]

По моему тут все очевидно, зачитываем Cookie текущего процесса и делаем xor с переданным указателем.
Начиная с висты алгоритм несколько изменился:

mov     eax, [ebp+var_4]
mov     cl, al
xor     eax, [ebp+arg_0]
and     cl, 1Fh
ror     eax, cl

но не стал более непонятным
  • VEH, про который знает даже детский юмористический журнал ксакеп. Там все довольно понятно изложено, за исключением одного момента - начиная с висты используется LdrpVectorHandlerList, а не пара RtlpCalloutEntryList & RtlpCalloutEntryLock
  • LdrpDllNotificationList - список callbacks на загрузку/выгрузку модулей. Начиная с висты для работы с ним появилась даже пара экспортируемых функций LdrRegisterDllNotification/LdrUnregisterDllNotification. Алгоритм нахождения этого списка для более ранних версий windows можно заценить например здесь. Прототип хука выглядит как
    typedef
    VOID (NTAPI *PLDR_DLL_NOTIFICATION_FUNCTION)(
        IN ULONG NotificationReason,
        IN PCLDR_DLL_NOTIFICATION_DATA NotificationData,
        IN PVOID Context
        );

  • TppLogpRoutine, устанавливающаяся функцией TpDbgSetLogRoutine. Появилась начиная с висты. Судя по коду - просто trace callback
  • RtlpStartThreadFunc & RtlpExitThreadFunc, устанавливаются функцией RtlSetThreadPoolStartFunc. Есть даже в w2k. Как туда попали что делают - неизвестно
  • LdrpManifestProberRoutine - ставится функцией LdrSetDllManifestProber. Появилась начиная с windows xp.В сорцах reactos прототип callback указан как
    NTSTATUS
    (NTAPI * PLDR_MANIFEST_PROBER_ROUTINE) (
        IN PVOID DllBase,
        IN PCWSTR FullDllPath,
        OUT PVOID *ActivationContext
        );

    начиная с windows 7 эта же функция устанавливает еще пару callbacks: LdrpCreateActCtxLanguage & LdrpReleaseActCtx
  • нечто нераспознанное, устанавливающееся функцией RtlRegisterSecureMemoryCacheCallback (появилась начиная с windows xp). В сорцах reactos прототип callback указан как
    typedef NTSTATUS
    (NTAPI *PRTL_SECURE_MEMORY_CACHE_CALLBACK)(
        IN PVOID Address,
        IN SIZE_T Length
    );

    Причем до windows 7 можно было поставить только 1 callback - в переменную RtlSecureMemoryCacheCallback, начиная с windows 7 их можно поставить несколько - хранятся в связном списке RtlpSecMemListHead и синхронизируются локом RtlpSecMemLock
  • Начиная с висты функцией EtwNotificationRegister можно зарегистрировать пачку callbacks в массиве EtwpRegList, синхронизируется тот массив critical section EtwProvCritSect. Вызывается это богатство из функции EtwpProcessNotification, которая в свою очередь дергается из EtwDeliverDataBlock, которая в свою очередь вызывается из EtwpNotificationThread, которая уже дергается из ntdll ядром
  • RtlpUnhandledExceptionFilter, устанавливающаяся функцией RtlSetUnhandledExceptionFilter. Появилась начиная с w2k3, указатель на функцию зашифрован через RtlEncodePointer (см. выше)
  • LdrpAppCompatDllRedirectionCallbackFunction, устанавливающаяся функцией LdrSetAppCompatDllRedirectionCallback. Появилась начиная с висты, но в windows 7 не делает ничего
  • Начиная с vista через ф-ции RtlRetrieveNtUserPfn & RtlInitializeNtUserPfn можно получить и установить callbacks таблицы для NtUserInitializeClientPfnArrays
  • начиная с xp shim engine устанавливает также свои разнообразные callbacks в PE loader

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

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