Сбой в минифильтре

Тема в разделе "WASM.NT.KERNEL", создана пользователем Cristoff, 20 июн 2009.

  1. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    Пишу драйвер минифильтр в связке с программой управления.

    фильтр цепляется на IRP пакет IRP_MJ_CREATE. По PreCreate Он проверяет имя файла, точнее отправляет имя файла в юзер моде приложение, которое в свою очередь должно проверить имя файла на валидность.
    Ниже идеть код копирования имени файла в буфер для отправки к приложению, здесь же и просиходит сбой, как будет видно далее из !analyze -v.

    Код (Text):
    1. if (name->Buffer!=NULL){
    2. __try{
    3. RtlCopyMemory( &notification.Contents,
    4.             name->Buffer,
    5.                         10//(ULONG)name->Length
    6.              );
    7.             }
    8.             __except(EXCEPTION_EXECUTE_HANDLER){
    9.                 DbgPrint("pp");
    10.  
    11.             }}
    Код (Text):
    1. *******************************************************************************
    2. *                                                                             *
    3. *                        Bugcheck Analysis                                    *
    4. *                                                                             *
    5. *******************************************************************************
    6.  
    7. PAGE_FAULT_IN_NONPAGED_AREA (50)
    8. Invalid system memory was referenced.  This cannot be protected by try-except,
    9. it must be protected by a Probe.  Typically the address is just plain bad or it
    10. is pointing at freed memory.
    11. Arguments:
    12. Arg1: e1045040, memory referenced.
    13. Arg2: 00000000, value 0 = read operation, 1 = write operation.
    14. Arg3: f9f9063b, If non-zero, the instruction address which referenced the bad memory
    15.     address.
    16. Arg4: 00000001, (reserved)
    17.  
    18. Debugging Details:
    19. ------------------
    20.  
    21. ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
    22.  
    23. *************************************************************************
    24. ***                                                                   ***
    25. ***                                                                   ***
    26. ***    Your debugger is not using the correct symbols                 ***
    27. ***                                                                   ***
    28. ***    In order for this command to work properly, your symbol path   ***
    29. ***    must point to .pdb files that have full type information.      ***
    30. ***                                                                   ***
    31. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    32. ***    contain the required information.  Contact the group that      ***
    33. ***    provided you with these symbols if you need this command to    ***
    34. ***    work.                                                          ***
    35. ***                                                                   ***
    36. ***    Type referenced: nt!_KPRCB                                     ***
    37. ***                                                                   ***
    38. *************************************************************************
    39. *************************************************************************
    40. ***                                                                   ***
    41. ***                                                                   ***
    42. ***    Your debugger is not using the correct symbols                 ***
    43. ***                                                                   ***
    44. ***    In order for this command to work properly, your symbol path   ***
    45. ***    must point to .pdb files that have full type information.      ***
    46. ***                                                                   ***
    47. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    48. ***    contain the required information.  Contact the group that      ***
    49. ***    provided you with these symbols if you need this command to    ***
    50. ***    work.                                                          ***
    51. ***                                                                   ***
    52. ***    Type referenced: nt!_KPRCB                                     ***
    53. ***                                                                   ***
    54. *************************************************************************
    55. *************************************************************************
    56. ***                                                                   ***
    57. ***                                                                   ***
    58. ***    Your debugger is not using the correct symbols                 ***
    59. ***                                                                   ***
    60. ***    In order for this command to work properly, your symbol path   ***
    61. ***    must point to .pdb files that have full type information.      ***
    62. ***                                                                   ***
    63. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    64. ***    contain the required information.  Contact the group that      ***
    65. ***    provided you with these symbols if you need this command to    ***
    66. ***    work.                                                          ***
    67. ***                                                                   ***
    68. ***    Type referenced: kernel32!pNlsUserInfo                         ***
    69. ***                                                                   ***
    70. *************************************************************************
    71. *************************************************************************
    72. ***                                                                   ***
    73. ***                                                                   ***
    74. ***    Your debugger is not using the correct symbols                 ***
    75. ***                                                                   ***
    76. ***    In order for this command to work properly, your symbol path   ***
    77. ***    must point to .pdb files that have full type information.      ***
    78. ***                                                                   ***
    79. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    80. ***    contain the required information.  Contact the group that      ***
    81. ***    provided you with these symbols if you need this command to    ***
    82. ***    work.                                                          ***
    83. ***                                                                   ***
    84. ***    Type referenced: kernel32!pNlsUserInfo                         ***
    85. ***                                                                   ***
    86. *************************************************************************
    87.  
    88. ADDITIONAL_DEBUG_TEXT:  
    89. Use '!findthebuild' command to search for the target build information.
    90. If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols.
    91.  
    92. FAULTING_MODULE: 804d7000 nt
    93.  
    94. DEBUG_FLR_IMAGE_TIMESTAMP:  4a3cae56
    95.  
    96. READ_ADDRESS: unable to get nt!MmSpecialPoolStart
    97. unable to get nt!MmSpecialPoolEnd
    98. unable to get nt!MmPoolCodeStart
    99. unable to get nt!MmPoolCodeEnd
    100.  e1045040
    101.  
    102. FAULTING_IP:
    103. NullFilter!checkFile+5b [j:\drivers\testfiltr\tob\nullfilter.c @ 827]
    104. f9f9063b 83790400        cmp     dword ptr [ecx+4],0
    105.  
    106. MM_INTERNAL_CODE:  1
    107.  
    108. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    109.  
    110. BUGCHECK_STR:  0x50
    111.  
    112. LAST_CONTROL_TRANSFER:  from 8053321e to 804e3592
    113.  
    114. STACK_TEXT:  
    115. WARNING: Stack unwind information not available. Following frames may be wrong.
    116. f9c5b234 8053321e 00000003 806ef03c c0384114 nt!DbgBreakPointWithStatus+0x4
    117. f9c5b614 8053380e 00000050 e1045040 00000000 nt!KeDeregisterBugCheckReasonCallback+0x6c7
    118. f9c5b634 805241a0 00000050 e1045040 00000000 nt!KeBugCheckEx+0x1b
    119. f9c5b680 804e1718 00000000 e1045040 00000000 nt!IoSetFileOrigin+0xc1dc
    120. f9c5b73c 805646c3 00000000 00000005 f9c5b770 nt!Kei386EoiHelper+0x26bc
    121. f9c5b950 f9f907e8 e104503c f9c5b97f 003ca537 nt!SeDeleteAccessState+0x4a5
    122. f9c5b9a0 f9946888 81310f5c f9c5b9c0 f9c5b9f0 NullFilter!DefenderPreCreate+0xb8 [j:\drivers\testfiltr\tob\nullfilter.c @ 960]
    123. f9c5ba00 f99482a0 00c5ba44 81310f00 8130f198 fltMgr!FltRequestOperationStatusCallback+0xf52
    124. f9c5ba14 f9955217 f9c5ba44 f99536aa 00000000 fltMgr!FltGetIrpName+0x4e2
    125. f9c5ba2c f9955742 f9c5ba44 813ae218 8130f018 fltMgr!FltProcessFileLock+0x1cdb
    126. f9c5ba60 804e37f7 8166eee8 8130f008 8130f008 fltMgr!FltProcessFileLock+0x2206
    127. f9c5bb50 80563fec 817e9818 00000000 81616f30 nt!IofCallDriver+0x32
    128. f9c5bbd8 805684da 00000000 f9c5bc18 00000040 nt!RtlEqualUnicodeString+0x4cf
    129. f9c5bc2c 8056cbeb 00000000 00000000 7b673001 nt!ObOpenObjectByName+0xdb
    130. f9c5bca8 8056ccba 0052e218 00100001 0052e1bc nt!FsRtlCurrentBatchOplock+0x212
    131. f9c5bd04 8056cd82 0052e218 00100001 0052e1bc nt!IoCreateFile+0x4f
    132. f9c5bd44 804de7ec 0052e218 00100001 0052e1bc nt!NtOpenFile+0x27
    133. f9c5bddc 804f88ea f9868b85 8167a7d0 00000000 nt!ZwYieldExecution+0xb78
    134. f9c5be4c 7c9101bb 00000000 00000000 00000000 nt!KeInitializeTimer+0x107
    135. 00000000 f000ff53 f000ff53 f000ff53 f000ff53 ntdll!RtlAllocateHeap+0x117
    136. 00000000 00000000 f000ff53 f000ff53 f000ff53 0xf000ff53
    137.  
    138.  
    139. STACK_COMMAND:  .bugcheck ; kb
    140.  
    141. FOLLOWUP_IP:
    142. NullFilter!checkFile+5b [j:\drivers\testfiltr\tob\nullfilter.c @ 827]
    143. f9f9063b 83790400        cmp     dword ptr [ecx+4],0
    144.  
    145. FAULTING_SOURCE_CODE:  
    146.    823:             //RtlInitUnicodeString(&(notification.fName),
    147.    824:             //
    148.    825:             //  Copy only as much as the buffer can hold
    149.    826:             //
    150. >  827:             RtlCopyMemory( &notification.Contents,
    151.    828:                             name->Buffer,
    152.    829:                            (ULONG)name->Length
    153.    830:                           );
    154.    831:
    155.    832:             replyLength = sizeof( DEFENDER_REPLY );
    156.  
    157.  
    158. SYMBOL_NAME:  NullFilter!checkFile+5b
    159.  
    160. FOLLOWUP_NAME:  MachineOwner
    161.  
    162. MODULE_NAME: NullFilter
    163.  
    164. IMAGE_NAME:  NullFilter.sys
    165.  
    166. BUCKET_ID:  WRONG_SYMBOLS
    167.  
    168. Followup: MachineOwner
    169. ---------
    Как пишет анализ, такие траблы не отловишь траем. Сбой происходит в разное время и при разных обстоятельствах.
    Что нужно проверять чтобы не получить бсод?
    Структуры:
    Код (Text):
    1. DEFENDER_NOTIFICATION notification;
    2. typedef struct _DEFENDER_NOTIFICATION {
    3.    
    4.     ULONG Reserved;            
    5.    WCHAR Contents[256];    
    6. } DEFENDER_NOTIFICATION, *PDEFENDER_NOTIFICATION;
    name - это *UNICODE_STRING.
    nullfilter - это мой драйвер.
    ОС win xp sp2 на virtualbox
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Во-первых, убери амперсанд (&) в первом параметре в RtlCopyMemory(). Во-вторых, подгрузи наконец-то нормальные символы, ибо сейчас стек отображается некорректно.
     
  3. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    Пути к символам:
    C:\WINDOWS\SYMBOLS.NET*http://msdl.microsoft.com/download/symbols;J:\drivers\testFiltr\tob\objchk_wxp_x86\i386
    Амперсанд убрал. Ошибка осталась...
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    name не валиден скорее всего бывает
     
  5. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    Но! как проверить его? Он не НУЛЛ и его буфер тоже.
    Пробывал ставить счетчик обращений на копирование, но всегда разное число получается...
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, скорее всего так и есть, но для большей уверенности надо посмотреть адрес name->Buffer.
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ты его откуда взял вообще, этот name?
     
  8. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    указатель на name передается в функцию для отправки

    NTSTATUS checkFile(__in UNICODE_STRING * name, __out PBOOLEAN granted)

    из обработчика PreCreate
    Код (Text):
    1. status = FltGetFileNameInformation( Data,
    2.                                         FLT_FILE_NAME_NORMALIZED |
    3.                                             FLT_FILE_NAME_QUERY_DEFAULT,
    4.                                         &nameInfo );
    5.  
    6.     if (!NT_SUCCESS( status )) {
    7.  
    8.        return FLT_POSTOP_FINISHED_PROCESSING;
    9.     }
    10.     FltParseFileNameInformation( nameInfo );
    11.     //
    12.     //  Check if the extension matches the list of extensions we are interested in
    13.     //
    14.  
    15.     catchstr = &nameInfo->Name;
    16.    
    17.     //
    18.     //  Release file name info, we're done with it
    19.     //
    20.     FltReleaseFileNameInformation( nameInfo );
    21. granted = TRUE;
    22.     __try{
    23.     checkFile(catchstr,&granted);
    24.     }
    25.     __except(EXCEPTION_EXECUTE_HANDLER){
    26.         return FLT_PREOP_SUCCESS_WITH_CALLBACK;
    27.     }
     
  9. reader

    reader New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2009
    Сообщения:
    8
    MmIsAddressValid?
     
  10. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    Респект тебе! Пока все норм.
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не надо херню советовать.
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это, мягко говоря, не решение. А проблема у тебя в преждевременном вызове FltReleaseFileNameInformation().
     
  13. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    да... действительно, слишком рано осводил... Но почему тогда сбой происходит не всегда?
    В теории я использую FltReleaseFileNameInformation задолго до того как передаю параметр функции.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Filter Manager - штука вообще объёмная и нетривиальная и писалась она далеко не студентами; это касается и внутреннего кэширования в том числе. Буфер, который возвращает тебе FltGetFileNameInformation() на самом деле не принадлежит тебе, он шарится между всеми фильтрами внутри фильтрующего ядра. Вызывая FltReleaseFileNameInformation() реально ты не освобождаешь память под имя, ты лишь сообщаешь Filter Manager'у, что оно тебе больше не нужно, а настоящее освобождение памяти произойдёт тогда, когда все фильтры скажут, что имя им больше не нужно плюс, возможно, что Filter Manager хранит имя в кэше ещё какое-то время по собственной инициативе.
     
  15. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    Я так и подумал... Но вообще глупая ошибка получилась с освобождением.
    Всем спасибо за помощь.