Выравнивание секций и др.

Тема в разделе "WASM.BEGINNERS", создана пользователем KondraT, 12 июн 2007.

  1. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Имеется простой вирь, который дописывает себя в конец последней секции.
    После записи надо, как я понял, поменять следующие значения:

    1. SizeOfRawData, он же Physical Size. Размер секции на диске, кратный значению FileAlignment. Берем размер внедренного кода, делаем его кратным FileAlignment, складываем с SizeOfRawData и получаем новое значение SizeOfRawData.

    2. Virtual Size, он же Virtual Size. Не кратный ничему размер секции в памяти. Чтобы он не стал меньше, чем SizeOfRawData сделаем его равным SizeOfRawData.

    3. Characteristics. Ставим 0E0000000h т.е. в секции можно читать, писать и выполнять.

    Поправьте где я не прав, и что еще надо изменить.
    Поможите кто чем может
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    кратный значению SectionAlignment
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Не обязательно.

    Только в том случае, если он меньше чем SizeOfRawData. В противном случае его трогать не надо. Уменьшать его не стоит, иначе появятся дыры в размещении секций.
     
  4. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Так не всегда будет работать. Могут попасться файлы у которых последняя секция физически расположенная в файле виртуально располагается где-то между другими, и если увеличить ее VirtualSize, то может произойти наложение секций и файл не запустится. Если увеличивать значения у последней виртуальной секции то нужно следить за тем чтобы она проецировала добавленный в конец файла код.
    Т.е. SizeOfRawData = FileSize - AlignDown(PointerToRawData,FileAlignment) + NewDataSize
    Еще надо проследить чтобы VirtualSize у этой секции был либо VirtualSize + NewDataSize, либо SizeOfRawData, смотря какое значение больше
    SizeOfRawData и VirtualSize в win 2000/XP допускаются без выравниваний (в 9x хз)
    Еще не забыть изменить SizeOfImage = VirtualAddress + AlignUp(VirtualSize,SectionAlignment) последний виртуальной секции, и не забыть про оверлеи.

    PS: хотя это все довольно редко встречается и тоже не факт что после такого будет все правильно работать.
     
  5. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
  6. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    KondraT
    Можно почитать http://wasm.ru/article.php?article=peinfector.
    А еще советую под рукой иметь мануал по PE-формату от Hard Wisdom (правда там есть маленькие неточности и недоговорки).
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Угумс, и насколько я помню, винда не грузит бинарники с дырявыми секциями.
     
  8. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Спасибо за ответы. Сделал следующее:

    1. SizeOfRawData = AlignUp(ASizeOfRawData + VirusSize),FileAlignment
    2. VirtualSize: если VirtualSize + VirSize > SizeOfRawData то VirtualSize = VirtualSize + VirSize
    если VirtualSize + virsize <= SizeOfRawData то VirtualSize = SizeOfRawData
    после этого VirtualSize не выравнивал
    3. SizeOfImage = VirtualAddress + AlignUp(VirtualSize,SectionAlignment)

    yuzvir:
    Я перед этим ищу секцию последнюю физически и виртуально

    Про них как - то не подумал. А если я их затру кодом? :)
     
  9. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    В большинстве файлов оверлей можно просто передвинуть в конец, а в некоторых прийдется сначала объединять с файлом и дописываться уже после него. Хотя я бы на месте вируса вообще не трогал такие файлы, либо можно делать элементарные проверки, например в SFX RAR архивах его можно передвигать, а в некоторых инсталяторах нужно объединять и даже править где-то внутри CRC :)
     
  10. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Каким образом обнаружить наличие оверлея?

    Возможно ли таким образом:
    Если PointerToRawData + SizeOfRawData последней секции физ. и виртуально меньше полученного значения GetFileSize, то оверлей есть
    ?
     
  11. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Блин. Всю голову уже сломал!
    Вроде все ок, НО! Если в конец последней секции записывается только часть кода вируса, т.е. только до конца файла. Почему - не могу понять. После всех правок делаю как обычно: UnmapViewOfFile, CloseHandle, CloseHandle.
    Почему не увеличивается последняя секция и, соответственно, сам размер файла?
     
  12. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    а flush'ить не забыли?
     
  13. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    asmfan:
    Это как?
     
  14. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    FlushViewOfFile
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    asmfan
    если делаешь UnmapViewOfFile, flush'ить уже не обязательно.
     
  16. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Great
    Угум, точно, но там они "лениво" как-то пишутся на диск ;)
     
  17. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Я понял в чем проблема: я передавал CreateFileMapping параметр dwMaximumSizeLow равный нулю, поэтому проекция получалась равна размеру файла и не больше. Прийдется файл отрывать два раза - с его обычным размером и с размером + размер внедряемого кода
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Файлы лучше не отрывать, а то потом обратно не склеишь...
     
  19. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Great:
    Я имел в виду первый раз спроецировать для проверки файла на возможность его заражения, потом закрыть и опять спроецировать с размером + размер кода вируса
     
  20. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Чтобы не создавать новой темы, спрошу тут:
    поставил точку входа на последнюю секцию - НОД ругается.
    какие есть способы изменения точки входа кроме как оставить ту же и по ее адресу сделать jmp на код вируса. (мне кажется этот способ не очень удобный, т.к. надо будет сохранять, а потом восстанавливать первые байты программы).