Clerk IDT нужна для получения адреса обработчика 2E, т.е. KiSystemService, в котором потом ищем прыжок на KiSystemServiceReturn. Метод получения адреса KiSystemServiceReturn взял у Freeman'a. Про варю - образы системы разные стоят, хотя оба - WXP SP2. В одном прыжок на KiSystemServiceReturn выполнен так: Код (Text): .text:00407F14 sti .text:00407F15 jmp KiSystemServiceReturn в другом - так: Код (Text): .text:00407EA1 sti .text:00407EA2 mov eax, 0C000014Eh .text:00407EA7 mov edx, [ebp+3Ch] .text:00407EAA mov [esi+134h], edx .text:00407EB0 jmp KiSystemServiceReturn Поэтому сигнатурный поиск и обламывается. Собственно, приведенный выше код перехват-то ставит, только вот ничего (кроме тупо jmp) в перехвате сделать нельзя - зависает система. Я хотел узнать почему так.
Да, кстати. Обработчик 2E в VM указывает в космос, цепочка байт по этому адресу ничего общего с оригинальным KiSystemService не имеет. Если где напутал - сильно не пинайте, я только учусь.
Ну да, вариант. Да не проблема это - в любом случае этот переход я найду. Меня больше интересует почему система падает при вызове DbgPrint.
IceFire Наверно имеется ввиду KiSystemServiceRepeat()(xxReturn нет, возврат в KiServiceExit/KiServiceExit2()). Из шлюза не льзя читать(я бы не делал это). Там может быть что угодно. Да и незачем, ведь есть ядро в памяти и на диске. Элементарно всё ищется. Выполнять захват KiSystemServiceRepeat() следует если необходимо обрабатывать вызов в обход сст, либо для изолирования(эмуляции) её. В случае если требуется перехватить управление сразу перед вызовом обработчика сервиса(Ntxx()), то оптимальным решением в случае грубого перехвата является захват kssdoit, либо радом ниже кода, собственно тут и выполняется передача управления на обработчик сервиса. В случае захвата KiSystemServiceRepeat() придётся либо подменять адрес обработчика/адрес сст, либо выполнять часть кода после этой точки отдельно. Можно выполнить сплайсинг одной из инструкций, который проверяют диапазон юзермодного стека перед передачей управления на обработчик сервиса, т. е.: Код (Text): 3B35 D40E4900 cmp esi,dword ptr ds:[MmUserProbeAddress] 0F83 XXXXXXXX jnb XXXX F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi] kssdoit: FFD3 call ebx Тоесть захват не нужно делать атомарно ибо эти две инструкции имеют размер более Jmp near. Код парсинга для получения всех необходимых адресов/смещений в KiFastCallEntry/KiSystemServiceRepeat полноценный для XP/Vista/W7 выложен, по линку выше при желании можно найти. Но модификация кода хуже чем модификация указателей в сст. Впрочем это дела вкуса и возможностей.
Ну вот как-то примерно так надо делать. У меня все отлично работает на виртуалке (2003 сервер). пс. jmp KiSSR_Hook можно заменить на call, если так больше нравится. и в конце джамп поправить на рет тогда.
Грит, спасибо. Я посмотрел твой исходник и чуть-чуть допилил свой - все заработало. Твой код я обязательно позже посмотрю повнимательней. И, если не трудно, дай ссылку на ldasm.h, которую ты использовал. Я вытащил какую-то из твоего отладчика, но компилер ругался че-то. На количество параметров у size_of_code().