Как вызвать KiSystemService?

Тема в разделе "WASM.BEGINNERS", создана пользователем IceFire, 9 май 2009.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Clerk

    IDT нужна для получения адреса обработчика 2E, т.е. KiSystemService, в котором потом ищем прыжок на KiSystemServiceReturn. Метод получения адреса KiSystemServiceReturn взял у Freeman'a. Про варю - образы системы разные стоят, хотя оба - WXP SP2. В одном прыжок на KiSystemServiceReturn выполнен так:

    Код (Text):
    1. .text:00407F14                 sti
    2. .text:00407F15                 jmp     KiSystemServiceReturn
    в другом - так:

    Код (Text):
    1. .text:00407EA1                 sti
    2. .text:00407EA2                 mov     eax, 0C000014Eh
    3. .text:00407EA7                 mov     edx, [ebp+3Ch]
    4. .text:00407EAA                 mov     [esi+134h], edx
    5. .text:00407EB0                 jmp      KiSystemServiceReturn
    Поэтому сигнатурный поиск и обламывается.

    Собственно, приведенный выше код перехват-то ставит, только вот ничего (кроме тупо jmp) в перехвате сделать нельзя - зависает система.

    Я хотел узнать почему так.
     
  2. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Да, кстати. Обработчик 2E в VM указывает в космос, цепочка байт по этому адресу ничего общего с оригинальным KiSystemService не имеет.

    Если где напутал - сильно не пинайте, я только учусь.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    IceFire
    Странная у вас вм
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Зачем сигнатурый? Ищи первую инструкцию JMP после KiSystemService
     
  5. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Ну да, вариант. Да не проблема это - в любом случае этот переход я найду. Меня больше интересует почему система падает при вызове DbgPrint.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    IceFire
    Наверно имеется ввиду KiSystemServiceRepeat()(xxReturn нет, возврат в KiServiceExit/KiServiceExit2()).
    Из шлюза не льзя читать(я бы не делал это). Там может быть что угодно. Да и незачем, ведь есть ядро в памяти и на диске. Элементарно всё ищется. Выполнять захват KiSystemServiceRepeat() следует если необходимо обрабатывать вызов в обход сст, либо для изолирования(эмуляции) её. В случае если требуется перехватить управление сразу перед вызовом обработчика сервиса(Ntxx()), то оптимальным решением в случае грубого перехвата является захват kssdoit, либо радом ниже кода, собственно тут и выполняется передача управления на обработчик сервиса. В случае захвата KiSystemServiceRepeat() придётся либо подменять адрес обработчика/адрес сст, либо выполнять часть кода после этой точки отдельно. Можно выполнить сплайсинг одной из инструкций, который проверяют диапазон юзермодного стека перед передачей управления на обработчик сервиса, т. е.:
    Код (Text):
    1.     3B35 D40E4900          cmp esi,dword ptr ds:[MmUserProbeAddress]
    2.     0F83 XXXXXXXX          jnb XXXX
    3.     F3:A5                  rep movs dword ptr es:[edi],dword ptr ds:[esi]
    4. kssdoit:
    5.     FFD3                   call ebx
    Тоесть захват не нужно делать атомарно ибо эти две инструкции имеют размер более Jmp near.
    Код парсинга для получения всех необходимых адресов/смещений в KiFastCallEntry/KiSystemServiceRepeat полноценный для XP/Vista/W7 выложен, по линку выше при желании можно найти.
    Но модификация кода хуже чем модификация указателей в сст. Впрочем это дела вкуса и возможностей.
     
  7. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Clerk

    А я написал xxxReturn? Гыы) Repeat, конечно.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    IceFire
    Грит уже поправил или есчо ктото не важно.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну вот как-то примерно так надо делать. У меня все отлично работает на виртуалке (2003 сервер).

    пс. jmp KiSSR_Hook можно заменить на call, если так больше нравится. и в конце джамп поправить на рет тогда.
     
  10. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Great

    Спасибо! А где найти ldasm.h?
     
  11. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Грит, спасибо. Я посмотрел твой исходник и чуть-чуть допилил свой - все заработало. Твой код я обязательно позже посмотрю повнимательней.

    И, если не трудно, дай ссылку на ldasm.h, которую ты использовал. Я вытащил какую-то из твоего отладчика, но компилер ругался че-то. На количество параметров у size_of_code().
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну лдасм вроде публичная либа и гулится легко.
    в любом случае,