Внезапно оказалось что такие ф-ции могут перехватываться не только из ntoskrnl, но и из любых других драйверов, имеющих соотв-щую поддержку
Собс-но поддержка заключается в вызове недокументированной ф-ции MmAddVerifierThunks, которой на вход приезжают два параметра:
struct vrf_thunk
{
PVOID original_function;
PVOID patched_function;
};
NTKERNELAPI NTSTATUS MmAddVerifierThunks(struct vrf_thunk *tab, ULONG tabSizeInBytes);
Driver Verifier патчит IAT подопытного драйвера, заменяя original_function на patched_function, которая в свою очередь делает все необходимые проверки (например своих параметров или IRQL) и вызывает original_function (или DbgPrintEx если чо-нть нашлось).
Например fltmgr поддерживает driver verifier, регистрируя в DriverEntry табличку FltpFilterVerifierThunks. Интересно, что число поддерживаемых ф-ций отличается в разных версиях windows:
xp
- FltStartFiltering
- FltUnregisterFilter
- FltCompletePendedPostOperation
- FltCompletePendedPreOperation
- FltLockUserBuffer
- FltDoCompletionProcessingWhenSafe
- FltQueueDeferredIoWorkItem
- FltCbdqInsertIo
- FltCbdqRemoveIo
- FltCbdqRemoveNextIo
- FltAllocateCallbackData
- FltFreeCallbackData
- FltReuseCallbackData
- FltPerformSynchronousIo
- FltPerformAsynchronousIo
- FltReissueSynchronousIo
- FltReadFile
- FltWriteFile
- FltCompareInstanceAltitudes
- FltGetSwappedBufferMdlAddress
- FltRetainSwappedBufferMdlAddress
- FltStartFiltering
- FltUnregisterFilter
- FltCompletePendedPostOperation
- FltCompletePendedPreOperation
- FltLockUserBuffer
- FltDoCompletionProcessingWhenSafe
- FltQueueDeferredIoWorkItem
- FltCbdqInsertIo
- FltCbdqRemoveIo
- FltCbdqRemoveNextIo
- FltAllocateCallbackData
- FltFreeCallbackData
- FltReuseCallbackData
- FltPerformSynchronousIo
- FltPerformAsynchronousIo
- FltReissueSynchronousIo
- FltReadFile
- FltWriteFile
- FltAllocateContext
- FltGetContexts
- FltReleaseContexts
- FltSetVolumeContext
- FltSetInstanceContext
- FltSetFileContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltDeleteVolumeContext
- FltDeleteInstanceContext
- FltDeleteFileContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltGetVolumeContext
- FltGetInstanceContext
- FltGetFileContext
- FltGetStreamContext
- FltGetStreamHandleContext
- FltGetTransactionContext
- FltReferenceContext
- FltReleaseContext
- FltAllocateDeferredIoWorkItem
- FltFreeDeferredIoWorkItem
- FltAllocateGenericWorkItem
- FltFreeGenericWorkItem
- FltGetFileNameInformation
- FltGetFileNameInformationUnsafe
- FltGetTunneledName
- FltGetDestinationFileNameInformation
- FltReferenceFileNameInformation
- FltReleaseFileNameInformation
- FltCreateFileEx2
- FltCreateFileEx
- FltOpenVolume
- FltCreateFile
- FltClose
- FltObjectReference
- FltObjectDereference
- FltGetFilterFromName
- FltGetFilterFromInstance
- FltGetVolumeFromName
- FltGetVolumeFromInstance
- FltGetVolumeFromFileObject
- FltGetVolumeFromDeviceObject
- FltEnumerateVolumes
- FltEnumerateFilters
- FltAttachVolume
- FltAttachVolumeAtAltitude
- FltGetVolumeInstanceFromName
- FltGetLowerInstance
- FltGetUpperInstance
- FltGetTopInstance
- FltGetBottomInstance
- FltEnumerateInstances
- FltCompareInstanceAltitudes
- FltGetSwappedBufferMdlAddress
- FltRetainSwappedBufferMdlAddress
- FltRequestOperationStatusCallback
- FltCancelFileOpen
- FltGetRoutineAddress
- FltStartFiltering
- FltUnregisterFilter
- FltCompletePendedPostOperation
- FltCompletePendedPreOperation
- FltLockUserBuffer
- FltDoCompletionProcessingWhenSafe
- FltQueueDeferredIoWorkItem
- FltCbdqInsertIo
- FltCbdqRemoveIo
- FltCbdqRemoveNextIo
- FltAllocateCallbackData
- FltAllocateCallbackDataEx
- FltFreeCallbackData
- FltReuseCallbackData
- FltPerformSynchronousIo
- FltPerformAsynchronousIo
- FltReissueSynchronousIo
- FltReadFile
- FltWriteFile
- FltTagFile
- FltUntagFile
- FltQueryInformationFile
- FltSetInformationFile
- FltQueryDirectoryFile
- FltQueryEaFile
- FltSetEaFile
- FltQueryVolumeInformationFile
- FltQuerySecurityObject
- FltSetSecurityObject
- FltFlushBuffers
- FltFsControlFile
- FltDeviceIoControlFile
- FltCreateSystemVolumeInformationFolder
- FltDeviceIoControlFile
- FltAllocateContext
- FltGetContexts
- FltReleaseContexts
- FltSetVolumeContext
- FltSetInstanceContext
- FltSetFileContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltDeleteVolumeContext
- FltDeleteInstanceContext
- FltDeleteFileContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltGetVolumeContext
- FltGetInstanceContext
- FltGetFileContext
- FltGetStreamContext
- FltGetStreamHandleContext
- FltGetTransactionContext
- FltReferenceContext
- FltReleaseContext
- FltAllocateDeferredIoWorkItem
- FltFreeDeferredIoWorkItem
- FltAllocateGenericWorkItem
- FltFreeGenericWorkItem
- FltGetFileNameInformation
- FltGetFileNameInformationUnsafe
- FltGetTunneledName
- FltGetDestinationFileNameInformation
- FltReferenceFileNameInformation
- FltReleaseFileNameInformation
- FltCreateFileEx2
- FltCreateFileEx
- FltOpenVolume
- FltCreateFile
- FltClose
- FltObjectReference
- FltObjectDereference
- FltGetFilterFromName
- FltGetFilterFromInstance
- FltGetVolumeFromName
- FltGetVolumeFromInstance
- FltGetVolumeFromFileObject
- FltGetVolumeFromDeviceObject
- FltEnumerateVolumes
- FltEnumerateFilters
- FltAttachVolume
- FltAttachVolumeAtAltitude
- FltGetVolumeInstanceFromName
- FltGetLowerInstance
- FltGetUpperInstance
- FltGetTopInstance
- FltGetBottomInstance
- FltEnumerateInstances
- FltCompareInstanceAltitudes
- FltGetSwappedBufferMdlAddress
- FltRetainSwappedBufferMdlAddress
- FltRequestOperationStatusCallback
- FltCancelFileOpen
- FltGetRoutineAddress
Комментариев нет:
Отправить комментарий