Как сокрушают протекторы Крис Касперски Хакер, номер #092, стр. 092-102-2 .080495F9: 9D popfd .080495FA: 61 popad ; адрес оригинальной точки входа (OEP) .080495FB: BDC0820408 mov ebp, 0080482C0 ; передаем управление расшифрованному коду .08049600: FFE5 jmp ebp Запоминаем (записываем на бумажке) адрес начала расшифровываемого фрагмента (грузится в регистр ESI), количество расшифровываемых двойных слов (в ECX), ключ расшифровщика (в EBX) и адрес оригинальной точки входа (в EBP). Нажимаем <F5> (goto) и вводим адрес начала расшифровываемого фрагмента с точкой впереди (точка указывает Hiew'у, что это не смещение внутри файла, а виртуальный адрес), в данном случае — «.80482C0». Переходим в HEX-режим двойным нажатием <ENTER>'a, разрешаем редактирование по <F3> и нажимаем <F8> (XOR) – Hiew запрашивает маску шифрования, которую необходимо вводить в HEX-виде с учетом обратного порядка байт на x86, в результате чего «09CC03BDh» превращается в «BD 03 CC 09» (а совсем не в «DB 30 CC 90», как иногда поступают начинающие), после чего нажимаем <F8> ECX раз. Чтобы не сбиться, можно отталкиваться от адресов начала и конца блока, прекращая давить <F8> только в том случае, когда курсор сместится на ECX двойных слов (не байт!) относительно начальной позиции. Пара ремарок: при входе в режим редактирования Hiew перестает отображать виртуальные адреса, переходя на физические смещения внутри файла, в результате чего «80482C0h» превращается в «00002C0h», но пусть нас это не смущает. Конечное смещение расшифровываемого блока вычисляется тривиально: «00002C0h + sizeof(DWORD) * 78h == 4A0h». К сожалению, Hiew не позволяет расшифровывать более одного экрана за один раз, и, когда курсор подходит к последней строке, Hiew пищит и отказывается прокручивать файл, поэтому необходимо сохранить изменения по <F9>, нажать <Page Down>, вновь вернуться в режим редактирования клавишей <F3> и продолжить заниматься расшифровкой. Теперь остается только скорректировать адрес точки входа. Нажимаем <F5> и переходим по смещению 18h относительно начала файла. Записываем число из EPP, не забывая про обратный порядок байт на x86 (то есть в данном случае это будет выглядеть так: «C0 82 04 08»). Нажимаем <F9> для сохранения и выходим. Атрибуты кодовой секции можно и не восстанавливать. Запускаем расшифрованный файл, чтобы убедиться, что он работает. На этом процедуру распаковки можно считать законченной. UPX Происхождение: созданный тройкой магов Markus Oberhumer, Laszlo Molnar и John Reiser, UPX относится к древнейшим распаковщикам, поддерживающим огромное количество форматов исполняемых файлов, среди которых есть и ELF. Собственно говоря, аббревиатура UPX именно так и расшифровывается: «Ultimate Packer for executables». Свежую версию вместе с исходными текстами можно бесплатно скачать с родного сайта проекта www.upx.org или с upx.sf.net. Описание: UPX упаковывает все секции файла (включая и таблицы, содержащие имена функций динамически загружаемых библиотек), вполне корректно обрабатывая ELF-формат и успешно работая на всем «зоопарке» *nix-подобных систем. Не содержит никакого кода, препятствующего его отладке или дизассемблированию. |