Как сокрушают протекторы Крис Касперски Хакер, номер #092, стр. 092-102-1 Обзор упаковщиков исполняемых файлов под *nix Долгое время единственным упаковщиком исполняемых файлов в *nix был легендарный UPX, содержащий встроенный декомпрессор и распаковывающий файлы без особого труда. Но сейчас ситуация изменилась, и упаковщики стали появляться, как грибы после дождя. Ими охотно пользуются разработчики коммерческих программ с закрытым кодом, не задумываясь о том, какие проблемы они создают своим пользователям. Сегодня мы покажем, как, не будучи хакером и не имея навыков в дизассемблировании или отладке, победить наиболее популярные упаковщики (ELFCrypt, UPX, Burneye и Shiva). Введение Упаковщики исполняемых файлов часто используются для затруднения анализа программы и препятствия взлому. Упакованный файл потребляет намного больше оперативной памяти, а на некоторых *nix-клонах вообще отказывается запускаться или работает нестабильно. В первую очередь это касается *BSD (основная масса упаковщиков ориентирована на Linux) и экзотических систем с экспериментальными ядрами наподобие Hurd. В результате от упаковщиков/протекторов стремится избавиться даже тот, кто вообще не собирался ничего ломать! ELFCrypt Происхождение: создан индийским студентом по прозвищу JunkCode. Распространяется в исходных текстах на бесплатной основе: www.infogreg.com/source-code/public-domain/elfcrypt-v1.0.html. Описание: простейший шифровщик (не упаковщик!) ELF-файлов, шифрующий файл по XOR случайно генерируемым ключом. Присваивает кодовой секции атрибут writable и не убирает его после завершения расшифровки (что может приводить к некорректной работе программ, проверяющих возможность модификации кодовой секции). Остальные секции (и секция данных в том числе!) остаются незашифрованными. Не содержит никаких антиотладочных приемов, но подкладывает две большие свиньи дизассемблерам: «забывает» скорректировать метку _start и размещает свой код в секции extern, истинное содержимое которой IDA Pro отображает только в режиме ручной загрузки при выбранной опции: «Force using of PHT instead of SHT». Распаковка: загружаем файл в Hiew, двойным нажатием <ENTER>'а переходим в режим дизассемблера, давим <F8> для отображения заголовка и переходим в точку входа по <F5>. Здесь прослеживается следующий код: КОД Дизассемблерный листинг окрестной точки входа программы, зашифрованной ELFCrypt'ом ; переходим на расшифровщик .080495DC: EB02 jmps .0080495E0 ; мусор, оставленный транслятором ассемблера .080495DE: 06 push es .080495DF: C6 ??? ; сохраняем в стеке все регистры и флаги .080495E0: 60 pushad .080495E1: 9C pushfd ; начало расшифровываемого фрагмента .080495E2: BEC0820408 mov esi, 0080482C0 .080495E7: 8BFE mov edi, esi ; количество двойных слов для расшифровки .080495E9: B978000000 mov ecx, 000000078 ; ключ расшифровки .080495EE: BBBD03CC09 mov ebx, 009CC03BD ; читаем очередное двойное слово .080495F3: AD lodsd ; расшифровываем через xor .080495F4: 33C3 xor eax,ebx ; записываем результат на место .080495F6: AB stosd ; мотаем цикл .080495F7: E2FA loop .0080495F3 ; восстанавливаем из стека флаги и регистры |