В DriverEntry выделил память, перенес код драйвера туда, поправил релоки. Вернул STATUS_UNSUCCESSFUL. рку и гмер видят загруженный драйвер! И не только видят, но и показывают адрес образа, откуда загружен был. Как это возможно? Что происходит после возвращения такого кода? (всегда считал, что диспетчер сносит все остатки дрова).
Все освобождается, реад зиз факен вэрэка! =) Если я правильно понял палится наличие копии загруженного и уже релокированного имаджа -- вероятно по пе-хэдеру в памяти, попробуйте затереть =)
Та они же одноразовые типа)) Они не должны запоминать работу системы. Хотя я конечно могу ошибаться. Ты новый драйвер в новом потоке то запустил ?
Нового потока нет, в одном из модулей системы стоит сплайс на релокованый имидж. Я бы понял, если бы рку и гмер писали бы что-то вроде "unknown module". Но они выпаливают и имя модуля, и адрес, откуда он был загружен. А этой инфы в ре-хидере нет. Если запоминают - как?
Кстати. ImageBase в выпаленном образе старые - т.е. те, которые были в оригинальном дрове, еще до завершения его с STATUS_UNSUCCESSFUL.
Ну чудес-то не бывает. Значит где-нибудь всё таки сохраняется эта информация в системе, в недокументированных внутренних структурах каких-нибудь. Это надо исходники ядра смотреть, так на вскидку не скажу.
Ну тогда всё понятно, в этом случае объект драйвера не уничтожается после выхода из DriverEntry(), следовательно, антируткиты находят его без труда.