Ну вот и нашелся сисколл (не знал), только нам от этого не легче, если недостаточно проверяются поля структуры CONTEXT и привилегии, это мне пока не критично. Неужели брякнуться на сисколл такая непосильная задача для винды
semen Можно и через msr, просто тут на форуме видел заметку, что такой перехват может конфликтовать с программами которые сами модифицируют msr, но как я понимаю такие ситуации не слишком часты . Насчет трейсов я не могу подсказать к сожалению.
Значит пока осталось 2 направления возможного решения: 1. Найти кернел отладчик с уже подписанным драйвером, который можно использовать. 2. Исследовать возможность более-менее официального хука сисколов. Качаю WRK, надеюсь в нем есть поддержка трейсов и можно будет посмотреть как они сделаны.
ohne Найти лучший аналог никсового API ptrace в винде. Единственное что может ptrace и не может винда - брякнуться на сисколе. Сделать это в винде и есть тема.
На хэндлер чего? Нужно брякнуться на инструкции sysenter. Если речь о кернел моде то такие методы как обход патчгуарда, перезапись msr, использование dr* крайне нежелательны. Хочется найти более-менее официальный метод через каллбеки (пока есть надежда, т.к. трейсы както релизованы же), если до кернела вообще дойдет.
semen А что эта инструкция делает знаешь ? Вот на хэндлер точку останова и ставим. Кстати в манах сказано что регистр флажков можно заранее определить: Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A 4.8.8 Fast System Calls in 64-bit Mode • EFLAGS — Loaded from R11. Не знаю что за регистр, но вероятно в него можно записать маску для EFlags.TF и тогда при вызове будет сгенерировано трассировочное исключение.
semen Посмотрите в wrk файлы, имеющие отношение к WMI events (Ntwmi.h, Callouts.c), похоже это то, что вам нужно.
Clerk Конечно я смотрел как работает эта инструкция еще до старта топика. Почему и написал в самом начале, что dr* мне ничем не помогут, поставить бряк на этот хендрер нельзя т.к. произойдет перегрузка контекста и dr* будут уже другими. TSS Вот это и смотрю сейчас.
semen >Под никсами реализовал через ptrace - все работает Можно подробнее? Просто в винде как я понял Trace API нужен для профилирования и статистики, и если ктото выполнит sysenter, то это мы увидим, поймав event, но изменить то уже не сможем. Хотя там можно установить нотификаторы вроде как... Вобщем расскажите как это работает в линуксе, оч интересно )
semen без хуков в язде тут не обойтись, иначе производительность будет падать тк придеться проверять каждую инструкцию, хотя есть такая проблема что чтобы проверять надо знать что делает конкретный вызов, а это значит писать по сути обработчик для всех "опасных вызывов" да ко всему этот способ не документированный.. короче куча минусов, и узких мест. PS не понимаю что в этой теме изначально было не понятного, автор все ясно расписал еще в первом посте.
SPA Описал он не ясно, ибо сам не понимает. Почему адрес обработчика мср не записать нужный ? Это не подходит, обязательно надо как в линукс.. нужно чтоб трассировочное исключение возникало. Да будет известно что механизм входа в сервис и возврата реализован криво в виндоз и не позволяет выполнять какойлибо останов или нотификацию дебуггера, за исключением релоада Dr - контекста.
TSS ptrace -- древнючий (и некогда единственный) способ отладки в UNIX. В linux, например, его уже нет, но в FreeBSD 6.2, например, еще можно встретить. Позволяет отлаживать только непосредственного потомка отладочного процесса, и то, только с позволения отлаживаемого процесса (трассируемый процесс должен сам выполнить ptrace с командой PT_TRACE_ME). С помощью ptrace можно читать и писать в адресное пространство отлажваемого процесса и получать некоторые события из него. Почитать про ptrace можно, например, здесь: http://www.freebsd.org/cgi/man.cgi?query=ptrace&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html
А, ну это аналог debug api в винде практически. Значит WMI ф-ции которые я посоветовал выше не подходят, они реализованы для профилирования и в данной задаче ничем не помогут. Остается только хватать sysenter.
TSS Именно, трейс апи нам не поможет для реализации задуманного, но возможно мы можем сделать "хороший" перехват сисколов так же как это делает трейс апи, если дойдет до решения в кернеле. В никсах сделано очень просто - есть калбеки непосредственно для ptrace: http://lxr.free-electrons.com/source/arch/x86/kernel/entry_64.S В юзерможе же надежна на уже существующий и подписанный драйвер от какого-нибудь отладчика или самого мс. Ведь процесс подписи драйвера процесс не быстрый и не бесплатный, а не подписанный драйвер только для домашних поделок годится, где можно отключить проверку подписи. SPA Я просто неверно рассчитывал, что все знают, что такое ptrace. Отредактировать, увы, уже не могу.
Clerk Я знаю про перехват через msr, я же его сам предложил TSS вместо установки dr. Криво не криво, а както сделать придется. Если я не прав и установкой dr в юзермоде можно обойтись - поправь, это первое что я попробовал и не получилось, потом и прочитал что не выйдет и почему. Да и странно бы было, что юзермодный отладчик вдруг брякнутля на инструкции в 0м кольце. Мне не обязательно отладочное исключение, мне всеравно как, но лучше обойтись без кернела, например с уже существующим драйвером через иоктл пообщаться, я не против. Mika0x65 В линуксе он никогда не исчезал, даже в самых последних кернелах. У х64 кернела даже долгое время был эксполит его юзающий. А другого адекватного АПИ для отладки в нем и нету до сих пор (покрайней мере проштудировав все сисколы x64 кернела я не нашел другого).