Падение при чтении файла (возможно - совместный доступ)

Тема в разделе "WASM.NT.KERNEL", создана пользователем ksu_ant, 6 дек 2010.

  1. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Здравствуйте!
    Возникла необходимость мониторить запуск файлов в системе. Сделал SDT перехваты. Нужно контролировать неизменность файлов. Для этого попытался считать хэш (функции рабочие).
    Код (Text):
    1. NTSTATUS HashFile(CHAR *hash,UNICODE_STRING *fname)
    2. {
    3.     OBJECT_ATTRIBUTES oa;
    4.     IO_STATUS_BLOCK iosb;
    5.     NTSTATUS status;
    6.     HANDLE SourceFileHandle;
    7.     FILE_STANDARD_INFORMATION fsi;
    8.     int i=0,BufferSize=32;
    9.     CHAR Buffer[32];
    10.     sha256_context shctx;
    11.     UCHAR dest[32];
    12.     strcpy(hash,"");
    13.     InitializeObjectAttributes (&oa, fname, OBJ_CASE_INSENSITIVE , NULL, NULL);
    14.     status = ZwCreateFile(&SourceFileHandle, FILE_READ_DATA, &oa, &iosb, 0, FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
    15.     if (status==STATUS_SUCCESS)
    16.     {
    17.         status=ZwQueryInformationFile(SourceFileHandle,&iosb,&fsi,sizeof(fsi),FileStandardInformation);
    18.         if (status==STATUS_SUCCESS)
    19.         {  
    20.             sha256_init(&shctx);
    21.             do
    22.             {
    23.                 memset(&Buffer, 0, sizeof(Buffer));
    24.                 status = ZwReadFile(SourceFileHandle, NULL, NULL, NULL, &iosb, &Buffer, BufferSize, NULL, NULL);
    25.                 if (status == STATUS_SUCCESS)
    26.                 {
    27.                     sha256_write(&shctx, &Buffer[0],iosb.Information);
    28.                 }
    29.             } while ( NT_SUCCESS(status) );
    30.             sha256_final(&shctx);
    31.             memset(dest, 0, 32);
    32.             memcpy(dest, &shctx.sha_out, 32);
    33.             HashToHexStr(hash,dest);
    34.         }
    35.         ZwClose(SourceFileHandle);
    36.     }
    37.     return status;
    38. }
    Также - строка пишется в файл:
    Код (Text):
    1. void WriteDataToLog(CHAR *LogStr)
    2. {  
    3.     IO_STATUS_BLOCK iosb;
    4.     CHAR s[1024];
    5.    
    6.     if ((int)hLogFile!=-1)
    7.     {
    8.         strcpy(s,LogStr);
    9.         strcat(s,"\n");
    10.         ZwWriteFile (hLogFile, 0, NULL, NULL, &iosb,s, strlen(s), NULL, NULL);
    11.     }
    12. }
    Но, видимо из-за частых операций работы с файлами - возникает BSOD (думаю, что происходят несколько попыток открытия и чтения одного файла).
    Дамп:
    Код (Text):
    1. kd> !analyze -v
    2. *******************************************************************************
    3. *                                                                             *
    4. *                        Bugcheck Analysis                                    *
    5. *                                                                             *
    6. *******************************************************************************
    7.  
    8. UNEXPECTED_KERNEL_MODE_TRAP (7f)
    9. This means a trap occurred in kernel mode, and it's a trap of a kind
    10. that the kernel isn't allowed to have/catch (bound trap) or that
    11. is always instant death (double fault).  The first number in the
    12. bugcheck params is the number of the trap (8 = double fault, etc)
    13. Consult an Intel x86 family manual to learn more about what these
    14. traps are. Here is a *portion* of those codes:
    15. If kv shows a taskGate
    16.         use .tss on the part before the colon, then kv.
    17. Else if kv shows a trapframe
    18.         use .trap on that value
    19. Else
    20.         .trap on the appropriate frame will show where the trap was taken
    21.         (on x86, this will be the ebp that goes with the procedure KiTrap)
    22. Endif
    23. kb will then show the corrected stack.
    24. Arguments:
    25. Arg1: 00000008, EXCEPTION_DOUBLE_FAULT
    26. Arg2: 80042000
    27. Arg3: 00000000
    28. Arg4: 00000000
    29.  
    30. Debugging Details:
    31. ------------------
    32.  
    33. ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
    34.  
    35.  
    36. MODULE_NAME:  nt
    37.  
    38. FAULTING_MODULE: 804d0000 nt
    39.  
    40. DEBUG_FLR_IMAGE_TIMESTAMP:  3b7de38f
    41.  
    42. BUGCHECK_STR:  0x7f_8
    43.  
    44. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    45.  
    46. LAST_CONTROL_TRANSFER:  from 804d6b8f to 804fc1bb
    47.  
    48. STACK_TEXT:  
    49. WARNING: Stack unwind information not available. Following frames may be wrong.
    50. 80539160 804d6b8f 0000007f 00000008 80042000 nt!KeBugCheckEx+0x19
    51. 00000000 00000000 00000000 00000000 00000000 nt!Kei386EoiHelper+0x14d5
    52.  
    53.  
    54. STACK_COMMAND:  .bugcheck ; kb
    55.  
    56. FOLLOWUP_NAME:  MachineOwner
    57.  
    58. BUCKET_ID:  WRONG_SYMBOLS
    59.  
    60. Followup: MachineOwner
    61. ---------
    Кто сможет помочь разобраться? Буду благодарен.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    у тебя процессор летит к еб..ням (double fault), какие там доступы :lol:
     
  3. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Вот непонятно, из-за чего это... Если нет файловых операций - все работает. А нельзя ли проверить - открыт ли уже файл с помощью функций ZwCreateFile/ZwOpenFile, чтобы не открывать его повторно? Что-то я читал про синхронный и асинхронный режимы чтения в ядре - не совсем понял. Кто этим пользовался?
     
  4. tchunya

    tchunya New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    29
    Чего перехватываем-то? Zw/NtCreateFile? Защита от рекурсивного вызова перехваченной функции есть?
     
  5. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Нуда, как сказал tchunya возможно ты из хука вызываешь похуканную функцию в твоем случае ZwCreateFile
    и попадаешь опять же на хук и опять всё повторяется.

    Как вариант можно сделать проще:
    1) В хуке ZwCreateFile вызывать оригинальный адрес функции, чтобы файл открылся. Затем смотреть на права доступа на открытие. в твоем случае должны быть хотя бы права на чтение.
    2) Далее ты юзаешь полученный хендл для вычисления хеша файла
    3) Далее ставишь позицию указателя опять на начало файла.
    4) Принимаешь правильное действие в зависимости от полученного хеша и оригинального.
    5) возвращаешь результат (хендл)

    3 и 4 пункт могут поменяться местами, в зависимости от того что ты делаешь при проверке.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    slesh
    Zw* вообще хукаьт не надо. хукать надо Nt*. разумеется, с защитой от рекурсивного вызова хука.
     
  7. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    2 Great тупанул, ну я и имею в виду Nt* которая в SDT
     
  8. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    А чем простые нотификаторы не устраивают вроди PsSetCreateProcessNotifyRoutine, PsSetLoadImageNotifyRoutine?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Очевидно, он хочет иметь возможность _запрещать_ старт процесса при определенных условиях, а нотификаторы на то и нотификаторы - позволяют узнать о свершившемся факте и только.
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не совсем так. Во-первых, в нотификаторе о загрузке образа имеется возможность пропатчить образ так, чтобы его точка входа не была выполнена. Во-вторых, колбеки файловых фильтров совершенно легально позволяют запрещать создание исполняемых секций. Ну и, в конце концов, колбек на процессы в Vista SP1 и выше позволяет запрещать непосредственно создание процессов легко и непринуждённо.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    x64
    Патчить - это как-то криво, согласись :) Файловые фильтры это да, но я про нотификаторы PsSetXXXNotifyRoutine говорил. И не только для Vista+, а для всех)
     
  12. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Вобще наверное рулит:
    1. нотификаторы от PsSetXXXNotifyRoutine
    2. перехват в SSDT
    3. файловые фильтры

    чем собственно аверы и владеют
     
  13. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    tchunya slesh
    Именно их.
    Нет, так как писал не я и я теперь разбираюсь в проблеме. Я тоже подумал про рекурсивный вызов, спасибо за идеи, буду пробовать.

    Great
    Точно, это тоже надо.
    Всем большое спасибо, Вы подтвердили мои догадки - теперь мне проще будет думать, так как проблема локализована - буду пробовать.