Исследование защиты программы WinImage
Скриншот программы WinImage
WinImage – одна из лучших программ для создания, чтения и редактирования образов всевозможных дисков и файловых систем, включая DMF, VHD, VMDK, FAT, ISO, NTFS и Linux. С помощью WinImage вы сможете создать образ любого носителя, просматривать его содержание, извлекать необходимые файлы и добавлять новые, а также дефрагментировать и менять формат. Но цена в 30$ и ограничения пробной версии портят все впечатление.
Скачиваем дистрибутив портативной версии, распаковываем. Главный файл ничем не упакован, сразу отправим его на анализ в дизассемблер. Параллельно посмотрим, как проявляются триальные ограничения. Из видимого - это окно при запуске программы и надпись в заголовке.
Триальное окно
При попытке регистрации неправильным серийником программа выводит вот такое сообщение:
Сообщение о неправильной регистрации
Строка сообщения обнаруживается в ресурсах. Рядом с ней находится строка о правильной регистрации. Но нас пока интересует неправильная регистрация, точнее индекс строки. Он равен 1067 в десятичной системе счисления или 42Bh в шестнадцатеричной.
Строка сообщения в ресурсах
Теперь поищем в коде место, где используется этот индекс. Найдется только один участок кода:
Code (Assembler) : Убрать нумерацию
- ; Получить регистрационное имя и введенный серийник
- .text:0044AD79 call esi ; GetDlgItemTextA
- .text:0044AD7B push ebx
- .text:0044AD7C mov eax, edi
- ; Вызвать функцию проверки
- .text:0044AD7E call sub_452224
- .text:0044AD83 xor edx, edx
- .text:0044AD85 pop ecx
- .text:0044AD86 mov ecx, dword_4B4060
- .text:0044AD8C mov dword_4B4BD8, eax
- ; Если результат проверки EAX=0, то серийник неправильный
- .text:0044AD91 cmp eax, edx
- .text:0044AD93 jz short loc_44AD9B
- .text:0044AD95 mov dword_4B3CC8, ecx
- .text:0044AD9B loc_44AD9B:
- .text:0044AD9B mov dword_4B4380, ecx
- .text:0044ADA1 cmp dword_4B3CC8, edx
- .text:0044ADA7 jnz short loc_44ADAE
- .text:0044ADA9 mov dword_4B4380, eax
- .text:0044ADAE loc_44ADAE:
- .text:0044ADAE xor esi, esi
- .text:0044ADB0 inc esi
- .text:0044ADB1 cmp eax, edx
- .text:0044ADB3 jnz short loc_44ADDE
- ; Загрузить из ресурсов строку о неправильной регистрации
- .text:0044ADB5 push 2010h
- .text:0044ADBA push 42Dh
- .text:0044ADBF mov dword_4B48D4, esi
- .text:0044ADC5 mov dword_4B4378, esi
- .text:0044ADCB mov byte_4B4818, dl
- .text:0044ADD1 mov byte_4B44B0, dl
- .text:0044ADD7 push 42Bh
- .text:0044ADDC jmp short loc_44ADF9
- .text:0044ADDE ; -------------------------------------
- .text:0044ADDE loc_44ADDE:
- .text:0044ADDE push 2040h ; uType
- .text:0044ADE3 push 42Dh ; int
- .text:0044ADE8 mov dword_4B48D4, edx
- .text:0044ADEE mov dword_4B4378, edx
- .text:0044ADF4 push 42Ah ; int
Code (Assembler) : Убрать нумерацию
- .text:00452224 push ebp
- .text:00452225 mov ebp, esp
- .text:00452227 and dword_4B4060, 0
- .text:0045222E sub esp, 200h
- .text:00452234 push esi
- .text:00452235 lea ecx, [ebp+sz] ; lpsz
- .text:0045223B call sub_45213D
- .text:00452240 mov eax, [ebp+arg_0]
- ; Вызвать функцию генерации правильного серийника
- .text:00452243 call sub_45215E
- .text:00452248 mov esi, eax
- .text:0045224A cmp esi, 0B8DCDD26h
- .text:00452250 jz loc_452461
- .text:00452256 lea eax, [ebp+sz]
- .text:0045225C push eax
- .text:0045225D lea eax, [ebp+var_200]
- .text:00452263 push esi
- .text:00452264 push eax
- ; Сравнить введенный серийник с правильным
- .text:00452265 call sub_4521D8
- .text:0045226A pop ecx
- .text:0045226B pop ecx
- .text:0045226C push eax
- .text:0045226D call sub_474E60
- .text:00452272 pop ecx
- ...
Сравнение серийников на стеке
Сравнение серийников на стеке
Сравнение серийников на стеке
Я проверил, можно брать любой из них, он подойдет для регистрации. В принципе, на этом можно и остановиться, но давайте посмотрим, как генерируется проверочный серийник, например, самый первый.
Code (Assembler) : Убрать нумерацию
- .text:0045215E sub_45215E proc near
- .text:0045215E push ebp
- .text:0045215F mov ebp, esp
- .text:00452161 sub esp, 108h
- .text:00452167 lea ecx, [ebp+sz] ; lpsz
- ; Начальное значение серийника
- .text:0045216D mov [ebp+var_4], 0047694Ch
- ; Перевести регистрационное имя в верхний регистр
- .text:00452174 call sub_45213D
- .text:00452179 lea eax, [ebp+sz]
- .text:0045217F push eax ; lpString
- .text:00452180 call ds:lstrlenA
- .text:00452186 xor ecx, ecx
- ; Длина регистрационного имени
- .text:00452188 mov [ebp+var_8], eax
- .text:0045218B test eax, eax
- .text:0045218D jle short loc_4521D3
- .text:0045218F push ebx
- .text:00452190 push esi
- .text:00452191 mov esi, [ebp+var_8]
- .text:00452194 push edi
- ; Указатель на регистрационное имя
- .text:00452195 lea edi, [ebp+sz]
- .text:0045219B loc_45219B:
- ; Цикл вычисления правильного серийника
- .text:0045219B mov eax, ecx
- .text:0045219D push 0Eh
- .text:0045219F cdq
- .text:004521A0 pop ebx
- .text:004521A1 idiv ebx
- .text:004521A3 test edx, edx
- .text:004521A5 jnz short loc_4521AA
- .text:004521A7 push 27h
- .text:004521A9 pop esi
- .text:004521AA loc_4521AA:
- .text:004521AA lea eax, [ecx+3]
- .text:004521AD movzx edx, byte ptr [edi+eax-3]
- .text:004521B2 imul edx, esi
- .text:004521B5 add [ebp+var_4], edx
- .text:004521B8 push 0Eh
- .text:004521BA cdq
- .text:004521BB pop ebx
- .text:004521BC idiv ebx
- .text:004521BE test edx, edx
- .text:004521C0 jz short loc_4521C7
- .text:004521C2 imul esi, 3
- .text:004521C5 jmp short loc_4521CA
- .text:004521C7 loc_4521C7:
- .text:004521C7 imul esi, 7
- .text:004521CA loc_4521CA:
- .text:004521CA inc ecx
- .text:004521CB cmp ecx, [ebp+var_8]
- .text:004521CE jl short loc_45219B
- .text:004521D0 pop edi
- .text:004521D1 pop esi
- .text:004521D2 pop ebx
- .text:004521D3 loc_4521D3:
- ; EAX = правильный серийник
- .text:004521D3 mov eax, [ebp+var_4]
- .text:004521D6 leave
- .text:004521D7 retn
- .text:004521D7 sub_45215E endp
Code (Assembler) : Убрать нумерацию
- ; Длина имени
- mov [len],eax
- mov [key],0047694Ch
- mov edi,regname
- xor ecx,ecx
- loc_45219B:
- mov eax, ecx
- cdq
- mov ebx,0Eh
- idiv ebx
- test edx, edx
- jnz loc_4521AA
- mov esi,27h
- loc_4521AA:
- lea eax,[ecx+3]
- movzx edx,byte [edi+ecx]
- imul edx,esi
- add [key],edx
- cdq
- mov ebx,0Eh
- idiv ebx
- test edx,edx
- jz short loc_4521C7
- imul esi,3
- jmp short loc_4521CA
- loc_4521C7:
- imul esi,7
- loc_4521CA:
- inc ecx
- cmp ecx,[len]
- jl short loc_45219B
- ; [key] -> серийник
Программа успешно зарегистрирована
Программа успешно зарегистрирована, а кейген теперь вы можете написать самостоятельно. Защита оказалась несложной, как раз для начинающих реверсеров. В качестве домашнего задания предлагаю разобрать функции генерации следующих серийников.
Просмотров: 6097 | Комментариев: 15
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Petya
(02.02.2024 в 16:32):
Пытался восстановить имя. Ничего вменяемого, слишком много коллизий. Лучший кандидат из найденного - . Не называйте так своих детей, или они не смогут купить WinImage!
ManHunter
(26.01.2024 в 13:24):
Именно так, странно только, что лишь один серийник.
Petya
(26.01.2024 в 13:22):
Меня вот сравнение с B8DCDD26 заинтересовало. Чёрный список? Не пропускать имя, "хэш" которого такой-то?
ManHunter
(14.06.2019 в 17:53):
В статье всё подробно написано, приведены все адреса и все необходимые фрагменты кода, даже выделен отдельно алгоритм генерации серийника. Если это непонятно, то я ничем помочь не могу. Делай свою курсовую самостоятельно.
ManGoL
(14.06.2019 в 17:45):
Вы же писали эту статью бесплатно. Хотя бы просто объяснить какие способы защиты применяются. либо давайте договоримся не бесплатно
ManHunter
(14.06.2019 в 15:26):
Серьезно? Сидеть рисовать блок-схему, да еще поди и бесплатно? Я лучше с детьми в парк схожу погулять.
ManGoL
(14.06.2019 в 04:04):
Здравствуйте! Огромное спасибо за Вашу статью! Не могли бы вы описать полный механизм защиты программы? Если можно в виде блок схемы.
P.S. заранее СПАСИБО!!!
P.S. заранее СПАСИБО!!!
othy
(21.07.2015 в 19:16):
ManHunter, из парочки 9.x не того. Да и "412DBD22" не катит.. это задумка такая..
ManHunter
(15.04.2015 в 00:05):
Там проверяются два серийника для Pro-версии и штук пять для Standard. У меня в статье серийник для Standard.
DimitarSerg
(15.04.2015 в 00:01):
Я в начале 2011 кейгенил (очень громко сказано), одна из первых закейгененных прог была :)
Только у меня 9 едитов для серийников, видимо разные виды.
Только у меня 9 едитов для серийников, видимо разные виды.
user
(14.04.2015 в 15:03):
Спасибо. Взаимообразно - rghost.ru/7GF2TwDxg
Спасибо too. Для коллекции.
Movic
(14.04.2015 в 09:17):
А вот генератор с исходниками кому интересно.
http://nashdisk.ru/0acc43
http://nashdisk.ru/0acc43
ManHunter
(14.04.2015 в 07:15):
Держи еще парочку для коллекции: http://rghost.ru/7rjMMvBRH
user
(14.04.2015 в 02:30):
Да, и ещё - ключи бывают двух видов - Standard и Pro.
Я не вдавался в подробности, чем они отличаются, но факт.
Вообще, пользовался патченной старой версией 6(?), мне хватало.
А с этими ключами задолбаешься их вводить на каждой машине..
Я не вдавался в подробности, чем они отличаются, но факт.
Вообще, пользовался патченной старой версией 6(?), мне хватало.
А с этими ключами задолбаешься их вводить на каждой машине..
user
(14.04.2015 в 02:11):
Попадалось два кейгена:
- от HOMBO/CORE (1998 г.) - для версии 4.х
- от ТМG (2006 г.) - для версии 8.х
Оба они нормально работают и с этой версией 9.0.
Это кстати внушает уважение к Gilles Vollant'у.
Правда, не вполне понятно, зачем там тогда приверчен демо-режим..
Хорошая программа.
- от HOMBO/CORE (1998 г.) - для версии 4.х
- от ТМG (2006 г.) - для версии 8.х
Оба они нормально работают и с этой версией 9.0.
Это кстати внушает уважение к Gilles Vollant'у.
Правда, не вполне понятно, зачем там тогда приверчен демо-режим..
Хорошая программа.
Добавить комментарий
Заполните форму для добавления комментария