Внезапно оказалось что такие ф-ции могут перехватываться не только из 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
 
Комментариев нет:
Отправить комментарий