Вопрос драйвераписателям. Предыстория: Написал я драйвер который перехватывает функции disk.sys - заменяет адрес обработчика IRP_MJ_READ на адрес моего. Что-то вроде (Diskmon). Знаю где в IRP храниться количество байт которые надо считать, с какого сектора их надо считывать. Метод обращения к disk.sys - METHOD_(IN/OUT)_DIRECT, Внимание вопрос: Где храниться в IRP адрес буфера куда считываются данные драйвером disk.sys ? PS: MmGetSystemAddressForMdl или MmGetSystemAddressForMdlSafe - в KmdKit вообще нигде не определены. Если вышеописанные функции макрос, использующие MmMapLockedPages, то тогда, как правильно использовать MmMapLockedPages, и не нужно ли после MmMapLockedPages использовать что-либо типа Mm_Un_Map_Un_LockedPages.
<font color="gray][ mev</font><!--color--><font color="gray]: Знаю где в IRP храниться количество байт которые надо считать, с какого сектора их надо считывать. ]</font><!--color--> Перед тем как хучить, получи размер сектора так: Код (Text): IoBuildDeviceIoControlRequest( IOCTL_DISK_GET_DRIVE_GEOMETRY, pDeviceObject, ... ); LARGE_INTEGER liBytesPerSector; liBytesPerSector.LowPart = DISK_GEOMETRY.BytesPerSector; liBytesPerSector.HighPart = 0; Тогда номер сектора и кол-во секторов получишь так: Код (Text): LARGE_INTEGER liSector; liSector.QuadPart = pIoStack->Parameters.Read.ByteOffset.QuadPart / liBytesPerSector.QuadPart; ULONG uNumOfSectors = pIoStack->Parameters.Read.Length / liBytesPerSector.LowPart; <font color="gray][ mev</font><!--color--><font color="gray]: Где храниться в IRP адрес буфера куда считываются данные драйвером disk.sys ? ]</font><!--color--> Код (Text): pIrp->MdlAddress <font color="gray][ mev</font><!--color--><font color="gray]: MmGetSystemAddressForMdl или MmGetSystemAddressForMdlSafe - в KmdKit вообще нигде не определены. Если вышеописанные функции макрос, использующие MmMapLockedPages, то тогда, как правильно использовать MmMapLockedPages, и не нужно ли после MmMapLockedPages использовать что-либо типа Mm_Un_Map_Un_LockedPages. ]</font><!--color--> Да, не определены. Да, это макросы. Код (Text): #define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) \ (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ MDL_SOURCE_IS_NONPAGED_POOL)) ? \ ((MDL)->MappedSystemVa) : \ (MmMapLockedPagesSpecifyCache((MDL), \ KernelMode, \ MmCached, \ NULL, \ FALSE, \ (PRIORITY)))) #define MmGetSystemAddressForMdl(MDL) \ (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ MDL_SOURCE_IS_NONPAGED_POOL)) ? \ ((MDL)->MappedSystemVa) : \ (MmMapLockedPages((MDL),KernelMode))) Если в MdlFlags взведены флаги MDL_MAPPED_TO_SYSTEM_VA и MDL_SOURCE_IS_NONPAGED_POOL, то возвращается MappedSystemVa - адрес куда отмаплено. Если нет, то мапится. После MmUnmapLockedPages/MmMapLockedPagesSpecifyCache, естественно, надо отмапить, вызвав MmUnmapLockedPages. ЗЫ: Если ты хочешь посмотреть, что было считано драйвером, то придется хучить процедуру завершения и смотреть в ней, т.к. пока IRP_MJ_READ идет вниз - это всего лишь просьба прочитать данные. Ну это, надеюсь, и так понятно. Можно глянуть dmon.sys от старого (до версии 2) diskmon'а. Кое-что можно посмотреть в исходниках ДДК, например, DDK\src\storage\filters\diskperf.
Огромное спасибо за ответ. Все буквально разжевано. Теперь тормоз преодолен. Не в первый раз ты мне помогаешь ценным советом Four-F. Вот если пригодится, могу прислать одно из своих творений (с исподниками), тока скажи куда? (если оно тебе нужно конечно). А используется оно на тему bugtraq:"Пароль или хеш". Честно говоря не видел ни одной реализации в инете для этого дела. Суть моего проекта такая: Dll внедряется в lsass.exe и подменяет возвращаемое значение функций SystemFunction006(passw,LMHASH) и SystemFunction007(passw,NTHASH),т.е. возвращаемый хеш. Реализация перехвата реализована по Рихтеру - замена начальных байтов функции на: push MyFunctionAddr ret Далее при подключении к удаленной/локальной машине, при вводе login / paasw(любой), системой используется не введенный passw, а хеш, который вводится через данное творение. Т.е. имея хеш, отпадает смысл подбора пароля по хешу.
<font color="gray][ mev</font><!--color--><font color="gray]: Вот если пригодится, могу прислать одно из своих творений (с исподниками), тока скажи куда? (если оно тебе нужно конечно). ]</font><!--color--> Нужно или нет - трудно сказать. Если что-то законченное и стабильно работающее, то не откажусь. Забыл сказать... Раз ты хукаешь процедуру диспетчеризации драйвера, то должен быть готов к тому, что он обслуживает несколько девайсов дисков и у них могут быть разные размеры секторов. Я писАл нечто подобное и хукал все девайсы примерно таким образом. Код (Text): pci = IoGetConfigurationInformation(); for ( uDiskDigit = 0; uDiskDigit < pci->DiskCount; uDiskDigit++ ) { swprintf( awchBuffer, L"\\Device\\Harddisk%d\\Partition0", uDiskDigit ); RtlInitUnicodeString( &usSymbolicLinkName, awchBuffer ); IoGetDeviceObjectPointer( &usSymbolicLinkName, FILE_READ_ATTRIBUTES, &pFileObject, &pDeviceObject ); // IoBuildDeviceIoControlRequest( IOCTL_DISK_GET_DRIVE_LAYOUT, ... ); GetDrivePartitionCount( pDeviceObject, &uPartitionCount ); // IoBuildDeviceIoControlRequest( IOCTL_DISK_GET_DRIVE_GEOMETRY, ... ); GetDriveBytesPerSector( pDeviceObject, &uBytesPerSector ); for ( uPartitionDigit = 0; uPartitionDigit < uPartitionCount; uPartitionDigit++ ) { // составляем список из девайсов и записываем туда размер сектора. // когда придет запрос на чтение по указателю на девайс достанем // из списка размер сектора
Код (Text): MmGetSystemAddressForMdlSafe proc pMdl:PMDL, Priority:DWORD mov eax, pMdl assume eax:ptr MDL .if [eax].MdlFlags & MDL_MAPPED_TO_SYSTEM_VA + MDL_SOURCE_IS_NONPAGED_POOL mov eax, [eax].MappedSystemVa .else invoke MmMapLockedPagesSpecifyCache, pMdl, KernelMode, MmCached, NULL, FALSE, Priority .endif assume eax:nothing ret MmGetSystemAddressForMdlSafe endp Зта ф-ция была в RamDisk из KmdKit (вместо макроса)