Есть у меня драйверок, в нем разные манипуляции с хуками ф-ций через SDT и вставкой jmp. Что надо чтобы его перевести под 64 битную XP? - 64 битная OS - компилер под 64 битную OS - и вероятно переделка кода кто сталкивался именно переделкой 32 в 64 подскажите чего и как?
1) Читай статью - там все про портирование обычных драйверов на х64 http://msdn.microsoft.com/msdnmag/issues/06/05/x64/default.aspx 2) Не сможешь хукать функции через SDT - только сплайсингом 3) Нужно обходить PatchGuard 4) Нужно учитывать всегда включенный DEP Вроде бы больше ничего страшного нет... ЗЫ: 1+) Если пишешь на Visual, то придется убрать весь inline assembler - it`s not supported now
под 64 бита в принципе нельзы хукать через SDT? Т.е. никому сие не под силу, или только тем драйверам, которые изначально под 32 бита писались?
SDT какая-то левая в 64 то есть там мусор какой-то (на первый взгляд, я не понял что там) и еще она не используется а хукать-то можно и SDT и IAT и сплайсингом только через пару минут получишь BSOD
- это еще давно хотели сделать чтоб не хакерили, в Висте там вообще дофига убрали. С другой стороны нафиг тебе SDT. Некоторые проги умеют получать Shadow SDT или правильные адреса из ntoskrnl на харде, так что сплайсинг все же предпочтительнее, но не стабильнее (хотя проблем небыло). P.S. кое-какие проги проверяют перые 5 байт функции, так что осторожнее.
В SDT теперь хранятся RVA от начала таблицы. Это связано не с защитой, а с оптимизацией. Нет смысла хранить 8 байт абсолютного адреса, если достаточно 4-х относительного. Вряд ли ядро скоро вылезет за размер 4 гига Хукать через SDT теперь очень проблематично, потому что нужно найти свободную память в пределах плюс-минус 2 гига от начала SDT. Вероятность, что система там ее выделит крайне невелика
Весело, но все равно хукать SDT не актуально, КАСП именно поэтому и обходят, он дофига мутит c SDT и Shadow SDT (перемещает их, создает свои SDT)
Ну а для защиты там вполне бы и PatchGuard хватило бы, если б его до конца доделали. Только глупо это, имхо, чтоб от каждого тупого виря система в синий экран падала
Необязательно сплайсить адреса в SDT. Ее можно подменить, т.к. ее адрес хранится в PEB (но в одном из новых патчей ее оттуда убрали... Куда ? Кто знает ?)
fluderast Пост №6. Напрямую хукать SDT не выйдет. tylerdurden Для перехвата вызовов из ядра надо подменять адрес в структуре KeServiceDescriptorTable, а она защищается. Опять нужен обход PatchGuard. Можно. Только не думаешь, что это добавит геморроя?
> Можно. Только не думаешь, что это добавит геморроя? Та не, я не то хотел сказать, В описателе потока KTHREAD лежит адрес SDT, туда прописать
Согласен с тобой. Все же лучше сплайсинг, PatchGuard - обход, все мы прекрасно знаем что нет ничего невозможного, http://www.uninformed.org/?v=3&a=3
tylerdurden Да я так и понял. Имхо, не самый простой путь. Да и сам же говоришь, что указатель на SDT оттуда утянули. Хотя у себя посмотрел сейчас на WinXP64 - все на месте. Не знаешь, когда эту штуку удалили? Где-то краем глаза видел информацию, что обход PatchGuard через KeBugCheckEx прикрыли. Может быть этим же патчем?
а вы не могли бы чуть поподробнее объяснить как реализовать сплайсинг или дать линков где можно про него почитать? также не до конца понял, получается что хук функций через SDT реализованный для 32битной ОС после реализации обхода KPP работать под 64битную ОС не будет?