Great Что значит нету. Так или иначе вызвать то их можно, а значит надо делать перехват в самом механизме вызова (INT2E или SYSENTER). И вообще по определению такой сплайсинг не корректен, бажен, не переносим. То есть IMHO толку от него.
нет, я имею в виду функции экспортируемые ядром, но не доступные из ring3. Поэтому их записей в SSDT нету, насколько я знаю (нафиг эти записи нужны, если через INT 2E/SYSENTER никто к ним обращаться не будет, а только драйвера напрямую). Примеры - ExAllocatePoolWithTag, IoAllocateMdl, ExFreePool, KeBugCheck, и многие другие. Иногда надо захукать некоторые. Вот я и говорю, что CC-бряк тут как нельзя кстати. Противопоказания по этому поводу есть?
Конечно Например правка IDT. Хотя IMHO это не очень большой недостаток, но некоторые люди на форуме говорят что это ахтунг :P Я склонен им доверять.
Ну в ядре вродебы действует один поток. То есть пока идёт работа в ядре, другой поток не может вызвать эту функцию. А значит IMHO можно сделать сплайсинг, когда управление перейдёт в твою функцию снять хук, подменить стек на возврат в свою функцию, и кода сработает RET поставить хук снова, и возвратиться по оригинальному адресу возврата.
Потоки не планируются при IRQL >= DISPATCH_LEVEL. При Passive и APC насколько я знаю поток может прерваться в режиме ядра спокойно.. это раз. Два, как уже сказали, мы можем ставить хук в тот момент, когда другой поток выполнял ее начало. Ну это же лучше, чем писать спласинговый джамп частями?)
Угу? Многозадачная ОСь пустой звук? :P Когда как. Джамп довольно трудно отловить если он грамотно сделан. А правку IDT очень просто(конечно если втупую писать в него :P).
n0name ну речь же не идет пока что о том, что хлеще палится антивирями ) речь идет о безопасности вообще способа. Ведь можно и систему свалить, если джамп частями писать. Правда вероятность очень мала, что поток другой прервется именно в этот момент. Хотя это зависит от того, насколько часто вызывается функция. Если это например ExAllocatePoolWithTag, то шанс свалить систему велик.
дада. на время сплайса желательно вобще тормозить все потоки, если сплайс делать частями. но ведь это гемор страшный. и опять же какой должен быть IRQL, чтоб не прервали.. и в этом случае проверка еип, всеголишь составляющая часть процесса
ну да, я собственно об этом и говорю только я лично юзаю 0f 0b - мне так удобнее для отладки в любое время в релизе можно заменить на сс, если понадобится
UD2... да ну.. INT3 вроде удобнее) хотя кому как FreeManCPM уже наколбасил какой-то код для подмены обработчика в IDT для INT3 .. Да собсна там все просто. SIDT, потом адрес записи в IDT равен IDT_base + 3*8. Первые два байта - одна часть адреса, + 4 байта - другая часть адреса. Плюс желательно потом сделать LIDT для обновления регистра (кажется, процессор кеширует дескрипторы из таблиц, поэтому после изменений в таблице надо сделать снова LxDT, x=G/I/L )
мне часто приходится дебажиться виндыбыгой а не айсом поэтому так айс не идет на многих железных машинах вообще, кстати в IDT я не лазаю, мне только юзер-моду надо, юзаю вехи