"FASM и UPX: созданы друг для друга"
Сразу скажу, утро и кофе к этой статье отношения не имеют, все необычные решения приходят ко мне обычно по ночам. Однажды я экспериментировал с FASM, и обнаружил один интересный момент. Ниже приведен ассемблерный листинг самой простейшей программы, она выводит на экран сообщение и сразу же завершает работу, вроде бы ничего необычного.Code (Assembler) : Убрать нумерацию
- section '.code' code readable executable
- start:
- ; Вывести окно сообщения и выйти из программы
- invoke MessageBox, NULL, szMess, szTitle, MB_OK
- invoke ExitProcess,0
- ; Куча пустого места, чтобы можно было упаковать файл
- rd 1000h
- szTitle db 'Title',0
- szMess db 'Hello, UPX ;)',0
- ;---------------------------------------------
- section '.idata' import data readable writeable
- ; Обратите внмание, user32.dll прописан дважды
- library kernel32,'kernel32.dll',\
- user32,'user32.dll',\
- user32,'user32.dll'
- include 'apia\kernel32.inc'
- include 'apia\user32.inc'
Теперь компилируем его и проверяем, все запускается нормально. Сжимаем полученный файл бесплатным упаковщиком исполняемых файлов UPX. Проверяем упакованный файл - тоже никаких проблем с запуском. Распаковываем файл при помощи самого UPX командой upx -d и снова пробуем его запустить. Программа сразу же падает с ошибкой инициализации 0xC00000005 (ошибка в импорте). Я попробовал несколько разных версий пакера - результат всегда одинаковый, видимо от версии UPX ничего не зависит. Получается этакая простенькая "защита" от распаковки "для самых маленьких". Конечно, от ручной распаковки и восстановления импорта этот способ не помогает, ну и также никто не мешает подправить распакованный файл в любом PE-редакторе, который умеет работать с таблицей импорта. Так что это скорее забавный глюк, нежели реальный способ защиты программ.
В приложении исходник программы, скомпилированный файл, работающий упакованный файл и распакованный файл с ошибкой для демонстрации.
Просмотров: 6178 | Комментариев: 10
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Сойфер
(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, благодарю, бро! Давно подыскивал замену для UPX и похоже, что вот она!
Denis Vnoukov
(27.05.2011 в 15:10):
Как появился mpress, UPX больше не использую (хотя подход у них одинаковый )))
http://www.matcode.com/mpress.htm
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 работает?
Не уж то только с Fasm работает?
Добавить комментарий
Заполните форму для добавления комментария
Вся прелесть FASM в том, что он идет в исходниках. Заголовок у компилируемого файла собирается в сырке SOURCE\FORMATS.INC (поиск по метке "make_stub" и далее), можно отредактировать код как надо и собрать свой компилятор FASM, который будет сразу оптимизировать файлы еще на этапе сборки. Другой вопрос, кто этим будет заниматься с поддержанием всех новых версий.