Здраствуйте. Я уверен что многие раьотали с SICE. Вобшем мне необходимо написать драйвер для моего антивируса который бы сканировал память на наличие вирусов. Для этого мне необходимо получить список контекстов. Ну как в сайсе. Там ешё была команда переключения процесса. Так вот проблема в том что я не знаю как получить список контекстов и как сменить контекст. Не подскажете как ?
А кто дает драйверу право переключать процессы? По-моему сия процедура закончится в лучшем случае синим экраном или вообще черным А читать/писать в адресное пространство процесса можно и из режима пользователя(намного проще). А для режима ядра надо использовать кучу недокументированых фишек и программа будет как софтайс работать только под ту винду и тот сервиспак под который заточена.
Тоесть только через ReadProcessMemory и WriteProcessMemory. Помойму похукать эти функции и не дать себя читать очень просто. Вроде бы перехват подобных действий организуется в протекторах чтоб не сдампили. А мне надо читать вобше всё. Тоесть перекелючить контекст процесса вобше нереально из под драйвера. Хотя поиде можно хукать определённую функцию и чекать память процесса на вирусы. Т.К во время хука я буду в контексте процесса вызвавшего функцию. Далее я буду создавать ешё один тред в этом процессе который собсна и будет читать память и чекать её на сигнатуры с интервалом в 20 секунд допустим. Как вам план ? Реально ли такое ? И будет ли это тормозить оч сильно если пустить этот тред с низким приоритетом ? Ну и всётаки реально ли организовать переключение или попадание в чужой контекст не по изврашенскому ?
Контекст переключается функциями KeAttachProcess/KeDetachProcess KeStackAttachProcess/KeUnstackDetachProcess На вход нужен будет указатель на EPROCESS. Получить их для всех процессов можно несколькими способами. Например, получить список всех процессов вызовом ZwQuerySystemInformation с классом SystemProcessesAndThreadsInformation. Оттуда взять ProcessId и подпихивать их PsLookupProcessByProcessId. Она вернет нужный указатель. Или можно пройтись по списку EPROCESS.ActiveProcessLinks. Его голова в переменной PsActiveProcessHead. К сожалению, она не экспортируется. Зато экспортируется PsInitialSystemProcess. Можно за него зацепиться. Единственная проблема - во время обхода нужно блокировать доступ к этому списку. Система делает это вызовом PsLockProcess/PsUnlockProcess. Поройся на rootkit.com - там полно такого кода.
А софтайс у меня вообще их не импортирует(кроме PsInitialSystemProcess). Видимо он предпочитает использовать грязные хаки вместо фирменных API Или они не были документированы на момент написания сайса?