Исследование защиты программы Sib Font Editor
Скриншот программы Sib Font Editor
Sib Font Editor - просмотрщик и редактор для растровых шрифтов в формате FNT и FON. Вы можете отредактировать готовый шрифт или создать свой собственный шрифт. Без регистрации работает только 30 запусков и постоянно показывает рекламу.
Забираем с офсайта дистрибутив, устанавливаем, смотрим. При старте появляется триальное окно с предложением потратить деньги на покупку серийника или ввести этот самый серийник.
Триальное окно
С покупкой пока повременим. На ввод левых регистрационных данных программы программа реагирует следующим сообщением.
Сообщение о неправильной регистрации
Исполняемый файл ничем не упакован, отправляем его в дизассемблер на разбор. Когда работа будет закончена, посмотрим на код, где эти строки появляются.
Code (Assembler) : Убрать нумерацию
- CODE:004E51E9 lea edx, [ebp+var_20]
- CODE:004E51EC mov eax, [ebx+2F8h]
- CODE:004E51F2 call sub_430AF8
- CODE:004E51F7 mov eax, [ebp+var_20]
- CODE:004E51FA call sub_4E4A4C
- CODE:004E51FF test eax, eax
- CODE:004E5201 jz short loc_4E520D
- CODE:004E5203 mov eax, offset aWrongKey_
- ; "Wrong key."
- CODE:004E5208 call sub_4E50D4
- CODE:004E520D loc_4E520D:
- CODE:004E520D mov eax, [ebp+var_8]
- CODE:004E5210 call sub_4E4AAC
- CODE:004E5215 mov edx, [ebx+308h]
- CODE:004E521B mov eax, [ebp+var_8]
- CODE:004E521E call sub_4E48D8
- CODE:004E5223 test eax, eax
- CODE:004E5225 jz short loc_4E5231
- CODE:004E5227 mov eax, offset aWrongKeyForThi
- ; "Wrong key for this application."
- CODE:004E522C call sub_4E50D4
- CODE:004E5231 loc_4E5231:
- CODE:004E5231 mov dl, 1
- CODE:004E5233 mov eax, off_463D64
- CODE:004E5238 call sub_463E64
Code (Assembler) : Убрать нумерацию
- CODE:004E4A4C sub_4E4A4C proc near
- CODE:004E4A4C push ebp
- CODE:004E4A4D mov ebp, esp
- CODE:004E4A4F push ecx
- CODE:004E4A50 push ebx
- CODE:004E4A51 push esi
- CODE:004E4A52 mov [ebp+var_4], eax
- CODE:004E4A55 mov eax, [ebp+var_4]
- CODE:004E4A58 call sub_404104
- CODE:004E4A5D xor eax, eax
- CODE:004E4A5F push ebp
- CODE:004E4A60 push offset loc_4E4A9C
- CODE:004E4A65 push dword ptr fs:[eax]
- CODE:004E4A68 mov fs:[eax], esp
- ; Обнулить счетчик
- CODE:004E4A6B xor esi, esi
- ; Повторить проверку 10 раз
- CODE:004E4A6D mov ebx, 0Ah
- CODE:004E4A72 loc_4E4A72:
- CODE:004E4A72 mov eax, [ebp+var_4]
- ; Вызвать функцию проверки
- CODE:004E4A75 call sub_4E47E4
- ; Добавить к счетчику результат проверки
- CODE:004E4A7A add esi, eax
- ; Пауза
- CODE:004E4A7C push 64h ; dwMilliseconds
- CODE:004E4A7E call Sleep
- CODE:004E4A83 dec ebx
- ; Следующая итерация
- CODE:004E4A84 jnz short loc_4E4A72
- CODE:004E4A86 xor eax, eax
- CODE:004E4A88 pop edx
- CODE:004E4A89 pop ecx
- CODE:004E4A8A pop ecx
- CODE:004E4A8B mov fs:[eax], edx
- CODE:004E4A8E push offset loc_4E4AA3
- CODE:004E4A93 loc_4E4A93:
- CODE:004E4A93 lea eax, [ebp+var_4]
- CODE:004E4A96 call sub_403CD0
- CODE:004E4A9B retn
- CODE:004E4A9C ; --------------------------------------
- CODE:004E4A9C loc_4E4A9C:
- CODE:004E4A9C jmp loc_4036E4
- CODE:004E4AA1 jmp short loc_4E4A93
- CODE:004E4AA3 loc_4E4AA3:
- ; Записать в EAX полученный счетчик
- CODE:004E4AA3 mov eax, esi
- CODE:004E4AA5 pop esi
- CODE:004E4AA6 pop ebx
- CODE:004E4AA7 pop ecx
- CODE:004E4AA8 pop ebp
- CODE:004E4AA9 retn
- CODE:004E4AA9 sub_4E4A4C endp
Code (Assembler) : Убрать нумерацию
- CODE:004E483D xor ebx, ebx
- CODE:004E483F mov eax, [ebp+var_4]
- CODE:004E4842 call sub_403F50
- CODE:004E4847 dec eax
- CODE:004E4848 sub eax, 2
- CODE:004E484B jl short loc_4E4861
- CODE:004E484D inc eax
- CODE:004E484E mov edx, 2
- CODE:004E4853 loc_4E4853:
- CODE:004E4853 mov ecx, [ebp+var_4]
- CODE:004E4856 movzx ecx, byte ptr [ecx+edx-1]
- CODE:004E485B xor ebx, ecx
- CODE:004E485D inc edx
- CODE:004E485E dec eax
- CODE:004E485F jnz short loc_4E4853
- CODE:004E4861 loc_4E4861:
- CODE:004E4861 mov eax, ebx
- CODE:004E4863 mov ecx, 1Eh
- CODE:004E4868 cdq
- CODE:004E4869 idiv ecx
- CODE:004E486B inc edx
- CODE:004E486C mov eax, offset a2345679qwert_0
- ; "2345679qwertyupadfghjkzxcvbnms"
- CODE:004E4871 mov al, [eax+edx-1]
- CODE:004E4875 mov edx, [ebp+var_4]
- CODE:004E4878 cmp al, [edx+esi-1]
- CODE:004E487C jz short loc_4E4881
- CODE:004E487E inc [ebp+var_8]
- CODE:004E4881 loc_4E4881:
Отлично, набор символов для серийника мы выяснили, длину серийника тоже, первую проверку узнали. Переходим ко второй проверке, которая отвечает за принадлежность серийника программе. Часть кода я тоже пропущу, там уже знакомые действия по очистке серийника от невалидных символов и проверка его длины. Дальше делается следующее:
Code (Assembler) : Убрать нумерацию
- CODE:004E4941 xor ebx, ebx
- CODE:004E4943 mov eax, [ebp+var_8]
- CODE:004E4946 call sub_403F50
- CODE:004E494B dec eax
- CODE:004E494C test eax, eax
- CODE:004E494E jle short loc_4E4963
- CODE:004E4950 mov edx, 1
- CODE:004E4955 loc_4E4955:
- CODE:004E4955 mov ecx, [ebp+var_8]
- CODE:004E4958 movzx ecx, byte ptr [ecx+edx-1]
- CODE:004E495D add ebx, ecx
- CODE:004E495F inc edx
- CODE:004E4960 dec eax
- CODE:004E4961 jnz short loc_4E4955
- CODE:004E4963 loc_4E4963:
- CODE:004E4963 mov eax, ebx
- CODE:004E4965 mov ecx, 1Eh
- CODE:004E496A cdq
- CODE:004E496B idiv ecx
- CODE:004E496D inc edx
- CODE:004E496E mov eax, offset a2345679qwert_1
- ; "2345679qwertyupadfghjkzxcvbnms"
- CODE:004E4973 mov al, [eax+edx-1]
- CODE:004E4977 mov edx, [ebp+var_4]
- CODE:004E497A cmp al, [edx+1]
- CODE:004E497D jz short loc_4E4980
Придумываем серийник, например, "sm2manhunter2pcl2x". Вторую проверку он гарантированно проходит, надо только выяснить последний символ. Перезапускаем программу под отладчиком, повторяем регистрацию, чтобы сработала точка останова на первой проверке. В шаговом режиме выясняем, что неправильный символ "x" сравнивается с правильным символом "4". Таким образом, правильный серийный номер будет иметь вид "sm2manhunter2pcl24". Закрываем отладчик, запускаем программу в обычном режиме, повторяем регистрацию с найденным серийником.
Сообщение о корректной регистрации
После перезапуска программы никакие триальные окна больше не появляются, реклама тоже пропала.
Программа успешно зарегистрирована
Цель достигнута. Генератор ключей вы можете теперь написать самостоятельно. Похожим способом решаются вопросы и с остальными программами этого разработчика.
Просмотров: 1404 | Комментариев: 3
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(10.02.2021 в 20:47):
Тут вообще можно обойтись без патчей и кейгенов. В отладчике поменять в нужных местах флаги на условных переходах, чтобы левый серийник прошел валидацию, программа запишет ветку реестра со своей регистрацией, попросит перезапустить себя и потом будет работать как ни в чем не бывало с этой левой регой. То есть валидность проверяется только при вводе серийника, а потом просто проверяется _наличие_ соответствующих ключей в реестре. Там же в реестре удаляется отсчет количества триальных запусков, если религия не дает в открытую пользоваться варезом.
REGEDIT4
[HKEY_CURRENT_USER\Software\SibCode\FontEditor\Registered]
"Key"="333333333333"
"UserName"="ManHunter / PCL"
"Email"="222222222"
REGEDIT4
[HKEY_CURRENT_USER\Software\SibCode\FontEditor\Registered]
"Key"="333333333333"
"UserName"="ManHunter / PCL"
"Email"="222222222"
doz.me
(08.02.2021 в 20:42):
я бы не разбирался с больной фантазией автора, стандартно либо nop/jmp, либо в функции mov al,1 ret.
за это и ценим твои кейген-туториалы Дмитрий, не пожалел времени, спасибо ;)
за это и ценим твои кейген-туториалы Дмитрий, не пожалел времени, спасибо ;)
Добавить комментарий
Заполните форму для добавления комментария
Wrong key for this application
74 - EB