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