Перехват функции disk.sys

Тема в разделе "WASM.WIN32", создана пользователем mev, 19 июн 2005.

  1. mev

    mev New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    5
    Вопрос драйвераписателям.



    Предыстория:

    Написал я драйвер который перехватывает функции 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.
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ mev</font><!--color--><font color="gray]: Знаю где в IRP храниться количество байт которые надо считать, с какого сектора их надо считывать. ]</font><!--color-->



    Перед тем как хучить, получи размер сектора так:


    Код (Text):
    1. IoBuildDeviceIoControlRequest( IOCTL_DISK_GET_DRIVE_GEOMETRY, pDeviceObject, ... );
    2.  
    3. LARGE_INTEGER liBytesPerSector;
    4. liBytesPerSector.LowPart  = DISK_GEOMETRY.BytesPerSector;
    5. liBytesPerSector.HighPart = 0;


    Тогда номер сектора и кол-во секторов получишь так:


    Код (Text):
    1. LARGE_INTEGER liSector;
    2.  
    3. liSector.QuadPart = pIoStack->Parameters.Read.ByteOffset.QuadPart / liBytesPerSector.QuadPart;
    4.  
    5. ULONG uNumOfSectors = pIoStack->Parameters.Read.Length / liBytesPerSector.LowPart;


    <font color="gray][ mev</font><!--color--><font color="gray]: Где храниться в IRP адрес буфера куда считываются данные драйвером disk.sys ? ]</font><!--color-->


    Код (Text):
    1. 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):
    1. #define MmGetSystemAddressForMdlSafe(MDL, PRIORITY)                    \
    2.      (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |                    \
    3.                         MDL_SOURCE_IS_NONPAGED_POOL)) ?                \
    4.                              ((MDL)->MappedSystemVa) :                 \
    5.                              (MmMapLockedPagesSpecifyCache((MDL),      \
    6.                                                            KernelMode, \
    7.                                                            MmCached,   \
    8.                                                            NULL,       \
    9.                                                            FALSE,      \
    10.                                                            (PRIORITY))))
    11.  
    12. #define MmGetSystemAddressForMdl(MDL)                                  \
    13.      (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |                    \
    14.                         MDL_SOURCE_IS_NONPAGED_POOL)) ?                \
    15.                              ((MDL)->MappedSystemVa) :                 \
    16.                              (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.
     
  3. mev

    mev New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    5
    Огромное спасибо за ответ. Все буквально разжевано.

    Теперь тормоз преодолен.



    Не в первый раз ты мне помогаешь ценным советом Four-F.

    Вот если пригодится, могу прислать одно из своих творений (с исподниками),

    тока скажи куда? (если оно тебе нужно конечно).



    А используется оно на тему bugtraq:"Пароль или хеш".

    Честно говоря не видел ни одной реализации в инете для этого дела.

    Суть моего проекта такая: Dll внедряется в lsass.exe и подменяет

    возвращаемое значение функций SystemFunction006(passw,LMHASH) и

    SystemFunction007(passw,NTHASH),т.е. возвращаемый хеш. Реализация перехвата

    реализована по Рихтеру - замена начальных байтов функции на:



    push MyFunctionAddr

    ret



    Далее при подключении к удаленной/локальной машине, при вводе login / paasw(любой),

    системой используется не введенный passw, а хеш, который вводится через данное творение.



    Т.е. имея хеш, отпадает смысл подбора пароля по хешу.
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ mev</font><!--color--><font color="gray]: Вот если пригодится, могу прислать одно из своих творений (с исподниками),

    тока скажи куда? (если оно тебе нужно конечно).
    ]</font><!--color-->



    Нужно или нет - трудно сказать. Если что-то законченное и стабильно работающее, то не откажусь.





    Забыл сказать... Раз ты хукаешь процедуру диспетчеризации драйвера, то должен быть готов к тому, что он обслуживает несколько девайсов дисков и у них могут быть разные размеры секторов. Я писАл нечто подобное и хукал все девайсы примерно таким образом.


    Код (Text):
    1.     pci = IoGetConfigurationInformation();
    2.  
    3.     for ( uDiskDigit = 0;  uDiskDigit < pci->DiskCount;  uDiskDigit++ ) {
    4.  
    5.         swprintf( awchBuffer, L"\\Device\\Harddisk%d\\Partition0", uDiskDigit );
    6.  
    7.         RtlInitUnicodeString( &usSymbolicLinkName, awchBuffer );
    8.  
    9.         IoGetDeviceObjectPointer(
    10.                             &usSymbolicLinkName,
    11.                             FILE_READ_ATTRIBUTES,
    12.                             &pFileObject,
    13.                             &pDeviceObject );
    14.  
    15.         //  IoBuildDeviceIoControlRequest( IOCTL_DISK_GET_DRIVE_LAYOUT, ... );
    16.         GetDrivePartitionCount( pDeviceObject, &uPartitionCount );
    17.  
    18.         //  IoBuildDeviceIoControlRequest( IOCTL_DISK_GET_DRIVE_GEOMETRY, ... );
    19.         GetDriveBytesPerSector( pDeviceObject, &uBytesPerSector );
    20.  
    21.         for ( uPartitionDigit = 0;  uPartitionDigit < uPartitionCount;  uPartitionDigit++ ) {
    22.  
    23.             //  составляем список из девайсов и записываем туда размер сектора.
    24.             //  когда придет запрос на чтение по указателю на девайс достанем
    25.             //  из списка размер сектора
     
  5. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Код (Text):
    1. MmGetSystemAddressForMdlSafe proc pMdl:PMDL, Priority:DWORD
    2.  
    3.     mov eax, pMdl
    4.     assume eax:ptr MDL
    5.     .if [eax].MdlFlags & MDL_MAPPED_TO_SYSTEM_VA + MDL_SOURCE_IS_NONPAGED_POOL
    6.         mov eax, [eax].MappedSystemVa
    7.     .else
    8.         invoke MmMapLockedPagesSpecifyCache, pMdl, KernelMode, MmCached, NULL, FALSE, Priority
    9.     .endif
    10.     assume eax:nothing
    11.     ret
    12.  
    13. MmGetSystemAddressForMdlSafe endp
    14.  


    Зта ф-ция была в RamDisk из KmdKit (вместо макроса)
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    А я уже забыл :dntknw:
     
  7. mev

    mev New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    5
    Всем огромное спасибо.

    Буду строить драйвер дальше...