Модификация SeAccessCheck в ntkrnlpa.exe

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

  1. skyproc

    skyproc New Member

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

    На старом одноядерном железе модифицировал я код функций из ntoskrnl.exe (WinXP) и некаких проблем, хотя именно SeAccessCheck не пробовал.
    На моём теперешнем двухядерном железе надо хук поставить на SeAccessCheck ntkrnlpa.exe (WinServ 2003) но как только movsd так синий экран и пишет что я пытаюсь врайт на реад-онли мемори, какова ей спрашивается дела, я ж из ring 0.
    :dntknw:
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    skyproc
    Причины три.
    1. Подкачка. Страница может быть выгружена в своп, изза чего обращение к ней на IRQL >= 2 приведёт к краху. Это не имеет смысла для секции кода ядра(она не выгружается).
    2. Не атомарная модификация кода на многопроцессорной системе. Перекрёстный код - пока первый процессор модифицирует две инструкции, заменяя их на одну, а второй процессор исполняет этот код, либо произошло переключение потоков и новый вызывает не до концы пропатченный код это приведёт к краху.
    3. Аппаратная защита страниц от записи. Обходится предельно просто - сбросом бита WP регистра управления #0(MSW), либо что излишне вызовом например MiProtectVirtualMemory etc.
     
  3. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    БОЛЬШОЕ Пасиба!
    Бум кавыять дальше...
     
  4. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Вот так усё работает!!!

    Код (Text):
    1. ;***************************************
    2. ;Âñòàâëÿåì Hoock          
    3. ;***************************************
    4. cli
    5. mov eax,cr0
    6. and eax,11111111111111101111111111111111b
    7. mov cr0,eax
    8.  
    9. mov edi,HoockOffset
    10. mov esi,offset NHoockJMP
    11. movsb
    12. movsd
    13.  
    14. mov eax,cr0
    15. or  eax,000000000000000010000000000000000b
    16. mov cr0,eax
    17. sti
    18. ;***************************************
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Сброс CR0.WP - грязный хак.
    Гораздо лучше через MDL работать
     
  6. Clerk

    Clerk Забанен

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

    Guest Guest

    Публикаций:
    0
    А чего не lock cmpxchg8b?
     
  8. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Great Ну извини какой же это грязный хак работа с регистрами проца, да и потом вреда от этого нет...
    Вот устанавить хук модификацией кода это другое дело, его то и грязным и немытым назвать мона
    :)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Дело в абстракции. Асм вставки лучше использовать по минимуму.
    А для работы с памтью ОС предоставляет специальный документированный механизм MDL
     
  10. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Ясно...

    А вот ещё проблемс...

    Поставил хук на входе усё работает OK
    Поставил на выходе полная опа, какието вызовы обрабатывает а потом бах и синий экран
    :dntknw:



    Код (Text):
    1. @SP_Hoock:
    2. pop ebx
    3. leave
    4.  
    5. pop RetHoockAddr
    6.  
    7. pop Param_1
    8. pop Param_2
    9. pop Param_3
    10. pop Param_4
    11. pop Param_5
    12. pop Param_6
    13. pop Param_7
    14. pop Param_8
    15. pop Param_9
    16. pop Param_10
    17.  
    18. ;*************************************************
    19. ;Modify var            
    20. ;*************************************************
    21. pushad
    22. pushfd
    23.  
    24.  
    25.  
    26. popfd
    27. popad
    28. ;*************************************************
    29.  
    30.  
    31. push    Param_10
    32. push    Param_9
    33. push    Param_8
    34. push    Param_7
    35. push    Param_6
    36. push    Param_5
    37. push    Param_4
    38. push    Param_3
    39. push    Param_2
    40. push    Param_1
    41.  
    42. push    @EndHook ; Если заменить на RetHoockAddr усё работает
    43. ;т.е. SeAccessCheck вернет управление вызвавшему коде
    44. ; иначе управление переходит на @EndHook и через минуту blue screen
    45.  
    46.  
    47. push    ebp
    48. mov ebp,esp
    49. push    ebx
    50.  
    51. xor ebx,ebx
    52. cmp byte ptr [ebp+24h],bl
    53. jmp [FuncAddrP]
    54.  
    55.  
    56.  
    57. @EndHook:
    58. ;*************************************************
    59. ;Modify result             
    60. ;*************************************************
    61. pushad
    62. pushfd
    63.  
    64.  
    65.  
    66. popfd
    67. popad
    68. ;*************************************************
    69.  
    70. push    RetHoockAddr
    71. ret
     
  11. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Код (Text):
    1. ;SeAccessCheck  proc       
    2. mov     edi, edi
    3. push    ebp
    4. mov     ebp, esp
    5. push    ebx
    6. xor     ebx, ebx            ;Енто и
    7. cmp     byte ptr [ebp+AccessMode], bl   ;Енто меняем на jmp
    8. jnz     short loc_56B5FC        ;Ну а после обработки попадаем сюда
    9. mov     eax, [ebp+DesiredAccess]
    10. test    eax, 2000000h
    11. jz      short loc_56B5E8
    12.  
    13. ;..........................
    14.  
    15. ;..........................
    16. ;SeAccessCheck  endp
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я нифига не понял странный у тебя какойто код
     
  13. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    Код (Text):
    1. jnz     short loc_56B5FC        ;Ну а после обработки попадаем сюда
    т е после своей обработки ты мягко говоря куда попало передаешь управление в середину функции?
     
  14. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Ну чё нипонятного

    В SeAccessCheck
    xor ebx, ebx
    cmp byte ptr [ebp+AccessMode], bl

    меняем на jmp @SP_Hoock

    @SP_Hoock: -> здеси начинается хук пердед тем как передать управление SeAccessCheck

    jmp [FuncAddrP] -> передаём управление обратно фции SeAccessCheck

    вот сюда ->
    jnz short loc_56B5FC ;Ну а после обработки попадаем сюда
    mov eax, [ebp+DesiredAccess]
    test eax, 2000000h
    jz short loc_56B5E8
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Зачем такой кошмарный сплайсинг в середине функции?
     
  16. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    o14189
    не ку да попало а перед этим я усё вернул на круги своя!!!

    Код (Text):
    1. push    ebp
    2. mov ebp,esp
    3. push    ebx
    4.  
    5. xor ebx,ebx
    6. cmp byte ptr [ebp+24h],bl
    7. jmp [FuncAddrP]
     
  17. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    "кошмарный сплайсинг "
    ну а чем плохо
    Покажи как дадо???
     
  18. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Ну и не в сплайсинге дело, я думаю...
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    1. Хотпатчинг.
    2. IRQL: PASSIVE_LEVEL, значит можно точки останова ставить.
    3. Сплайсинг. Перечисляем все в системе потоки и проверяем в контексте каждого регистр Eip, если в диапазоне адресов где сплайсинг выполняется, то корректируем значение в регистре, чтоб на буфер указывал.
    В семёрке это обёртка для SeAccessCheckWithHint().
    При подобном сплайсинге инструкции нужно в буфер копировать с учётом поправки(например условного ветвления).
     
  20. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Clerk чё та не очень понятно...