Blog. Just Blog

"FASM и UPX: созданы друг для друга"

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Сразу скажу, утро и кофе к этой статье отношения не имеют, все необычные решения приходят ко мне обычно по ночам. Однажды я экспериментировал с FASM, и обнаружил один интересный момент. Ниже приведен ассемблерный листинг самой простейшей программы, она выводит на экран сообщение и сразу же завершает работу, вроде бы ничего необычного.
  1. section '.code' code readable executable
  2.  
  3.   start:
  4.         ; Вывести окно сообщения и выйти из программы
  5.         invoke  MessageBox, NULL, szMess, szTitle, MB_OK
  6.         invoke  ExitProcess,0
  7.  
  8.         ; Куча пустого места, чтобы можно было упаковать файл
  9.         rd      1000h
  10.  
  11. szTitle db      'Title',0
  12. szMess  db      'Hello, UPX ;)',0
  13.  
  14. ;---------------------------------------------
  15.  
  16. section '.idata' import data readable writeable
  17.  
  18. ; Обратите внмание, user32.dll прописан дважды
  19. library kernel32,'kernel32.dll',\
  20.         user32,'user32.dll',\
  21.         user32,'user32.dll'
  22.  
  23. include 'apia\kernel32.inc'
  24. include 'apia\user32.inc'
Но обратите внимание, что в секции импорта user32.dll прописан дважды. Это и есть та самая фишка, которую я случайно обнаружил. Блок нулевых байт в середине нужен, чтобы файл получился большой и его можно было упаковать. В реальных приложениях, скорее всего, такие избыточные данные не понадобятся.

Теперь компилируем его и проверяем, все запускается нормально. Сжимаем полученный файл бесплатным упаковщиком исполняемых файлов UPX. Проверяем упакованный файл - тоже никаких проблем с запуском. Распаковываем файл при помощи самого UPX командой upx -d и снова пробуем его запустить. Программа сразу же падает с ошибкой инициализации 0xC00000005 (ошибка в импорте). Я попробовал несколько разных версий пакера - результат всегда одинаковый, видимо от версии UPX ничего не зависит. Получается этакая простенькая "защита" от распаковки "для самых маленьких". Конечно, от ручной распаковки и восстановления импорта этот способ не помогает, ну и также никто не мешает подправить распакованный файл в любом PE-редакторе, который умеет работать с таблицей импорта. Так что это скорее забавный глюк, нежели реальный способ защиты программ.

В приложении исходник программы, скомпилированный файл, работающий упакованный файл и распакованный файл с ошибкой для демонстрации.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

UPX.Crash.Demo.zip (2,656 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 6099 | Комментариев: 10

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (24.01.2020 в 16:57):
Цитатакак сделать так, чтобы FASM создавал наименьший возможный заголовок, примерно как у Upack?

Вся прелесть FASM в том, что он идет в исходниках. Заголовок у компилируемого файла собирается в сырке SOURCE\FORMATS.INC (поиск по метке "make_stub" и далее), можно отредактировать код как надо и собрать свой компилятор FASM, который будет сразу оптимизировать файлы еще на этапе сборки. Другой вопрос, кто этим будет заниматься с поддержанием всех новых версий.
Сойфер (24.01.2020 в 16:51):
Кстати, у меня было нечто подобное c Upack'ом. У Оракула в JDK есть тулза appletviewer.exe, которая весит неприлично много: 15,8 Кб. Поэтому я отрезал одну "лишнюю" секцию, добившись размера 6,00 Кб, но винда мне радостно сообщила, что прога не является приложением Win32. После чего я пожал прогу Upack'ом и, о чудо, она заработала! Если кому интересно, вот ссылко: https://www.upload.ee/files/11...wer.zip.html
Сойфер (24.01.2020 в 01:34):
ManHunter, возможно, вы знаете, как сделать так, чтобы FASM создавал наименьший возможный заголовок, примерно как у Upack? Вот заголовок Upack: "MZKERNEL32.DLL  PE" - между "MZ" и "PE" расстояние 14 байт! Можно ли как-то добиться подобного от FASM?

Denis Vnoukov, благодарю, бро! Давно подыскивал замену для UPX и похоже, что вот она!
Denis Vnoukov (27.05.2011 в 15:10):
Как появился mpress, UPX больше не использую (хотя подход у них одинаковый )))

http://www.matcode.com/mpress.htm
ezfalc0n (27.03.2011 в 00:03):
crash_unpacked у меня ошибку не выдает - но и окошко "Hello..." тоже (xpsp3)
ManHunter (26.03.2011 в 21:03):
Может быть где-то и встречалось. Я встретился с таким глюком первый раз.
BoRoV (26.03.2011 в 20:12):
Где-то что-то такое уже было.
AyTkACT (25.03.2011 в 23:06):
Любопытно.
ManHunter (25.03.2011 в 07:50):
Ну по крайней мере FASM дает скомпилировать такой импорт. С остальными ассемблерами не пробовал. А еще если распакованный файл с ошибкой запаковать обратно, то он снова становится работающим.
Isaev (25.03.2011 в 02:52):
Мило )
Не уж то только с Fasm работает?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0072 сек.) / Память: 4.5 Mb
Наверх