Blog. Just Blog

Исследование защиты программы Blue Jet Button

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Blue Jet Button
Скриншот программы Blue Jet Button

Blue Jet Button - настраиваемая утилита для быстрого запуска любых программ, доступа к выбранным папкам или выполнения различных действий, таких как выключение, перезагрузка компьютера, переход в ждущий режим и т.п. Просто перетаскиваете мышкой нужные ярлыки на панель утилиты, а сама панель сворачивается в трей. Наверняка в этих ваших интернетах найдутся и бесплатные, и более удобные аналоги Blue Jet Button, но вот поковыряться в ней будет однозначно интересно.

Итак, скачиваем небольшой дистрибутив с инсталлятором, распаковываем, устанавливаем. Смотрим на исполняемый файл.

Программа упакована Ixide Tools
Программа упакована Ixide Tools

С первого же взгляда видно, что файл упакован. Об этом говорит не только мешанина символов, характерная для упакованного или зашифрованного файла, но и надпись "PE Protected by Ixide Tools!". Никаких упоминаний об утилите с названием "Ixide Tools" найти не удалось, скорее всего это какой-то приватный пакер/протектор от автора Blue Jet Button. Можно было бы натравить на файл какой-нибудь универсальный распаковщик, но лучше потренируемся в ручной распаковке. Это, собственно, и будет основной темой сегодняшней статьи.

Точка входа упакованного файла
Точка входа упакованного файла

Загружаем программу в отладчик, в самом начале модуля распаковки присутствует команда PUSHAD, то есть сохранение в стеке всех регистров. В принципе, это делать вовсе не обязательно, но это хороший тон при написании пакеров и протекторов - при переходе в программу оставлять окружение системы таким, как было при запуске.

Переход на OEP
Переход на OEP

Ниже идет код распаковщика. Он более-менее линейный и не разбросан по разным участкам памяти, это значительно облегчает нашу задачу. Нам надо найти место, где распаковщик заканчивает свою работу и передает управление на OEP защищенной программы. Для этого просто прокручиваем код в отладчике и ищем команду, противоположную PUSHAD, то есть POPAD. После нее идет безусловный переход на адрес 42F950. Это и есть адрес OEP. Ставим точку останова на этот переход и запускаем программу на выполнение.

OEP программы
OEP программы

После срабатывания точки останова проходим безусловный переход пошаговой трассировкой и оказываемся на OEP.

Делаем дамп программы
Делаем дамп программы

Теперь надо сделать дамп. Для этого полно всяких инструментов, я же сделаю это прямо из отладчика с помощью плагина OllyDump. Не забывайте только убрать галочку "Rebuild Import".

Получаем размер IAT и RVA
Получаем размер IAT и RVA

Осталось восстановить импорт распакованной программы и прикрутить его к сделанному дампу. Опять же для этой задачи есть несколько разных инструментов, я воспользуюсь классической утилитой ImpREC. В поле OEP надо ввести значение RVA OEP, то есть 42F950 - ImageBase. ImageBase можно посмотреть, например, в HiEW.

ImageBase программы
ImageBase программы

Нехитрой математикой получаем значение 42F950 - 400000 = 2F950. Нажимаем кнопку "IAT AutoSearch" для автоматического поиска таблицы импорта и определения ее размера.

Получаем импорт
Получаем импорт

Нажатием кнопки "Get Import" получаем список динамических библиотек и импортированных функций. Убеждаемся, что все определилось правильно (везде стоит надпись "valid: YES").

Прикручиваем секцию импорта к дампу
Прикручиваем секцию импорта к дампу

Осталось прикрутить импорт к дампу. Нажимаем кнопку "Fix Dump", выбираем файл дампа, сохраненный из отладчика. Все, программа распакована вручную, можно закрывать отладчик и весь остальной инструментарий. Теперь проверим ее на работоспособность. Если все сделано правильно, то после запуска мы сразу получим наг-окно с предложением расстаться с баблом.

Окно регистрации программы
Окно регистрации программы

Вот теперь с чистой совестью отправляем распакованный файл в дизассемблер. Ключевой строкой будет наг-окно, а точнее строки, которые в нем используются. В ресурсах этого окна нет, значит оно генерируется динамически. Поиск по заголовку выводит на следующий набор характерных строк. То, что это запчасти для нужного нам окна, говорит строчка "BJB_Nag".

Строки в файле
Строки в файле

Вот в дизассемблерном листинге место, где она используются:
  1. .text:004217E0 sub_4217E0      proc near
  2. ; CODE XREF: sub_4277A4
  3. .text:004217E0                 push    ebx
  4. .text:004217E1                 push    esi
  5. .text:004217E2                 push    edi
  6. .text:004217E3                 mov     edi, edx
  7. .text:004217E5                 mov     ebx, eax
  8. .text:004217E7                 mov     edx, ds:off_4217CC
  9. .text:004217ED                 xor     eax, eax
  10. .text:004217EF                 call    sub_40A618
  11. .text:004217F4                 mov     [ebx], eax
  12. .text:004217F6                 mov     edx, offset aBjb_nag ; "BJB_Nag"
  13. .text:004217FB                 mov     ecx, offset aBlueJetButto_1
  14. ; "Blue Jet Button"
  15. .text:00421800                 mov     eax, edi
  16. .text:00421802                 call    sub_40B0D0
  17. .text:00421807                 mov     ecx, 103h
  18. ...
По перекрестной ссылке переходим на уровень выше, в код, который вызывает появление наг-окна:
  1. .text:004277A4 sub_4277A4      proc near
  2. .text:004277A4                 push    ebx
  3. .text:004277A5                 mov     edx, ds:off_43218C
  4. .text:004277AB                 mov     edx, [edx]
  5. .text:004277AD                 mov     eax, ds:off_43224C
  6. .text:004277B2                 call    sub_4217E0
  7. .text:004277B7                 mov     eax, ds:off_43224C
  8. .text:004277BC                 mov     eax, [eax]
  9. .text:004277BE                 mov     eax, [eax+18h]
  10. .text:004277C1                 call    sub_40906C
  11. .text:004277C6                 mov     ebx, eax
  12. .text:004277C8                 mov     eax, ds:off_43224C
  13. .text:004277CD                 mov     eax, [eax]
  14. .text:004277CF                 mov     eax, [eax+18h]
  15. .text:004277D2                 call    sub_40A244
  16. .text:004277D7                 mov     eax, ds:off_43224C
  17. .text:004277DC                 xor     edx, edx
  18. .text:004277DE                 mov     [eax], edx
  19. .text:004277E0                 mov     eax, ebx
  20. .text:004277E2                 pop     ebx
  21. .text:004277E3                 retn
  22. .text:004277E3 sub_4277A4      endp
Продолжаем раскручивать вызовы в обратную сторону:
  1. ; Вызвать функцию проверки
  2. .text:00428149                 call    sub_423B68
  3. ; Если AL=0, то наг-окно не показывать
  4. .text:0042814E                 test    al, al
  5. .text:00428150                 jz      short loc_428159
  6. ; Показать наг-окно 
  7. .text:00428152                 call    sub_4277A4
  8. .text:00428157                 jmp     short loc_42816D
  9. .text:00428159 ; -------------------------------
  10. .text:00428159 loc_428159:
То есть функция проверки по адресу 423B68 должна вернуть AL=0, чтобы наг-окно не появилось и эта ветка алгоритма вообще не сработала. Пропатчим ее таким образом, чтобы она всегда возвращала AL=0. Для этого можно записать в ее начало пару команд XOR EAX,EAX и RET или принудительно заменить код возврата:
  1. .text:00423C57                 mov     eax, ebx  ; <--- заменить на MOV AL,0
  2. .text:00423C59                 pop     edi
  3. .text:00423C5A                 pop     esi
  4. .text:00423C5B                 pop     ebx
  5. .text:00423C5C                 mov     esp, ebp
  6. .text:00423C5E                 pop     ebp
  7. .text:00423C5F                 retn
Сохраняем изменения, запускаем программу. Наг-окно не появляется. Пробуем добавить дохреналион значков и групп, никаких ограничений нет. В окне "О программе" красуется надпись "Registered copy". Цель достигнута.

Программа успешно "зарегистрирована"
Программа успешно "зарегистрирована"

Практическое применение самой утилиты очень сомнительное, а вот полученный опыт ручной распаковки пригодится для снятия несложных упаковщиков типа этого.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 2246 | Комментариев: 29

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

Комментарии

Отзывы посетителей сайта о статье
Exit (10.12.2015 в 14:57):
коль пошли холивары лаунчеров, добавлю свои 5 копеек ))
юзаю jetToolBar от компании Cowon, известной своим jetAudio.
прога древняя, но свое дело знает ))
еще бы ее допилить, чтоб можно было иконки большие ставить, вообще бы цены небыло!
user (30.11.2015 в 00:35):
ЦитатаБолее удобный аналог SE-TrayMenu

Слишком сложный имхо.

А вот эта BJB весьма эргономична, на мой взгляд. И без лишних наворотов.
Это первая из нескольких виденных мною подобных программ,
которой сразу начал пользоваться и вполне доволен.
ManHunter (29.11.2015 в 10:40):
MD-launcher неплох, чем-то напоминает боковые панели в Aston.
brute (29.11.2015 в 09:45):
я юзаю YzDock и rocketdock
oleg (28.11.2015 в 18:51):
Более удобный аналог SE-TrayMenu
user (27.11.2015 в 15:00):
ЦитатаНи один из call с адреса 04277A4 sub_4277A4 не указывает на этот участок.

А это? -
.text:004277B2   call    sub_4217E0
ManHunter (26.11.2015 в 19:21):
Из функции открытия этого окна.
usr (26.11.2015 в 19:18):
Адрес 00428149 находится не очень далеко от того места, где вызывается наг-окно. А как на него вышли? Ни один из call с адреса 04277A4 sub_4277A4 не указывает на этот участок. Или я ошибаюсь?
Sergey_K (25.11.2015 в 23:17):
ManHunter, Спасибо за хорошую обучалку. Первый раз сам вручную распаковал. Все получилось, а прожка так себе.
user (25.11.2015 в 02:58):
) я вот первый раз вручную WIN32 распаковывал PECOmpact 1.24.1 (его самого).
Было это году в 2000-м. Попросили.. Радости потом не было - задолбался.
Инжектированными врезками снимал дампы, вырезал из них распакованные секции, а потом геморрой был по сборке этого всего в исполняемый модуль. И злило, что всё вроде сделано верно, по документейшену PE-формата, а прога не работала. Пришлось дизасмить VxDLdr.vxd - там нашлись ответы. Ушло пару недель вечерами (и частично ночей). А когда уже совсем решил, что ну его, он заработал. Ничего, работает до сих пор.
ManHunter (24.11.2015 в 22:25):
На нас интернет не заканчивается. Новичков учить надо? Надо. Знания передавать надо? Надо. Автораспаковщики, кстати, тоже не всегда помогают.
Я помню сколько у меня радости было, когда первый раз вручную распаковал какой-то модифицированный UPX. Так что пусть люди учатся.
Vnv (24.11.2015 в 21:53):
ManHunter, кому нужна инструкция распаковки UPX? Не, это не для нас. С данной программой даже автоматические распаковщики справляются.
user (24.11.2015 в 14:14):
ЦитатаЯ вообще хотел выбрать самую ненужную программу
)) прога уже в деле. Юзабельная.
Так что сєнкс!
ManHunter (24.11.2015 в 10:34):
Я вообще хотел выбрать самую ненужную программу, чтобы на ее примере показать ручную распаковку несложных пакеров. Углубляться в саму защиту программы и не предполагалось. А получилось "вот оно чо, Михалыч" :)
user (23.11.2015 в 21:56):
То, что я написал постом ранее, это не придумано, а реальные случаи, которых было не один и не два. Если есть время и желание играться, то на здоровье, конечно. Но зачем, если можно сделать по-человечески?
Впрочем, это уже типа флейм.
Vnv (23.11.2015 в 21:52):
user,
ЦитатаКейген это костыльный вариант, за неимением лучшего.

Ну, не скажи. Лучше не патчить программу, если возможен ввод ключа. Костыль - это патч!!!
user (23.11.2015 в 21:33):
Угу.
А потом начинается я расскажу, что.
Оказывается (например), что прога уточняет рег.ланные по сети - и начинаются правки файла hosts. Дальше оказывается, что при определённых обстоятельствах в проге какой-нибудь глупый глюк - и начинается применение патч-лоадеров. Не успеваешь оглянуться, как все траблы оказываются завязаны на какую-то ерундовую ненужную софтину. А так можно забыть этих всех проблем.
ManHunter (23.11.2015 в 21:28):
Так-то под нее и серийники рабочие есть.
user (23.11.2015 в 21:12):
ЦитатаА на счет кейгена что, никто не подумал?
- Даже и в голову бы не пришло.
Зачем этот цирк, если есть нормальная исправленная программа?
Кейген это костыльный вариант, за неимением лучшего.
Vnv (23.11.2015 в 19:55):
А на счет кейгена что, никто не подумал? Дык, там все просто (теоретически).
user (23.11.2015 в 12:32):
Хм. А ничего, нормальная софтина.
Я, кстати, такую идею с группами иконок применяю штатными виндоусными средствами c .LNK-файлами в отдельных каталогах, иконки для которых выведены на "рабочий стол".
Ну, а с самопроверками - тут уж тупо хирургия. И вроде работает.
Мой вариант BJB.CRK: rghost.ru/6jZ8SGQDW

..+ passworded
user (23.11.2015 в 02:57):
Глючная работа с икоками в этой проге. Если удалить все "группы", у неё  вообще ступор.
И ещё вот интересно, кто-нибудь заметил, что софтина в пропатченном состоянии работает только одну минуту, после чего завершается?
Намекну - там есть прыжок по адресу .0042F436.
. и он там не один такой, а их с десяток ему подобных.
В общем, в программке имеются сюрпризы.
ManHunter (22.11.2015 в 14:40):
33 C0 = вариант опкода xor eax,eax
Порядок байт в word никто не отменял
brute (22.11.2015 в 12:36):
это понятно, я про это спросил:
MOV WORD PTR DS:[423C57],0C033
Это опкод "OR AL,3?" - наверное, где-то на выходе из функции по адресу 423B68 происходит обнуление al..
ManHunter (22.11.2015 в 11:48):
Цитатакак получен инлайн патч?

Команда перехода на OEP в модуле распаковки заменена на короткий прыжок в область пустых байт, а туда записана команда патча программы в памяти и переход на OEP.
http://rghost.ru/8SW8RXvVC/image.png
brute (22.11.2015 в 10:27):
UPX почти в 10 раз сжал!
снимается автоматом этой прогой: https://code.google.com/p/fuu/
мой PeiD не определяет упаковщик, определил exeinfope. В оле не работает анализ и плагины-дамперы криво снимают дамп.
voffka - как получен инлайн патч?
ManHunter (22.11.2015 в 10:26):
В большинстве случаях дамп корректно дизассемблируется, только не будет видно ни одной импортированной функции.
Владимир (22.11.2015 в 10:13):
Можно ли для полноценного исследования в дисассемблере использовать дамп программы?
voffka (22.11.2015 в 01:03):
UPX :)
инлайн
006CFB53    /EB 11                       JMP SHORT bjb1.006CFB66
...
006CFB66     66:C705 573C4200 33C0       MOV WORD PTR DS:[423C57],0C033
006CFB6F   - E9 DCFDD5FF                 JMP bjb1.0042F950

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

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

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