Исследование защиты программы PNGOUTWin
Скриншот программы PNGOUTWin
Программа PNGOUTWin предназначена для оптимизации картинок в формате PNG, значительно уменьшая их размер, в некоторых случаях даже в разы, но без потери качества изображения. Уменьшение размера файла выполняется за счет оптимизации палитры, удаления всей избыточной информации и использованием собственного алгоритма компрессии. Поддерживаются все форматы PNG, в том числе и с альфа-каналом. Очень полезная утилита для веб-мастеров, использующих на сайтах большое количество графики или PNG-спрайтов. Но программа имеет ограничение по времени использования, после этого ее надо будет приобрести, ну или прочитать эту статью, чтобы пользоваться PNGOUTWin бесплатно в течение неограниченного времени.
Скачиваем дистрибутив, распаковываем его куда-нибудь. Единственный исполняемый файл ничем не упакован, поэтому сразу его отправляем на разбор в дизассемблер. С проявлениями триальности сталкиваемся сразу же после запуска: появляется окно с предложением зарегистрироваться.
Окно регистрации программы
Вводим любые левые данные вместо серийника и получаем сообщение, что они неправильные. Ну логично, чо.
Сообщение о неправильной регистрации
Но нас в данном случае интересует текст сообщения о неправильной регистрации. Нужная нам строка легко обнаруживается в ресурсах файла:
Строка сообщения в ресурсах
Строка имеет индекс 142 в десятичной или 8Eh в шестнадцатеричной системе счисления. Поищем в дизассемблере, где это значение используется.
Code (Assembler) : Убрать нумерацию
- .text:0043FD20 mov ecx, [ebp+var_40]
- .text:0043FD23 push eax
- .text:0043FD24 push ecx
- ; Вызвать функцию проверки
- .text:0043FD25 call sub_442D20
- .text:0043FD2A mov edx, off_479E20
- .text:0043FD30 add esp, 8
- ; Проверить ее результат, он не должен быть равен 0
- .text:0043FD33 test al, al
- .text:0043FD35 mov eax, [edx+0Ch]
- .text:0043FD38 mov ecx, offset off_479E20
- ; Переход на сообщение об успешной регистрации
- .text:0043FD3D jnz loc_43FF66
- .text:0043FD43 call eax
- .text:0043FD45 lea edi, [eax+10h]
- .text:0043FD48 mov [ebp+var_3C], edi
- .text:0043FD4B push 0 ; wLanguage
- .text:0043FD4D push 8Dh ; int
- .text:0043FD52 mov byte ptr [ebp+var_4], 7
- .text:0043FD56 call sub_4010B0
- .text:0043FD5B add esp, 8
- .text:0043FD5E test eax, eax
- .text:0043FD60 jz short loc_43FD73
- .text:0043FD62 push 8Dh ; lpWideCharStr
- .text:0043FD67 push eax ; hModule
- .text:0043FD68 lea ecx, [ebp+var_3C]
- .text:0043FD6B call sub_402330
- .text:0043FD70 mov edi, [ebp+var_3C]
- .text:0043FD73 loc_43FD73:
- .text:0043FD73 mov edx, off_479E20
- .text:0043FD79 mov eax, [edx+0Ch]
- .text:0043FD7C mov bl, 8
- .text:0043FD7E mov ecx, offset off_479E20
- .text:0043FD83 mov byte ptr [ebp+var_4], bl
- .text:0043FD86 call eax
- .text:0043FD88 lea esi, [eax+10h]
- .text:0043FD8B mov [ebp+var_38], esi
- .text:0043FD8E push 0 ; wLanguage
- ; Загрузить строку сообщения о неправильной регистрации из ресурсов
- .text:0043FD90 push 8Eh ; int
- .text:0043FD95 mov byte ptr [ebp+var_4], 9
- .text:0043FD99 call sub_4010B0
- .text:0043FD9E add esp, 8
- .text:0043FDA1 test eax, eax
- .text:0043FDA3 jz short loc_43FDB6
- .text:0043FDA5 push 8Eh ; lpWideCharStr
- .text:0043FDAA push eax ; hModule
- .text:0043FDAB lea ecx, [ebp+var_38]
- .text:0043FDAE call sub_402330
- .text:0043FDB3 mov esi, [ebp+var_38]
- .text:0043FDB6 loc_43FDB6:
- .text:0043FDB6 mov ecx, [ebp+var_44]
- .text:0043FDB9 mov edx, [ecx+4]
- .text:0043FDBC push 30h ; uType
- .text:0043FDBE push edi ; lpCaption
- .text:0043FDBF push esi ; lpText
- .text:0043FDC0 push edx ; hWnd
- .text:0043FDC1 mov byte ptr [ebp+var_4], bl
- ; Вывести сообщение о неправильной регистрации
- .text:0043FDC4 call ds:MessageBoxA
- .text:0043FDCA add esi, 0FFFFFFF0h
Code (Assembler) : Убрать нумерацию
- .text:00442D20 push ebp
- .text:00442D21 mov ebp, esp
- .text:00442D23 mov eax, [ebp+arg_4]
- .text:00442D26 sub esp, 14h
- .text:00442D29 push ebx
- .text:00442D2A mov ebx, [ebp+arg_0]
- .text:00442D2D push eax
- .text:00442D2E push ebx
- ; Вызвать еще одну функцию проверки
- .text:00442D2F call sub_442BB0
- .text:00442D34 add esp, 8
- ; Если она вернула AL=0, то регистрация неправильная
- .text:00442D37 test al, al
- ; Переход на запись регистрационных данных в реестр
- .text:00442D39 jnz short loc_442D40
- .text:00442D3B pop ebx
- .text:00442D3C mov esp, ebp
- .text:00442D3E pop ebp
- .text:00442D3F retn
- .text:00442D40 ; ---------------------------------------
- .text:00442D40 loc_442D40:
- .text:00442D40 push edi
- .text:00442D41 xor edi, edi
Code (Assembler) : Убрать нумерацию
- .text:00442C76 push edx
- .text:00442C77 push eax
- .text:00442C78 call sub_401450
- .text:00442C7D add esp, 0Ch
- .text:00442C80 cmp eax, ebx
Сравнение серийников на стеке
Интуиция мне подсказывает, что это функция сравнения правильного серийного номера, который был подсчитан из введенного регистрационного имени, и левого серийника, введенного вручную. Сохраняем значение 4V8B-48M7-PP6U-3M9Q где-нибудь в сухом прохладном месте и закрываем отладчик. Теперь запускаем программу в обычном режиме и пробуем повторить регистрацию с тем же именем, но в качестве серийника уже возьмем найденную в отладчике строку.
Программа успешно зарегистрирована
На этот раз программа приняла серийник и поблагодарила за регистрацию.
Программа успешно зарегистрирована
После повторного запуска никаких триальных окон не появляется, в окне "О программе" красуется регистрационное имя. Цель достигнута, можно возвращаться к работе над сайтами.
Просмотров: 5406 | Комментариев: 17
Метки: исследование защиты, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(19.08.2015 в 23:10):
Видимо зашкаливающая сырость, поддержка не всех плагинов и отсутствие нормальных модов?
hatmaster
(19.08.2015 в 23:07):
ManHunter, - а с 2.01 что не так?
ManHunter
(14.08.2015 в 00:36):
32-битная система, OllyDbg 1.10, IDA Pro, HIEW. Этого вполне достаточно для исследований.
SHREEF
(25.07.2015 в 19:00):
Видемо вы все сидите на win32 а у меня win64 ? и что-то отловить правильный серийник не выходит в стеке только тот что я ввожу
user
(21.07.2015 в 08:17):
Часто проверка при вводе рег.данных вообще ни при чём - программа вежливо благодарит за ввод любых регистрационных данных и говорит, что они будут учтены при следующем запуске. Главная проверка в другом месте, которое отловить сложнее, так как никаких сообщений при той проверке не выдаётся.
ManHunter
(21.07.2015 в 00:39):
Потому что проверка серийника при вводе и при запуске программы выполняется в разных местах.
DagalProject
(21.07.2015 в 00:36):
Интересно, а почему патч mov AL, 1 и Ret в начале функции проверки не меняет ситуации в лучшую сторону. Регистрирует, но .......
user
(20.07.2015 в 20:42):
.. и тогда адо отрезать оверлей и обнулить сумму в PE-хидере.
Воизбежание
Воизбежание
user
(20.07.2015 в 20:26):
А можно втулить короткий прыжок по адресу .00411B35 , поправить два байта -
- тогда 30 дней понадоедает с регистрацией, а потом, поняв, что всё зря, предлагать перестанет.
ManHunter
(20.07.2015 в 08:31):
SergVic, надо патчить проверку серийника при запуске программы и можно будет вообще сделать ее портативной.
SergVic
(20.07.2015 в 02:13):
ps Рано радуюсь не доделал
SergVic
(20.07.2015 в 01:54):
Спасибо за ваши уроки Вот, что я сделал
00401465 cmp eax[ecx] меняем на cmp eax[edx]
00442c76 push edx меняем на push eax
и программа принимает любой серийник и имя
00401465 cmp eax[ecx] меняем на cmp eax[edx]
00442c76 push edx меняем на push eax
и программа принимает любой серийник и имя
SHREEF
(19.07.2015 в 22:58):
а какими программами работали для это программы?
ManHunter
(19.07.2015 в 17:52):
Тогда надо упомянуть и Color quantizer, тоже с палитрами и оптимизацией всякие чудеса творит. Понимает JPEG, PNG, GIF, BMP, ICO и тоже бесплатная.
http://x128.ho.ua/color-quantizer.html
Но цель статьи была немного в другом :)
http://x128.ho.ua/color-quantizer.html
Но цель статьи была немного в другом :)
unreal666
(19.07.2015 в 17:48):
>Anonymous
технически PNGOUTWin и так юзают внешнюю утилиту, только внутренне. Она юзает движок от OptiPNG.
технически PNGOUTWin и так юзают внешнюю утилиту, только внутренне. Она юзает движок от OptiPNG.
Anonymous
(19.07.2015 в 15:52):
Интересно было бы сравнить её со свободной RIOT - http://luci.criosweb.ro/riot/
которая не только сжимает/оптимизирует палитру, но и позволяет дополнительно пропустить результат через один из 3 внешних утилит для оптимизации (их нужно качать отдельно и подсунуть программе).
вдобавок, умеет еще jpeg и gif
которая не только сжимает/оптимизирует палитру, но и позволяет дополнительно пропустить результат через один из 3 внешних утилит для оптимизации (их нужно качать отдельно и подсунуть программе).
вдобавок, умеет еще jpeg и gif
Добавить комментарий
Заполните форму для добавления комментария
xussr
"APQA-BF8D-7HYD-DX8S"