суббота, 22 января 2011 г.

имею глупый вопрос

даже два. Вот например есть самописный драйвер под винду.

Вопрос нумбер ван.
В драйвере есть ioctl с METHOD_OUT_DIRECT. Соотв-но все как положено

pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

после чего например мне нужно сделать KeStackAttachProcess к чужому процессу и писать всякое в полученный ранее буфер pOutputBuffer, который указывает на некие страницы теперь в другом (?) процессе. Оно таки крашнет например в таком случае ?

Вопрос нумбер ту
А вот например во все том же ранее упомянутом драйвере есть некая либа, которая юзается только в DriverEntry. Причем функций там дофига немало. Хочется весь код функций из этой либы вынести в секцию INIT. Скажем если бы это была простая функция можно было бы сделать как букваре описано:

#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, MyCoolStartup666)
#endif


а можно ли как-нть сказать линкеру - вот эту либу всю целиком суй в сегмент INIT ? Потому что перечислять все ф-ции из либы вручную - очень не хочется при компиляции самой либы и бесполезно после, потому что они уже в каком-то отличном от INIT сегменте живут

6 комментариев:

  1. 1. Не крашнет, адрес же будет в ядерный, а значит - валидный для всех процессов:

    MmGetSystemAddressForMdlSafe returns the base system-space virtual address that maps the physical pages that the specified MDL describes. If the pages are not already mapped to system space and the attempt to map them fails, NULL is returned.

    В system-space, при переключении между АП пользовательских процессов, может меняться только содержимое hyper space.

    2. Скорее всего нельзя. Я в своё время не нашел способа, во всяком случае.

    ОтветитьУдалить
  2. ага, спасибо. Собственно оно работает, только я не понимал как :-)
    А вот лично к тебе есть еще один вопрос - поскольку свежий nobunkum с ноября так и не выходит. Насколько я понимаю ты решал задачу определить какие rpc сервера зарегистрированы в процессе. Решается ли обратная задача - у нас есть rpc сервер в некотором процессе, к которому я имею доступ из kernel mode, и нужно перечислить всех его клиентов в данный момент времени ?

    ОтветитьУдалить
  3. Технически - решаема, но на практике там будет много дрочева с полями внутренних объектов rpcrt4 и списками, которые они используют (но зато более-менее одинаково для XP - Vista - 7). Если RPC по пайпам или LPC-портам - то проще будет тупо перечислить открытые дескрипторы для соотв. объектов.
    Тоже кстати пробовал использовать в своем драйвере апи msrpc.sys, доставило.

    ОтветитьУдалить
  4. но pipes можно и мимо rpc использовать
    равно как и (a)lpc ports (и сокеты самое главное) могут принадлежать разным интерфейсам, а нужно отследить совершенно определенный например

    а чем msrpc доставил ? он же умеет только user mode rpc сервера дергать, если ida pro меня не обманула ?

    ОтветитьУдалить
  5. А, вот ешё вариант, может подойти если тебе нужно решать эту задачу не сиюминутно, а в режиме мониторинга: перехватывать ввод-вывод для пайпов/портов/итд. и с пойманных данных выдирать UUID-ы интерфейсов, делать анмаршалинг параметров вызовов, итд.

    Ага, он только RPC_PROTSEQ_LRPC умеет. Но всё равно удобно, когда нужно быстро реализовать какое-нибуть сложное получение данных от драйвера, а городить свой протокол на IOCTL-ах, шаред-мемори, пайпах, итд. - лениво.

    ОтветитьУдалить
  6. это ж надо фильтры писать на npfs/tdi + парзер плохо документированных данных. Я даже не знаю что легче - выдрать все нужные структуры из rpcrt4.dll или заморачиваться кучей kernel mode кода

    про msrpc - как я уже говорил, виста & 7ая вообще намного более приспособлены для комфортного проживания в kernel mode, бгг

    ОтветитьУдалить