Призраки ядра или модули-невидимки

Руководящая идея


Пишем модуль как обычно, но в процедуре init_module() выделяем блок памяти вызовом __get_free_pages (или любой другой функцией из семейства kmalloc, см. врезку "чем выделять память"), копируем туда резидентный код, делающий что-то "полезное", перехватываем все необходимые системные вызовы, заставляя их передавать управление резидентному коду (который, кстати говоря, должен быть перемещаемым, т.е. сохранять работоспособность независимо от базового адреса загрузки). После этого мы возвращаем -1, сообщая системе, что init_module обломался.

Как результат — модуль _не_ загружается, но и выделенная им память _не_ освобождается, а это значит, что резидентный код продолжает работать! Причем, определить каким именно модулем был выделен тот или иной блок памяти в общем случае _невозможно_ и даже обнаружив резидентный код, антивирус ни за что не сможет сказать откуда он тут взялся!



Содержание раздела