AVrf.

Тема в разделе "WASM.WIN32", создана пользователем Clerk, 8 май 2010.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это не новый механизм, опишу использование верификатора. Это второе из средств диагностики, наряду с логгером поддерживаемое нэйтивом. Первое средство это логгер, выполняющий логгирование событий и ошибок в загрузчике(переменные ShowSnaps и ShowErrors загружаемые из ключа "Image File Execution Options", "GlobalFlag"). Принцип прост - загружается провайдер в виде модуля, он определяет список апи и передаёт его менеджеру. Тот выполняет патч IAT, перенаправляя ссылки в провайдер. Далее он анализирует неполадки в этих апи и ведёт лог, обычно просто отладочный вывод. Также провайдер может устанавливать калбэки на загрузку и выгрузку модулей.
    У InitRoutine() модулей причин вызова 5, последняя DLL_PROCESS_VERIFIER и есть загрузка/инициализация провайдера. Она вызывается ранее чем DLL_PROCESS_ATTACH каких либо модулей, так как менеджер должен ранее всех выполнить патч и мониторить все функции. Пользовательский провайдер загружается вторым, первым подгружается системный verifier.dll
    Менеджер реализован в виде не экспортируемых функций имеющих префикс AVrf. Отладочный вывод имеет префикс "AVRF: ". Провайдер может быть загружен динамически приложением посредством вызова AVrfInitializeVerifier()(первый считывает список провайдеров и параметры, второй вызов загружает и инициализирует их).
    В начале следует разрешить использование верификации. Это определяет один из флагов в "GlobalFlag", FLG_APPLICATION_VERIFIER(0x00000100). Параметр "VerifierDlls" это список имён провайдеров, они должны распологаться в системном каталоге. "VerifierFlags"(RTL_VRF_FLG_*) и "VerifierDebug" это конфиг и является набором флагов(загружается в переменные AVrfpVerifierFlags и AVrfpDebug соответственно).
    Когда прилодение запускается, менеджер определяет зарегистрирован ли для него провайдер. Если он есть, выполняется его загрузка и вызов с причиной DLL_PROCESS_VERIFIER(4). При этом в InitRoutine() передаётся ссылка на переменную, в которую провайдер(тоесть наш модуль) должен вернуть ссылку на дескриптор, описывающий список перехватываемых функций. Дескриптор является структурой RTL_VERIFIER_PROVIDER_DESCRIPTOR:
    Код (Text):
    1. RTL_VERIFIER_PROVIDER_DESCRIPTOR struct
    2. ; Заполняет провайдер.
    3. _Length             ULONG ?
    4. ProviderDlls            PRTL_VERIFIER_DLL_DESCRIPTOR ?
    5. ProviderDllLoadCallback     PVOID ?
    6. ProviderDllUnloadCallback   PVOID ?
    7. ; Заполняет менеджер.
    8. VerifierImage           PWSTR ?
    9. VerifierFlags           ULONG ? ; <- AVrfpVerifierFlags
    10. VerifierDebug           ULONG ? ; <- AVrfpDebug
    11. RTL_VERIFIER_PROVIDER_DESCRIPTOR ends
    где Length - размер этой структуры, в XP равен 0x1C.
    ProviderDllLoadCallback и ProviderDllUnloadCallback - опциональные нотификаторы, вызываемые при загрузке/выгрузке модулей:
    Код (Text):
    1. typedef VOID (NTAPI * RTL_VERIFIER_DLL_LOAD_CALLBACK) (
    2.     PWSTR DllName,
    3.     PVOID DllBase,
    4.     SIZE_T DllSize,
    5.     PVOID Reserved
    6.     );
    7.  
    8. typedef VOID (NTAPI * RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (
    9.     PWSTR DllName,
    10.     PVOID DllBase,
    11.     SIZE_T DllSize,
    12.     PVOID Reserved
    13.     );
    Они вызываются из LdrpWalkImportDescriptor()(AVrfDllLoadNotification() и AVrfDllUnloadNotification()).
    ProviderDlls - ссылка на массив(конец списка завершается нулём) структур RTL_VERIFIER_DLL_DESCRIPTOR, описывающих модуля подлежащие патчу:
    Код (Text):
    1. RTL_VERIFIER_DLL_DESCRIPTOR struct
    2. DllName     PWCHAR ?
    3. DllFlags    ULONG ?     ; Должно быть 1.
    4. DllAddress  PVOID ?
    5. DllThunks   PRTL_VERIFIER_THUNK_DESCRIPTOR ?
    6. RTL_VERIFIER_DLL_DESCRIPTOR ends
    где DllName - ссылка на имя модуля в юникоде.
    DllThunks - ссылка на массив(нулём завершается) структур RTL_VERIFIER_THUNK_DESCRIPTOR, описывающую функции, подлежащие патчу:
    Код (Text):
    1. RTL_VERIFIER_THUNK_DESCRIPTOR struct
    2. ThunkName       PSTR ?
    3. ThunkOldAddress     PVOID ?
    4. ThunkNewAddress     PVOID ?
    5. RTL_VERIFIER_THUNK_DESCRIPTOR ends
    где ThunkName - ссылка на имя экспорта.
    ThunkNewAddress - указатель на новый обработчик, ThunkOldAddress - соответственно предыдущий(загружается менеджером).
    Остальные поля RTL_VERIFIER_PROVIDER_DESCRIPTOR структуры заполняет менеджер, загружая туда имя экзешника и конфиг(AVrfpVerifierFlags и AVrfpDebug соответственно).
    Список провайдеров находится в переменной AVrfpVerifierProvidersList и является началом двусвязанного списка.
    Таким образом провайдер заполняет эти структуры и возвращает их, далее менеджер перечисляет модуля(RTL_VERIFIER_DLL_DESCRIPTOR) и функции(RTL_VERIFIER_THUNK_DESCRIPTOR), выполняя их патч.
    Флажки:
    Код (Text):
    1. RTL_VRF_FLG_FULL_PAGE_HEAP                   equ 00000001H
    2. RTL_VRF_FLG_RESERVED_DONOTUSE                equ 00000002H  ; old RTL_VRF_FLG_LOCK_CHECKS
    3. RTL_VRF_FLG_HANDLE_CHECKS                    equ 00000004H
    4. RTL_VRF_FLG_STACK_CHECKS                     equ 00000008H
    5. RTL_VRF_FLG_APPCOMPAT_CHECKS                 equ 00000010H
    6. RTL_VRF_FLG_TLS_CHECKS                       equ 00000020H
    7. RTL_VRF_FLG_DIRTY_STACKS                     equ 00000040H
    8. RTL_VRF_FLG_RPC_CHECKS                       equ 00000080H
    9. RTL_VRF_FLG_COM_CHECKS                       equ 00000100H
    10. RTL_VRF_FLG_DANGEROUS_APIS                   equ 00000200H
    11. RTL_VRF_FLG_RACE_CHECKS                      equ 00000400H
    12. RTL_VRF_FLG_DEADLOCK_CHECKS                  equ 00000800H
    13. RTL_VRF_FLG_FIRST_CHANCE_EXCEPTION_CHECKS    equ 00001000H
    14. RTL_VRF_FLG_VIRTUAL_MEM_CHECKS               equ 00002000H
    15. RTL_VRF_FLG_ENABLE_LOGGING                   equ 00004000H
    16. RTL_VRF_FLG_FAST_FILL_HEAP                   equ 00008000H
    17. RTL_VRF_FLG_VIRTUAL_SPACE_TRACKING           equ 00010000H
    18. RTL_VRF_FLG_ENABLED_SYSTEM_WIDE              equ 00020000H
    19. RTL_VRF_FLG_MISCELLANEOUS_CHECKS             equ 00020000H
    20. RTL_VRF_FLG_LOCK_CHECKS                      equ 00040000H
    [​IMG]
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
     
  3. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Clerk
    Спасибо. Не знал о кастомных провайдерах, полезная штука.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    green
    Ога, особенно для тех кто древние патчи в IAT использует для всяко перехватов. Жаль что некому больше не интересно ничего :dntknw:
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    копал такое когда-то.
    itw вообще мало кастомного как бы. всё стандартно.
    Когда кто-нибудь преподносит нетривиальное решения, это считается откровением.
    Та же загрузка dll'ки через провайдер принтера.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    n0name
    Почему стандартно. По мойму весь кульно получилось с динамическим запуском из памяти.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Clerk
    с чего ты это взял?
    вообще мини статьей на сайт завесить.
     
  8. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Зря так считаете, просто слишком много недокументированных вещей описываете, человеку с квалификацией ниже вашей в этом материале разобраться очень не просто.
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Clerk
    Я иногда для мониторинга API использую WinDbg Logger extension. Тоже довольно мощная вещь, позволяет описывать свои прототипы API. Но logger что-то работал у меня нестабильно и пару раз здорово подвёл при отладке. Правда, 3-ю версию, что в последних тулзах, я ещё не пробовал.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Clerk
    я к тому, что в 99% малвары ничего более-менее нового нет.
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
  12. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
  13. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Эээээээээээ............Это Вы открыли или как?
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Дату посмотрите и всё станет ясно.
     
  15. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Ваша честь восстановлена, отписал и тем и тем.
     
  16. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    yashechka

    Им бессмысленно писать по описанной вами причине. Один не ответит, второй наматает лапши на мозг. Тоесть я же пробовал.
     
  17. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Да пофиг, главное отписать :lol:
     
  18. superakira

    superakira Guest

    Публикаций:
    0
    Апну тему.
    Таки да инде был первым, но как всегда теория. Про это кстати даже ионеску написал, почему вообще такой хайп непонятно... Пиар.
    Теперь к делу)
    У данной методиги есть пару ньюансов, перед тем как кто-то захочет заюзать it the wild так сказать, надо о них упомянуть.
    Во-первых, дллка (кастомный варифер) должен лежать в систем32 либо вов либо в путях (тут не проверял, но это былоб логично). Те можно вколотить в реестр путь до своей дллине например в темпах, но это не будет рабатать. Если глянуть под виндбг, то там стопнеться на int 3 c криком, что ZEROED_STACK что-то там. Предпалагаю, что длинна пути критична - тут не ресечил точно.
    Во-вторых, будут ВСЕ время остановы с бредовыми выводами. Если их скипать, то все воркает (это я про дебаг под windbg). Но этоможно разрулить и даже про это написано в бложике чувака из ссылок выше в треде. Там идея простая - есть переменная (не экспортируемая из verifier.dll), если её поменять, то все будет норм. Прикол в том, что до этой переменной можно дотянуться из VerifierStopMessage и она на разных ос чуть разная.

    Например 7_64

    Код (ASM):
    1. _VerifierStopMessage@40 proc near  ; CODE XREF: AVrfpDphEnterHeapPath(x,x)+5Cp
    2. .text:1124B860  ; AVrfpDphPointerFromHandle(x)+B7p ...
    3. .text:1124B860
    4. .text:1124B860 var_1C  = dword ptr -1Ch
    5. .text:1124B860 var_18  = dword ptr -18h
    6. .text:1124B860 var_14  = dword ptr -14h
    7. .text:1124B860 var_10  = dword ptr -10h
    8. .text:1124B860 var_C  = dword ptr -0Ch
    9. .text:1124B860 var_8  = dword ptr -8
    10. .text:1124B860 var_4  = dword ptr -4
    11. .text:1124B860 arg_0  = dword ptr  8
    12. .text:1124B860 arg_4  = dword ptr  0Ch
    13. .text:1124B860 arg_8  = dword ptr  10h
    14. .text:1124B860 arg_C  = dword ptr  14h
    15. .text:1124B860 arg_10  = dword ptr  18h
    16. .text:1124B860 arg_14  = dword ptr  1Ch
    17. .text:1124B860 arg_18  = dword ptr  20h
    18. .text:1124B860 arg_1C  = dword ptr  24h
    19. .text:1124B860 arg_20  = dword ptr  28h
    20. .text:1124B860 arg_24  = dword ptr  2Ch
    21. .text:1124B860
    22. .text:1124B860  mov  edi, edi
    23. .text:1124B862  push  ebp
    24. .text:1124B863  mov  ebp, esp
    25. .text:1124B865  sub  esp, 1Ch
    26. .text:1124B868  mov  [ebp+var_1C], 0
    27. .text:1124B86F  mov  [ebp+var_18], 0
    28. .text:1124B876  mov  [ebp+var_14], 0
    29. .text:1124B87D  mov  [ebp+var_8], 0
    30. .text:1124B884  cmp  _AVrfpProcessBeingTerminated, 0 // <-- Вот эту переменную
    На 10_64

    Код (ASM):
    1. _VerifierStopMessage@40 proc near  ; CODE XREF: AVrfpDphEnterHeapPath(x,x)+5Fp
    2. .text:1000CAF0  ; AVrfpDphPointerFromHandle(x)+B7p ...
    3. .text:1000CAF0
    4. .text:1000CAF0 var_24  = dword ptr -24h
    5. .text:1000CAF0 var_20  = dword ptr -20h
    6. .text:1000CAF0 var_1C  = dword ptr -1Ch
    7. .text:1000CAF0 var_18  = dword ptr -18h
    8. .text:1000CAF0 var_14  = dword ptr -14h
    9. .text:1000CAF0 var_10  = dword ptr -10h
    10. .text:1000CAF0 var_C  = dword ptr -0Ch
    11. .text:1000CAF0 var_8  = dword ptr -8
    12. .text:1000CAF0 var_4  = dword ptr -4
    13. .text:1000CAF0 arg_0  = dword ptr  8
    14. .text:1000CAF0 arg_4  = dword ptr  0Ch
    15. .text:1000CAF0 arg_8  = dword ptr  10h
    16. .text:1000CAF0 arg_C  = dword ptr  14h
    17. .text:1000CAF0 arg_10  = dword ptr  18h
    18. .text:1000CAF0 arg_14  = dword ptr  1Ch
    19. .text:1000CAF0 arg_18  = dword ptr  20h
    20. .text:1000CAF0 arg_1C  = dword ptr  24h
    21. .text:1000CAF0 arg_20  = dword ptr  28h
    22. .text:1000CAF0 arg_24  = dword ptr  2Ch
    23. .text:1000CAF0
    24. .text:1000CAF0  mov  edi, edi
    25. .text:1000CAF2  push  ebp
    26. .text:1000CAF3  mov  ebp, esp
    27. .text:1000CAF5  sub  esp, 24h
    28. .text:1000CAF8  mov  eax, ___security_cookie
    29. .text:1000CAFD  xor  eax, ebp
    30. .text:1000CAFF  mov  [ebp+var_4], eax
    31. .text:1000CB02  mov  [ebp+var_10], 0
    32. .text:1000CB09  mov  [ebp+var_18], 0
    33. .text:1000CB10  mov  [ebp+var_20], 0
    34. .text:1000CB17  mov  [ebp+var_C], 0
    35. .text:1000CB1E  cmp  _RedirectedVerifierStopFunction, 0
    36. .text:1000CB25  jz  short loc_1000CB69
    37. .text:1000CB27  mov  eax, [ebp+arg_24]
    38. .text:1000CB2A  push  eax
    39. .text:1000CB2B  mov  ecx, [ebp+arg_20]
    40. .text:1000CB2E  push  ecx
    41. .text:1000CB2F  mov  edx, [ebp+arg_1C]
    42. .text:1000CB32  push  edx
    43. .text:1000CB33  mov  eax, [ebp+arg_18]
    44. .text:1000CB36  push  eax
    45. .text:1000CB37  mov  ecx, [ebp+arg_14]
    46. .text:1000CB3A  push  ecx
    47. .text:1000CB3B  mov  edx, [ebp+arg_10]
    48. .text:1000CB3E  push  edx
    49. .text:1000CB3F  mov  eax, [ebp+arg_C]
    50. .text:1000CB42  push  eax
    51. .text:1000CB43  mov  ecx, [ebp+arg_8]
    52. .text:1000CB46  push  ecx
    53. .text:1000CB47  mov  edx, [ebp+arg_4]
    54. .text:1000CB4A  push  edx
    55. .text:1000CB4B  mov  eax, [ebp+arg_0]
    56. .text:1000CB4E  push  eax
    57. .text:1000CB4F  mov  ecx, _RedirectedVerifierStopFunction
    58. .text:1000CB55  mov  [ebp+var_14], ecx
    59. .text:1000CB58  mov  ecx, [ebp+var_14] ; _DWORD
    60. .text:1000CB5B  call  ds:___guard_check_icall_fptr ; _guard_check_icall_nop(x)
    61. .text:1000CB61  call  [ebp+var_14]
    62. .text:1000CB64  jmp  loc_1000CE16
    63. .text:1000CB69 ; ---------------------------------------------------------------------------
    64. .text:1000CB69
    65. .text:1000CB69 loc_1000CB69:  ; CODE XREF: VerifierStopMessage(x,x,x,x,x,x,x,x,x,x)+35j
    66. .text:1000CB69  cmp  _AVrfpProcessBeingTerminated, 0 // <--- Теперь уже сдесь
    67. .text:1000CB70  jnz  short loc_1000CB7B
    68. .text:1000CB72  cmp  _AVrfpStopInitialized, 0
    69. .text:1000CB79  jnz  short loc_1000CB80
    На 10 еще один if в начале добавился соответсвенно, кода стало больше.

    Так что тут как минимум надо еще писать код который будет бегать по верифаеру искать переменную и патчить её, чтоб воркало норм, а не утопало в бесконечном int 3

    Ну это в кратце... Возможно что-то упустил/накосячил).
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    superakira

    Ионеску это для нас никто. Тоесть у этого человека нет своих работ, он никто(есть какой то примитив у него на гитхабе). Это коллектор инфы. То что он какое то уг разбирает - это делает каждый, кому данная тема интересна. Но он сказал что он автор данной инфы, тем самым облажался(не первый раз).

    > утопало в бесконечном int 3

    Я уже и не помню всех нюансов, можно поднять старые темы и архивы, что бы разобраться. Было много кода по данной теме. Какой рип будет следующим, предполагаю что софтверные анклавы - моя парадигма. Но это не ионеску сделает, он не разрабатывает, он только реверсит и рипает.
     
  20. superakira

    superakira Guest

    Публикаций:
    0
    Indy_,

    >Какой рип будет следующим, предполагаю что софтверные анклавы - моя парадигма. Но это не ионеску сделает, он не разрабатывает, он только реверсит и рипает.

    Не распарсил