Перехват АПИ, сплайсинг Vista, kernel

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

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Забыл добавить если push # занимет больше 2-х байт, тогда использовать cmpxchg8b.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Давай конкретнее, что там у тебя не выгружается и при чём здесь это?

    Ты говоришь о технологии hot-patching. Во-первых, это не универсально, во-вторых не будет работать на Windows XP < SP2 и Windows Server 2003 < SP1, т.к. там тупо нету эти пяти nop'ов.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    Конкретнее не могу сказать, я даже не знаю где падает(просто тупо пролистал приведённый код найдя cli). Не пойму какие о мне вопросы, это же не уменя падает. На счёт универсальности - конечно не универсально, подойдёт для висты, хп и 7. Просто наиболее общее решение, далее для частных решений всё зависит от функции, может на десятой подходящей инструкции сплайсинг выполняется. Это есчо и не актуально, сплайсинг - метод чрезвычайно не желательный для применения.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ещё раз: для Windows XP не будет работать.
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Так, автор, давай-ка подгрузи символы для своего драйвера и покажи, как на самом деле выглядит вот этот кусок стека:

    Код (Text):
    1. ...
    2. 94b02954 90517a91 819999c0 94b029c8 905201ac KernelProtect+0xbc06
    3. 94b029ac 9051a80d 819999c0 819999c0 94b029c8 KernelProtect+0xca91
    4. 94b02b20 9051aa90 819999c0 00000020 819999c0 KernelProtect+0xf80d
    5. 94b02b50 9051aae3 819999c0 00000005 00000000 KernelProtect+0xfa90
    6. 94b02b98 90511a16 819999c0 90510470 905254c0 KernelProtect+0xfae3
    7. 94b02be0 9050e62a 00000004 81933c0e 00000000 KernelProtect+0x6a16
    8. 94b02c2c 8188a976 84256538 84037a80 84037a80 KernelProtect+0x362a
    9. ...
    И сразу же давай сюда код последней твоей функции (KernelProtect+0xbc06). И строчку покажи, на которой падает, там в WinDbg это можно. Идей у меня пока нет, что там у тебя, так что будем детально разбираться, возможно, просто глупость какая-нибудь.
     
  6. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Хм... А альтернатива сплайсингу через jmp или push какая?
    Перехват через SDT? Но его очень легко снять. Причем даже если драйвер налету восстанавливает свои хуки -- по барабану. Можно прочитать родную SDT и установить для конкретного потока.
    Вот создал поток, востановил ему SDT, выполнил операции и ни один SDT хук не сработал.

    В конце концов jmp можно в самом деле спрятать подальше от начала ф-ции. И в таком случае снять хук проблематично.
     
  7. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    :)))

    Да разобрались ведь уже.
    Дело было в запрете прерываний (cli) перед установкой хука.
    Т.к. некоторые куски кода были выгружены, то при обращении к ним винда хотела подгрузить страничку, но прерывания-то запрещены.
    Следовательно для фикса сделалось следующее:
    - перед установкой хука добавил чтение N байт по адресу ф-ции
    - запрет прерываний
    - установка хука
    - разрешение прерываний

    И так для каждой ф-ции.

    Почему сие работало вплоть до Висты? -- хз на самом деле. Мот под Вистой подкрутили какой менеджер памяти и он стал чаще выгружать те куски, которые выгружались редко, или вообще не выгружались. Это предположение...

    Clerk
    А на счет атомарных операций буду пробовать, в самом деле тема.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    Что именно не будет работать для XP ?
    В #19 кусок кода из XP..
    sasha_s
    Всё снимается элементарно, только с возможностью краха. Вся проблема в следующем. Допустим выполняется замена двух инструкций на одну, например:
    Код (Text):
    1. IP:
    2.     mov edi,edi
    3. (IP + 2):
    4.     push ebp
    5. (IP + 3):
    6.     mov ebp,esp
    Заменяется на длинный джамп(5 байт). Допустим в системе более одного процессора. Какойто процессор выполнил первую инструкцию(по IP) и был прерван, а далее контекст треда сохранён и процессор переключени на исполнение другого потока. Тут мы затираем три инструкции джампом. Спустя некоторое время первый процессор переключается на тот поток и начинает исполнять вторую инструкцию. Но там уже другая инструкция, которая формируется частью смещения в джампе и всё падает.
    Как это решить - можно залочить страницу и выполнять модификацию кода в IPI, это ничего не даст. Нужно перечислять все треды в системе, проверяе где он был прерван, и изменять его Eip на обработчик перехвата, но это ничем не лучше, чем однобайтовые точки останова(тотже Int3), обработка исключения на быстродействии не скажется(проверялось - ничего не тормозило), в этом случае обнаружение обработчика весьма проблемно или вобще не возможно.
    В любом случае модификация кода худшее решение. DCOM и тп. рулит, хотя в случае SST это также уже не вариант, лишь только для легального софта(не руткиты, не защита и тп.).
     
  9. x64

    x64 New Member

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

    А вот это чушь, потому что существует небольшая, но всё же отличная от нуля вероятность, что между чтением страницы и запретом прерываний страница снова будет выгружена. Для решения этой проблемы можно использовать MmProbeAndLockPages() + MmMapLockedPagesSpecifyCache().

    Похоже, что так, вроде даже что-то такое слышал (в гугле можешь попробовать найти и почитать об оптимизациях памяти в Vista).
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я же написал - на Windows XP < SP2 нету тех пяти nop'ов, на которые ты полагаешься при установке short jmp'а.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    А точно не заметил. Я полагался последний раз при захватах сервисов на трассировку KiSystemServiceRepeat до kssdoit в KiDebugRoutine. Джампы уже очень давно не вписывал.
     
  12. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Да, про опасность БСОДа на многопроцессорных системах я знаю.
    Резюме, если я правильно понял:
    - устанавливаем свой обработчик исключений
    - вписываем интсрукцию Int3 в нужные места, но не в начало шапки, чтобы затруднить снятие хука.
    Так?
    - ловим исключения, смотрим откуда ну и т.д.

    Вот этой фразы не понял. DCOM -- в кернеле это что?
     
  13. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    А гдебы про все эти умные вещи прочитать?
    Ну МСДН понятно, но может есть статьи где собраны способы перехвата апи в кернеле?
    Если нет -- то может их стоит написать. Благодарных будет.... уйма.
    :))
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Сорри, опечатка - DKOM(Direct Kernel Object Manipulation). В общем не только обькты, но есчо и ядерные структуры к этим техникам отнести можно.
    Так я ж вам линк в какомто топике на сурцы давал по этой технике.)
     
  15. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Спасибо, поищу.
     
  16. x64

    x64 New Member

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