С выходом в свет версии 2.12 (она же и последняя) её распаковка считалась довольно трудным делом. Сейчас же распаковка занимает пару секунд, благодаря автоматическим распаковщикам, например AspackDie. Таким образом, программа, упакованная ASPackом сравнима по защищенности с неупакованной. О незащищенности ASPackа всем известно, но что-то я нигде не встречал предложений как сделать его защищенным. В этой статье расскажу тебе о том, как спрятать ASPack от посторонних глаз и защитить его от автоматической распаковки.
Мы изменим файл таким образом, что автоматический распаковщик его не сможет распознать, а, следовательно, и распаковать. PEiD мы заставим молчать в тряпочку, а распаковщик ругаться.
Возьмем девственный exe и пакнем его ASPackом. Получившийся файл откроем в HIEWе и внимательно приглядимся. Первым делом нас интересуют секции. Жмем F8->F6 и видим:
ASPack добавил две секции: .aspack и .adata, причем Physical Size последней равен нулю. Так же обращаем внимание на флаги секций: они все одинаковые (C0000040h). Теперь глянем в точку входа (F8 ->
F5). Как видишь, первый байт точки входа – команда pushad (60h). Вместо нее ты смело можешь вписать что-нибудь другое, например nop (90h) или другие однобайтовые команды: inc eax (40h), inc ebx (43h), inc ecx (41h), inc edx (42h), inc esi (46h), inc edi (47h),dec eax (48h), dec ebx (4bh), dec ecx (49h), dec edx (4ah), xchg ebx,eax (93h) и т.д. Подробнее по этому вопросу читай
Хакер 06.04 (66), статья Криса Касперски «Секреты маскировки». Список команд, кстати, взят из этой статьи. Также рекомендую и первый байт секции ASPackа тоже заменить на что-нибудь из этого списка. Теперь точку входа мы перенаправим в самое начало секции. Для этого необходимо из существующей точки входа вычесть единицу и записать новое значение. Для этого воспользуемся LordPE:
Вычитаем из EntryPoint единицу, пишем получившееся значение и нажимаем Save. Не забывай, что все числа в шестнадцатеричном виде! После этой нехитрой операции распаковать наш файл AspackDie уже не получится, но PEiD все равно определяет как ASPack, правда непонятной версии.
Видимо, остались еще места в секции, по которым PEiD узнает упаковщик. Чтобы узнать, где они расположены, я начал с конца секции затирать нулями по 16 байт и спрашивать PEiD. В результате такого нудного труда был обнаружен байт, после исправления которого программа сохраняла работоспособность и определялась PEiD как «Win32 PE Unknown»: Команда, содержащая этот байт, дизассемблируется как mov eax,000000001. Это не часть полиморфного мусора, который встречается тут в изобилии. Я просто заменил её на mov eax,000000002 и не заметил изменений в работе программы.
Позже, при отладке программы, я обнаружил что этот участок кода пропускается благодаря прыжку на 4233BAВ (7508h), т.е. на 8 байт вперед. Следовательно, эти 8 байт можешь забить хоть nopами – программа будет работать. Видимо этот код выполняется в случае какой-нибудь ошибки, а если она произойдет, то программа все равно работать не будет. В общем, экспериментируй, найди другие места, по которым светится ASPack. А теперь самое главное: где же находится та самая команда. Все просто. Сместись от начала секции на значение 3B3h и все сам увидишь:
Править байтики можно, начиная от .004233B2 до .004233BA. Виртуальные адреса даны для подопытной программы, но смещение от начала секции всегда будет одинаково.
Так то лучше :). Но при упаковке файла ASPackом выскакивает предупреждение, что файл уже упакован ASPack. Как же ASPack сам определяет, что файл уже им упакован? Все просто. По смещению F0h от начала PE заголовка находятся два поля типа dword. Они зарезервированы и не используются. Во втором из них, ASPack и оставляет свою метку: устанавливает значение поля в 00100000h. Нам нужно просто изменить его обратно в ноль. Есть два способа сделать его. Первый: запускаешь LordPE, открываешь файл в PE Editore, жмешь кнопочку Directories и устанавливаешь Size поля Reserved в ноль. Второй способ: ручками в HIEWе. Отступаешь от начала PE заголовка на F6h и видишь значение 10h. Исправляешь на ноль и все. Теперь при повторной упаковке ASPack послушно упакует файл, но работать, он, конечно, уже не будет.
Теперь упаковщик палится только по именам секций, которые он добавил. Тут все просто: затереть имена можно в PE редакторе или прямо в HIEWе.
От кого спрятали
Ну вот и все. Не забывай, все что мы сейчас сделали, спасет только от тех, кто не знаком с дизассемблерами и отладчиками. Не бойся экспериментировать, сделай все, чтобы файл максимально отличался от упакованного ASPackом, сохраняя при этом работоспособность.