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

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

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

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

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

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

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

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

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

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

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

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

Строки в файле
Вот в дизассемблерном листинге место, где она используются:
Code (Assembler) : Убрать нумерацию
- .text:004217E0 sub_4217E0 proc near
- ; CODE XREF: sub_4277A4
- .text:004217E0 push ebx
- .text:004217E1 push esi
- .text:004217E2 push edi
- .text:004217E3 mov edi, edx
- .text:004217E5 mov ebx, eax
- .text:004217E7 mov edx, ds:off_4217CC
- .text:004217ED xor eax, eax
- .text:004217EF call sub_40A618
- .text:004217F4 mov [ebx], eax
- .text:004217F6 mov edx, offset aBjb_nag ; "BJB_Nag"
- .text:004217FB mov ecx, offset aBlueJetButto_1
- ; "Blue Jet Button"
- .text:00421800 mov eax, edi
- .text:00421802 call sub_40B0D0
- .text:00421807 mov ecx, 103h
- ...
Code (Assembler) : Убрать нумерацию
- .text:004277A4 sub_4277A4 proc near
- .text:004277A4 push ebx
- .text:004277A5 mov edx, ds:off_43218C
- .text:004277AB mov edx, [edx]
- .text:004277AD mov eax, ds:off_43224C
- .text:004277B2 call sub_4217E0
- .text:004277B7 mov eax, ds:off_43224C
- .text:004277BC mov eax, [eax]
- .text:004277BE mov eax, [eax+18h]
- .text:004277C1 call sub_40906C
- .text:004277C6 mov ebx, eax
- .text:004277C8 mov eax, ds:off_43224C
- .text:004277CD mov eax, [eax]
- .text:004277CF mov eax, [eax+18h]
- .text:004277D2 call sub_40A244
- .text:004277D7 mov eax, ds:off_43224C
- .text:004277DC xor edx, edx
- .text:004277DE mov [eax], edx
- .text:004277E0 mov eax, ebx
- .text:004277E2 pop ebx
- .text:004277E3 retn
- .text:004277E3 sub_4277A4 endp
Code (Assembler) : Убрать нумерацию
- ; Вызвать функцию проверки
- .text:00428149 call sub_423B68
- ; Если AL=0, то наг-окно не показывать
- .text:0042814E test al, al
- .text:00428150 jz short loc_428159
- ; Показать наг-окно
- .text:00428152 call sub_4277A4
- .text:00428157 jmp short loc_42816D
- .text:00428159 ; -------------------------------
- .text:00428159 loc_428159:
Code (Assembler) : Убрать нумерацию
- .text:00423C57 mov eax, ebx ; <--- заменить на MOV AL,0
- .text:00423C59 pop edi
- .text:00423C5A pop esi
- .text:00423C5B pop ebx
- .text:00423C5C mov esp, ebp
- .text:00423C5E pop ebp
- .text:00423C5F retn

Программа успешно "зарегистрирована"
Практическое применение самой утилиты очень сомнительное, а вот полученный опыт ручной распаковки пригодится для снятия несложных упаковщиков типа этого.
Просмотров: 158 | Комментариев: 34
Метки: исследование защиты

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

ManHunter
(27.02.2024 в 18:34):
Для личных нужд я бы написал свою панельку-лаунчер с фиксированными иконками и путями. Вряд ли требуется ежедневно вносить изменения, а в случае чего можно и перекомпилировать. Имхо.

user
(27.02.2024 в 14:28):
Что-то отваливается она временами под Win7.
Новые версии будут?

Максим
(15.08.2019 в 18:02):
Всем привет!
Я автор данной софтины))) Подзаработать на ней так и не получилось(
Да упакована она UPX-сом, я только шапку PE заголовка немного сократил и подправил. И да есть там проверки, периодически проверяется контрольная сумма EXE-шника. А чтоб кейген к ней сделать, нужен закрытый ключ шифрования, в ресурсах exe-файла храниться только открытый ключ. Прогой это кстати до сих пор сам пользуюсь)
Я автор данной софтины))) Подзаработать на ней так и не получилось(
Да упакована она UPX-сом, я только шапку PE заголовка немного сократил и подправил. И да есть там проверки, периодически проверяется контрольная сумма EXE-шника. А чтоб кейген к ней сделать, нужен закрытый ключ шифрования, в ресурсах exe-файла храниться только открытый ключ. Прогой это кстати до сих пор сам пользуюсь)

user
(26.05.2018 в 10:07):
Exit, попробовал. Не катит.
Только BlueJetButton, только она.
Только BlueJetButton, только она.

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

user
(30.11.2015 в 00:35):
Слишком сложный имхо.
А вот эта 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):
А это? -
.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 - там нашлись ответы. Ушло пару недель вечерами (и частично ночей). А когда уже совсем решил, что ну его, он заработал. Ничего, работает до сих пор.
Было это году в 2000-м. Попросили.. Радости потом не было - задолбался.
Инжектированными врезками снимал дампы, вырезал из них распакованные секции, а потом геморрой был по сборке этого всего в исполняемый модуль. И злило, что всё вроде сделано верно, по документейшену PE-формата, а прога не работала. Пришлось дизасмить VxDLdr.vxd - там нашлись ответы. Ушло пару недель вечерами (и частично ночей). А когда уже совсем решил, что ну его, он заработал. Ничего, работает до сих пор.

ManHunter
(24.11.2015 в 22:25):
На нас интернет не заканчивается. Новичков учить надо? Надо. Знания передавать надо? Надо. Автораспаковщики, кстати, тоже не всегда помогают.
Я помню сколько у меня радости было, когда первый раз вручную распаковал какой-то модифицированный UPX. Так что пусть люди учатся.
Я помню сколько у меня радости было, когда первый раз вручную распаковал какой-то модифицированный 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. Дальше оказывается, что при определённых обстоятельствах в проге какой-нибудь глупый глюк - и начинается применение патч-лоадеров. Не успеваешь оглянуться, как все траблы оказываются завязаны на какую-то ерундовую ненужную софтину. А так можно забыть этих всех проблем.
А потом начинается я расскажу, что.
Оказывается (например), что прога уточняет рег.ланные по сети - и начинаются правки файла 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
Я, кстати, такую идею с группами иконок применяю штатными виндоусными средствами c .LNK-файлами в отдельных каталогах, иконки для которых выведены на "рабочий стол".
Ну, а с самопроверками - тут уж тупо хирургия. И вроде работает.
Мой вариант BJB.CRK: rghost.ru/6jZ8SGQDW
..+ passworded

user
(23.11.2015 в 02:57):
Глючная работа с икоками в этой проге. Если удалить все "группы", у неё вообще ступор.
И ещё вот интересно, кто-нибудь заметил, что софтина в пропатченном состоянии работает только одну минуту, после чего завершается?
Намекну - там есть прыжок по адресу .0042F436.
. и он там не один такой, а их с десяток ему подобных.
В общем, в программке имеются сюрпризы.
И ещё вот интересно, кто-нибудь заметил, что софтина в пропатченном состоянии работает только одну минуту, после чего завершается?
Намекну - там есть прыжок по адресу .0042F436.
. и он там не один такой, а их с десяток ему подобных.
В общем, в программке имеются сюрпризы.

ManHunter
(22.11.2015 в 14:40):
33 C0 = вариант опкода xor eax,eax
Порядок байт в word никто не отменял
Порядок байт в word никто не отменял

brute
(22.11.2015 в 12:36):
это понятно, я про это спросил:
MOV WORD PTR DS:[423C57],0C033
Это опкод "OR AL,3?" - наверное, где-то на выходе из функции по адресу 423B68 происходит обнуление al..
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 - как получен инлайн патч?
снимается автоматом этой прогой: 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
инлайн
006CFB53 /EB 11 JMP SHORT bjb1.006CFB66
...
006CFB66 66:C705 573C4200 33C0 MOV WORD PTR DS:[423C57],0C033
006CFB6F - E9 DCFDD5FF JMP bjb1.0042F950

Добавить комментарий
Заполните форму для добавления комментария

но раз уже есть такие софты, то лень затевать возню с собственным.
В принципе, нормально и обычные батники работают, которые поскладывать в одну "папку на рабочем столе" - получается то же самое, причём штатными средствами и легко конфигурируемое.
Просто я уже привык к этой BJB, а тут она стала подглючивать.
Иногда.