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

       

Резидентный код в камуфляжных штатах


Вот мы и спрятали модуль! Теперь можно расслабиться и сгонять в Амстердам, чтобы зайти в Coffee-Shop и съесть пару аппетитных булочек известного содержимого. А пока мы там кайфуем, наш модуль имеют по полной программе все кому не лень. Как это так?! Мы же ведь замаскировались!!!

Замаскироваться-то мы замаскировались, но подобное грубое вторжение в таблицу системных вызовов навряд ли сможет долго остаться незамеченным. Существует куча утилит, проверяющих целостность sys_call_table и автоматически восстанавливающих ее, отбирая у резидентного кода все бразды правления. Но даже без них— указатель на системный вызов, расположенный вне ядра, вызывает слишком большие подозрения.

Чтобы не сгореть на первом же допросе, необходимо слегка изменить тактику: оставить в покое sys_call_table

и внедрить jump на резидентный код в начало перехватываемого системного вызова. Впрочем, jump в начале системных вызовов — весьма популярный (а потому широко известный) способ перехвата и опытные админы нас все равно запалят. Чтобы избежать расправы необходимо внедряться не в начало, а в _середину_ системных вызовов! А для этого необходимо тащить за собой целый дизассемблер, поскольку длина x86 инструкций непостоянна и варьируется в весьма широких пределах. Впрочем, можно пойти на хитрость и искать плацдарм для внедрения эвристическим путем, например, по сигнатуре: 85h C0h * 7x, соответствующей конструкции TEST EAX,EAX/Jx target. Звездочка означает, что между TEST EAX,EAX и Jx target может быть расположено несколько машинных команд. Во избежание ложных срабатываний не следует выбирать расстояние между 85h C0h и 7xh свыше 4х байт. Естественно, внедряя jmp near our_resident_code поверх TEST EAX,EAX…, необходимо предварительно сохранить затираемое содержание в своем собственном буфере и выполнить его перед передачей управления оригинальному системному вызову.

Важно отметить, что данный способ перехвата не является на 100% надежным и безопасным, поскольку существует ничтожная вероятность, что выполнение процесса будет прервано в момент установки jump'а и тогда он рухнет. Однако, rootkit'ы об этом могут не заботится, да и падения такие будет происходить не чаще, чем раз в сто лет.



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