В 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
 
Комментариев нет:
Отправить комментарий