Изменение параметров секции и NT Header

Тема в разделе "WASM.BEGINNERS", создана пользователем mitsumi, 21 май 2011.

  1. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Пытаюсь написать простой инфектор. Добавляю код в последнюю секцию. Длина кода - 7 байт.
    Но после изменения параметров таблицы секции и нт хидера, загрузчик выдает сообщение о том, что ехе не является win32 приложением.
    Код (Text):
    1.     ulOffset = (unsigned long) pMapping + pLastSection->PointerToRawData + pLastSection->SizeOfRawData;
    2.  
    3.     // infecting; simple jump to entry point
    4.  
    5.     *(unsigned char *) ulOffset = 0xBF;
    6.     ++ulOffset;
    7.     *(unsigned long *) ulOffset = pNtHeader->OptionalHeader.AddressOfEntryPoint + pNtHeader->OptionalHeader.ImageBase;
    8.     ulOffset += 4;
    9.     *(unsigned short *) ulOffset = 0xE7FF;
    10.     ulOffset += 2;
    11.  
    12.     for ( ; (ulOffset - (unsigned long) pMapping)<ulNewSize; ++ulOffset )
    13.         *(unsigned char *) ulOffset = 0x00;
    14.  
    15.     pNtHeader->OptionalHeader.AddressOfEntryPoint   = pLastSection->VirtualAddress + pLastSection->SizeOfRawData;
    16.     pLastSection->Characteristics                   |= IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
    17.     pLastSection->Misc.VirtualSize                  = pLastSection->SizeOfRawData + 7; // size of section without file aligment
    18.     pLastSection->SizeOfRawData                     = AlignSize(pLastSection->Misc.VirtualSize, ulFileAligment); // size of section with file aligment
    19.     pNtHeader->OptionalHeader.SizeOfImage           = pLastSection->VirtualAddress + pLastSection->Misc.VirtualSize;
    Подскажите где ошибка. Подозреваю что я задаю неправильные данные для VirtualSize или SizeOfRawData.
     
  2. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Файл лучше бы выложили выходной
     
  3. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Прошу прощения. Оказалось что у меня была ошибка в поиске последней секции. Сейчас инфектится, но при запуске программа валится. OllyDbg вроде показует какое-то исключение. Прикрипляю оригинальный и выходной файлы.
     
  4. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    И в чем проблема? Обе программы работают идентично.
     
  5. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Хм. У меня оригинал есс-но работает нормально, а при запуске инфицированного ехе вот такая картина:
    [​IMG]
     
  6. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Возможно из-за флажка "Executable as code"
    [​IMG]
     
  7. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Выставил данный флаг. Результат тот же.
     
  8. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Это работает?
     
  9. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Выставите размер так
    [​IMG]


    должно быть выровнено по границе выравнивания секций (если по-русски то Size of Image должен быть выровнен по Section Alignment)
    У меня заработало

    Ой напутал я что-то...
     
  10. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Сделал как вы сказали
    Код (Text):
    1. pNtHeader->OptionalHeader.SizeOfImage   = ALIGN_SIZE(pLastSection->VirtualAddress + pLastSection->Misc.VirtualSize,
    2.                                         pNtHeader->OptionalHeader.SectionAlignment);
    SizeOfImage стало равно 6000 как на вашем скриншоте, но приложение все-равно рушится...
     
  11. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Робит этот семпл на XP. После нескольких десятков инструкций отладчик был завершён, так как тривиальный поиск ошибок не заслуживает моего внимания.
     
  12. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    К сожалению на XP работает а вот на 7ке нет( Так что все тут немного хуже. Проблема в последней секции, как не странно)) но сейчас нет времени разбираться, гляну завтра и отпишусь
     
  13. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Что могу сказать, проблема в ЭТОМ, конкретном файле. В чем конкретно дело буду разбираться... видимо какая-то особенность реализации загрузчика под 7 (в ХР работает)
    Кстати внедрять код в конец это не очень антивирям нравится)
     
  14. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Вот простой Hello, world инфецированный, который тоже валится.
    Про антивирусы знаю, но я инфектор пишу чтобы больше разобратся в PE формате )
     
  15. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Фокус в том что представленный файл если поменять EP на адрес из другой секции то он валится, так что инфецирование тут не сильно при чем....
    Нет 7 ки под рукой, поэтому не могу на загрузчик посмотреть( Но Вам спасибо интересный вопрос...
     
  16. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    http://dl.dropbox.com/u/22509984/infected_1.exe

    это работает?
     
  17. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Я еще давно об этом подумал, но под рукой семерки не было, дело все в том что ты жестко прописываешь виртуальный адрес оригинальной точки входа. А модуль грузится по другому базовому адресу в Win7 из-за ASLR, и соотвтественно прыжок идет в космос. Либо записыай относительный джамп, либо добавляй адреса в таблицу базовых поправок.

    Либо установи флажок Relocation Stripped (1 бит) в PE Characteristics
     
  18. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Нет, тоже валится.
    Когда я провожу ехе в олли, то исключение выбивает еще до выполнения комманды помещения адресса джампа в регистр. Т.е. до jmp edi даже не доходит. В вашем примере тоже самое происходит.
     
  19. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Вы обречены. http://dl.dropbox.com/u/22509984/infected_2.exe
     
  20. mitsumi

    mitsumi New Member

    Публикаций:
    0
    Регистрация:
    21 май 2011
    Сообщения:
    8
    Заработало. Спасибо.

    P.S.:
    Код (Text):
    1. pNtHeader->FileHeader.Characteristics           |= IMAGE_FILE_RELOCS_STRIPPED;