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

Скриншот программы Ahnenblatt
Ahnenblatt - программа для ведения генеалогического дерева с очень простым интерфейсом, но при этом с очень богатыми возможностями. Одинаково хорошо подходит как для начинающих, так и для опытных специалистов. Без регистрации имеются ограничения по функционалу, а за лицензию требуется отдать почти 40 евро. Лично я бы предпочел найти деньгам более полезное применение.
Забираем с офсайта дистрибутив, устанавливаем, смотрим, что и как. Главный исполняемый файл ничем не упакован, отправляем его в дизассемблер. Файл большой, придется подождать, пока будет произведен его полный анализ. Пока попробуем зарегистрировать программу какими-нибудь левыми данными и посмотрим, как она на это отреагирует.

Сообщение о неправильной регистрации
Хех, в форме регистрации программа любезно подсказывает нам формат серийника, который надо ввести. Вот она немецкая педантичность. У нас есть строка сообщения, но программа многоязычная, так что надо определить, каким образом эта строка загружается. Долго искать не пришлось, в файле English.lng обнаруживается следующая конструкция.

Строки в языковом файле
По своей внутренней структуре языковые файлы соответствуют формату ini-файлов, строки загружаются по фиксированным индексам. Значит надо искать в исполняемом файле индексы этих строк и код, который с ними работает. Начнем с InputIncorrect, который соответствует строке о неправильной регистрации. К этому времени дизассемблер как раз должен закончить работу. Найденный код достаточно длинный, я его немного сокращу для удобства понимания.
Code (Assembler) : Убрать нумерацию
- .text:0053903B inc [ebp+var_214]
- .text:00539041 mov ecx, [ebp+var_234]
- .text:00539047 mov eax, [ecx+368h]
- .text:0053904D call sub_C58104
- .text:00539052 lea eax, [ebp+var_154]
- .text:00539058 pop edx
- ; Вызвать функцию сравнения
- .text:00539059 call sub_D96568
- .text:0053905E test al, al
- .text:00539060 jz loc_5390FB
- .text:00539066 lea eax, [ebp+var_160]
- .text:0053906C call unknown_libname_153
- .text:00539071 mov edx, eax
- .text:00539073 inc [ebp+var_214]
- .text:00539079 mov ecx, [ebp+var_234]
- .text:0053907F mov eax, [ecx+38Ch]
- .text:00539085 call sub_C58104
- .text:0053908A lea edx, [ebp+var_160]
- .text:00539090 lea eax, [ebp+var_15C]
- .text:00539096 push edx
- .text:00539097 call unknown_libname_153
- .text:0053909C mov edx, eax
- .text:0053909E inc [ebp+var_214]
- .text:005390A4 mov ecx, [ebp+var_234]
- .text:005390AA mov eax, [ecx+384h]
- .text:005390B0 call sub_C58104
- .text:005390B5 lea eax, [ebp+var_15C]
- .text:005390BB pop edx
- ; Вызвать функцию сравнения
- .text:005390BC call sub_D96568
- .text:005390C1 test al, al
- .text:005390C3 lea eax, [ebp+var_15C] ; block
- .text:005390C9 setnz cl
- .text:005390CC and ecx, 1
- .text:005390CF mov edx, 2
- .text:005390D4 push ecx
- .text:005390D5 dec [ebp+var_214]
- .text:005390DB call sub_D96484
- .text:005390E0 dec [ebp+var_214]
- .text:005390E6 lea eax, [ebp+var_160] ; block
- .text:005390EC mov edx, 2
- .text:005390F1 call sub_D96484
- .text:005390F6 pop ecx
- .text:005390F7 test ecx, ecx
- .text:005390F9 jnz short loc_5390FF
- .text:005390FB loc_5390FB:
- .text:005390FB xor eax, eax
- .text:005390FD jmp short loc_539104
- .text:005390FF ; ---------------------------------------
- .text:005390FF loc_5390FF:
- .text:005390FF mov eax, 1
- .text:00539104 loc_539104:
- .text:00539104 push eax
- .text:00539105 dec [ebp+var_214]
- .text:0053910B lea eax, [ebp+var_154] ; block
- .text:00539111 mov edx, 2
- .text:00539116 call sub_D96484
- .text:0053911B dec [ebp+var_214]
- .text:00539121 lea eax, [ebp+var_158] ; block
- .text:00539127 mov edx, 2
- .text:0053912C call sub_D96484
- .text:00539131 pop ecx
- .text:00539132 test ecx, ecx
- .text:00539134 jnz short loc_53913A
- .text:00539136 xor eax, eax
- .text:00539138 jmp short loc_53913F
- .text:0053913A ; ---------------------------------------
- .text:0053913A loc_53913A:
- .text:0053913A mov eax, 1
- .text:0053913F loc_53913F:
- .text:0053913F push eax
- .text:00539140 dec [ebp+var_214]
- .text:00539146 lea eax, [ebp+var_14C] ; block
- .text:0053914C mov edx, 2
- .text:00539151 call sub_D96484
- .text:00539156 pop ecx
- .text:00539157 test cl, cl
- .text:00539159 jz short loc_53915D
- .text:0053915B xor ebx, ebx
- .text:0053915D loc_53915D:
- .text:0053915D test bl, bl
- .text:0053915F jz loc_5399D6
- .text:00539165 call sub_422F30
- .text:0053916A test al, al
- .text:0053916C jz loc_5394E9
- ...
- ...
- ...
- .text:005399D6 ; -------------------------------------------------
- .text:005399D6 loc_5399D6:
- .text:005399D6 push 30h ; uType
- .text:005399D8 mov edx, offset aInputincorrect
- ; "InputIncorrect"
- .text:005399DD mov [ebp+var_220], 198h
- .text:005399E6 lea eax, [ebp+var_1F4]
- .text:005399EC call @System@AnsiString@$bctr$qqrpxc
- ; System::AnsiString::AnsiString(char *)

Сравнение строк
Это ни что иное, как строка введенного левого серийника, из которой удалены символы-разделители, и строка "EAD187AF409665050ED17DD6", которая по длине соответствует длине серийника.
Таким образом у нас получается полный блок регистрационных данных. Имя "ManHunter", фамилия "PCL", почта "manhunter@pcl.pcl" и серийник "EAD187-AF4096-65050E-D17DD6". Закрываем отладчик, запускаем программу в обычном режиме и повторяем регистрацию с найденными данными.

Программа успешно зарегистрирована
На этот раз программа сообщает об успешной регистрации. Внешние признаки триальности из интерфейса пропали. Проверяем возможные ограничения по функционалу, добавляя еще одну персону к демонстрационной базе. Тут тоже никаких ограничений не осталось, все добавляется как надо и в любых количествах. Цель достигнута.
Просмотров: 874 | Комментариев: 3
Метки: исследование защиты

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Накойхер
(19.08.2023 в 23:47):
Спасибо, рега и ключ от ManHunter подошли

ManHunter
(02.07.2023 в 13:55):
Так программа еще с 90-х годов, автор один раз регистрацию написал и на этом успокоился, остальное время тратит на совершенствование самого софта. Это всяко лучше, чем когда всякие говноразрабы на каждую версию своих поделий меняют схему лицензирования.

daxx0r
(02.07.2023 в 08:23):
Вроде 23 год на дворе, а некоторые до сих пор используют сравнение строк в явном виде)

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