работа с Hdd в Ring0

Тема в разделе "WASM.WIN32", создана пользователем Maveric, 16 май 2005.

  1. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Есть некий драйвер для W2k. Механизм его защиты от копирования использует информацию о винчестере (серийный номер, модель). Получение этой инф-ии происходит в функции DriverEntry методом приямого обращения к портам контроллера HDD. Всё было нормально, пока не было задачи обеспечения работы драйвера под XP. Драйвер перекомпилил(ведь WDM предусматривает совместимость на уровне исходников). Всё работает. Заисключеним одного... не всегда верно происходит определение параметров HDD. Как будто система в момент опроса обращается к HDD. Можно ли как-то запретить ей это делать ?
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Я одно время развлекался написание vxd, читающего серийный нумер винта. Нашел какое-то косое решение, но так как писал для себя, то быстро забил. Вот код:


    Код (Text):
    1. ; Пытаемся поймать момент, когда IOS находится в состоянии "Idle",
    2. ; т.е. он не занят работой с винчестером. Для этого зовем его сервис:
    3.   mov ebx,0FFh      ; Число попыток получить состояние "Idle" у IOS.
    4. @@repeat_wait_IOS:
    5.   int  20h      ; Call VxD
    6.   dw   000Dh        ; Service Number: 0Dh "IOSIdleStatus
    7.   dw   0010h        ; ID IOS: BlockDev/IOS (VxD ID 0010h)
    8.   cli           ; Disable interrupts
    9.   test eax,eax      ; Status (0-if idle, else nonzero)
    10.   jz   @@begin_read     ; Сейчас можно читать
    11.   sti           ; Нет, IOS занят
    12.   call Waiter       ; Задержим программу
    13.   dec  ebx      ; Число попыток - 1.
    14.   jnz  @@repeat_wait_IOS ; Продолжаем ждать IOS
    15.   jmp  @@not_reading    ; Не дождались ;)
    16. @@begin_read:       ; Начинаем чтение серийного номера
    17.   mov  word ptr Counter,0
    18. @@TryAgain:
    19.   mov  dx,03F6h
    20.   mov  al,0Ah
    21.   out  dx,al        ; outportb(0x3F6,0x0A)
    22.   call Waiter
    23. @@Wait1:
    [​IMG] _229011986__ser.asm
     
  3. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    как-то сложнова-то :)

    я думаю, что может мне IRQL поднять и тогда никто мешать не будет.
     
  4. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    OldIRQL = KeRaiseIrqlToDpcLevel();

    ...

    KeLowerIrql(OldIRQL);



    фокус не прошёл :dntknw: система виснет.
     
  5. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Пробовал перед чтением данных, прочитать из портов текушее состояние?
     
  6. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    угумс:

    while((READ_PORT_UCHAR(0x1f0 + 7) & 0x80) != 0);
     
  7. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Maveric

    кинь сорцик плиз Nicopolis(dog)yandex.ru/ Решим вопрос возможно.
     
  8. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    CARDINAL

    напиши обязательно, жду ответа
     
  9. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Весь сорцик кидать наверное безумие :)

    самый актуальный кусок:

    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,

    IN PUNICODE_STRING RegistryPath)



    {

    ...



    unsigned int Key;

    unsigned int StartAddr;

    unsigned int Len;



    #define VALID_CRC 0xbf90f94a





    Key = CreateKey(); // генрим ключ на основании инф-ии о винче

    StartAddr = GetProcessingAddr(); // получаем адрес с которого начинем расшифровку нашего кода

    Len = GetProcessingLength(); // получаем длину расшифровываемого кода

    Decod(StartAddr, Len, Key[0], Relocs, sizeof(Relocs) / sizeof(int)); // расшифровка

    // посчитаем контрольную сумму. если не совпала, то софтину упёрли :) (а может криво поставили)

    if(GetCrc(StartAddr, Len, Relocs, sizeof(Relocs) / sizeof(int)) == VALID_CRC)

    cAuth = OK;

    else

    cAuth = INCORRECT_HDD;



    return STATUS_SUCCESS;

    }



    unsigned int CreateKey()

    {



    unsigned short pcBuffer[256];

    unsigned int Key = 0;

    int i;



    // обнулим буфер

    for(i = 0; i < 256; i++)

    pcBuffer = 0;



    // дождёмся когда контроллер будет свободен

    while((READ_PORT_UCHAR(0x1f0 + 7) & 0x80) != 0);



    // выберем MASTER

    WRITE_PORT_UCHAR(0x1f0 + 6, 0x0a);

    __asm jmp short $+2;

    // пошлём команду

    WRITE_PORT_UCHAR(0x1f0 + 7, 0xec);

    __asm jmp short $+2;



    // дождёмся завершения команды

    while((READ_PORT_UCHAR(0x1f0 + 7) & 0x80) != 0);



    // читаем данные

    for(i = 0; i < 256; i++)

    {

    pcBuffer = READ_PORT_USHORT(0x1f0);

    __asm jmp short $+2;

    }



    // сгенерим Key



    return Key;

    }
     
  10. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее




    мдя... ну штож, флаг тибе в руки дарагой товарищь. А потом еще ругаюца што маст дай кривой - это руки и голова у некоторых программеров кривая.
     
  11. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Ценное замечание :)

    А что нибудь по делу ?
     
  12. MSKZ

    MSKZ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2005
    Сообщения:
    47
    У тебя TimeOut попробуй увиличеть время задержки.
     
  13. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    дзен с ним, тоже нифига не могу понять, пишем Руссиновичу