
Исследование защиты программы Дерево Поколений

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

Сообщение о неправильной регистрации
При попытке регистрации левыми данными программа реагирует вот таким сообщением. Интерфейс многоязычный, все строки содержатся в файле GTLang.ini.

Строка сообщения
Строке сообщения соответствует индекс sRegText3. Когда дизассемблер закончит работу, поищем место в коде, где эта строка используется.

Загрузка строки из языкового файла
Код загрузки строки состоит из двух частей. Это адрес ячейки памяти, куда будет записан указатель, и адрес строки. Если посмотреть по коду выше и ниже, то подобных блоков там будет предостаточно, по одному на каждую текстовую строку. Следуя по перекрестным ссылкам, раскручиваем цепочку указателей на указатели и выходим на вот такую конструкцию:
Code (Assembler) : Убрать нумерацию
- .data:011B7360 off_11B7360 dd offset off_C3143C

Перекрестные ссылки на указатель
Пройдясь по каждому фрагменту, выясняем, что конструкции достаточно однотипные. Проверка условия, затем условный переход или вывод сообщения о неправильной регистрации. Для удобства восприятия я пропущу часть кода.
Code (Assembler) : Убрать нумерацию
- .text:00DAFF2A call sub_4EF314
- ; Проверка
- .text:00DAFF2F cmp dword ptr [ebp-10h], 0
- ; Условный переход
- .text:00DAFF33 jnz loc_DB0000
- .text:00DAFF39 lea edx, [ebp-14h]
- .text:00DAFF3C mov eax, off_11B74C8
- ...
- ...
- .text:00DAFFD4 push eax
- .text:00DAFFD5 lea edx, [ebp-1Ch]
- ; Строка сообщения
- .text:00DAFFD8 mov eax, off_11B7360
- .text:00DAFFDD call sub_521388
- .text:00DAFFE2 mov eax, [ebp-1Ch]
- .text:00DAFFE5 call sub_408314
- .text:00DAFFEA push eax
- .text:00DAFFEB mov eax, ds:dword_1263234
- .text:00DAFFF0 call sub_4F8154
- .text:00DAFFF5 push eax
- .text:00DAFFF6 call MessageBoxW
- .text:00DAFFFB jmp loc_DB0718
Code (Assembler) : Убрать нумерацию
- .text:00DB005B mov edx, [ebp-2Ch]
- .text:00DB005E pop eax
- .text:00DB005F call sub_408970
- ; Условный переход
- .text:00DB0064 jnz loc_DB01E2
- ...
- ...
- .text:00DB027D push eax
- .text:00DB027E lea edx, [ebp-54h]
- ; Строка сообщения
- .text:00DB0281 mov eax, off_11B7360
- .text:00DB0286 call sub_521388
- .text:00DB028B mov eax, [ebp-54h]
- .text:00DB028E call sub_408314
- .text:00DB0293 push eax
- .text:00DB0294 mov eax, ds:dword_1263234
- .text:00DB0299 call sub_4F8154
- .text:00DB029E push eax
- .text:00DB029F call MessageBoxW
- .text:00DB02A4 jmp loc_DB0718
Code (Assembler) : Убрать нумерацию
- .text:00DB04B6 mov edx, [ebp-8Ch]
- .text:00DB04BC pop eax
- .text:00DB04BD call sub_408970
- ; Условный переход
- .text:00DB04C2 jnz loc_DB0644
- ...
- ...
- .text:00DB06EB push eax
- .text:00DB06EC lea edx, [ebp-0ACh]
- ; Строка сообщения
- .text:00DB06F2 mov eax, off_11B7360
- .text:00DB06F7 call sub_521388
- .text:00DB06FC mov eax, [ebp-0ACh]
- .text:00DB0702 call sub_408314
- .text:00DB0707 push eax
- .text:00DB0708 mov eax, ds:dword_1263234
- .text:00DB070D call sub_4F8154
- .text:00DB0712 push eax
- .text:00DB0713 call MessageBoxW

Указатели на строки в регистрах
Когда сработает одна из точек останова, в регистрах EAX и EDX будут указатели на строки. Первая - это левый серийник, который был введен, а вторая строка выглядит куда как симпатичнее и очень напоминает правильный код. Напомню, что именно по результатам сравнения этих строк выполняется или не выполняется условный переход. Сохраним второе значение в сухом прохладном месте. Закрываем отладчик, снова запускаем программу и активируем ее найденным серийником.

Программа успешно зарегистрирована
Программа благодарит за регистрацию. Как всегда пожалуйста, рады были посодействовать. Гы.

Программа успешно зарегистрирована
Программа успешно зарегистрирована, все ограничения сняты, в окне "О программе" красуется надпись о расширенной редакции. Хотелось бы написать, что цель достигнута, но не могу. Дело в том, что эта регистрация будет актуальна только для компьютера, на котором она была выполнена. При активации на другом компьютере потребуется пройти весь путь заново. Поэтому поищем более радикальный способ привести программу к нормальному бою, а именно превратим программу в кейген.
Напомню, если посмотреть в отладчике, то при сравнении строк вызывается следующий код:
Code (Assembler) : Убрать нумерацию
- .text:00DB04B6 mov edx, [ebp-8Ch]
- .text:00DB04BC pop eax
- .text:00DB04BD call sub_408970
- .text:00DB04C2 jnz loc_DB0644
Code (Assembler) : Убрать нумерацию
- ; Стиль отображения MessageBox
- .text:00DB06CE push 10h
- .text:00DB06D0 lea edx, [ebp-0A8h]
- .text:00DB06D6 mov eax, off_11B56B4
- .text:00DB06DB call sub_521388
- .text:00DB06E0 mov eax, [ebp-0A8h]
- .text:00DB06E6 call sub_408314
- ; Заголовок MessageBox
- .text:00DB06EB push eax
- .text:00DB06EC lea edx, [ebp-0ACh]
- .text:00DB06F2 mov eax, off_11B7360
- .text:00DB06F7 call sub_521388
- .text:00DB06FC mov eax, [ebp-0ACh]
- .text:00DB0702 call sub_408314
- ; Текст сообщения
- .text:00DB0707 push eax
- .text:00DB0708 mov eax, ds:dword_1263234
- .text:00DB070D call sub_4F8154
- ; Хэндл владельца окна MessageBox
- .text:00DB0712 push eax
- .text:00DB0713 call MessageBoxW

Программа в роли кейгена
Дальше останется нажать Ctrl+C, вставить в какой-нибудь блокнотик текст из MessageBox, скопировать оттуда правильный серийник и повторить активацию. Вот теперь цель точно достигнута. С особым цинизмом, да.
Просмотров: 432 | Комментариев: 1
Метки: исследование защиты

Комментарии
Отзывы посетителей сайта о статье

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

Век живи...
Впервые узнал, что из MessageBox можно копировать без специальных программ.