Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Дерево Поколений
Скриншот программы Дерево Поколений

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

Забираем с офсайта дистрибутив последней версии, устанавливаем, смотрим. Главный исполняемый файл ничем не упакован, отправляем его в дизассемблер.

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

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

Строка сообщения
Строка сообщения

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

Загрузка строки из языкового файла
Загрузка строки из языкового файла

Код загрузки строки состоит из двух частей. Это адрес ячейки памяти, куда будет записан указатель, и адрес строки. Если посмотреть по коду выше и ниже, то подобных блоков там будет предостаточно, по одному на каждую текстовую строку. Следуя по перекрестным ссылкам, раскручиваем цепочку указателей на указатели и выходим на вот такую конструкцию:
  1. .data:011B7360 off_11B7360     dd offset off_C3143C
И теперь смотрим, где и как этот указатель задействуется. По перекрестным ссылкам на него определяем, что таких участков кода будет всего три.

Перекрестные ссылки на указатель
Перекрестные ссылки на указатель

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

Указатели на строки в регистрах
Указатели на строки в регистрах

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

Программа успешно зарегистрирована
Программа успешно зарегистрирована

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

Программа успешно зарегистрирована
Программа успешно зарегистрирована

Программа успешно зарегистрирована, все ограничения сняты, в окне "О программе" красуется надпись о расширенной редакции. Хотелось бы написать, что цель достигнута, но не могу. Дело в том, что эта регистрация будет актуальна только для компьютера, на котором она была выполнена. При активации на другом компьютере потребуется пройти весь путь заново. Поэтому поищем более радикальный способ привести программу к нормальному бою, а именно превратим программу в кейген.

Напомню, если посмотреть в отладчике, то при сравнении строк вызывается следующий код:
  1. .text:00DB04B6                 mov     edx, [ebp-8Ch]
  2. .text:00DB04BC                 pop     eax
  3. .text:00DB04BD                 call    sub_408970
  4. .text:00DB04C2                 jnz     loc_DB0644
при этом указатель на строку правильного кода активации содержится в EDX или в ячейке памяти [ebp-8Ch]. Код же вывода сообщения о неправильной регистрации для этой проверки следующий:
  1. ; Стиль отображения MessageBox
  2. .text:00DB06CE                 push    10h
  3. .text:00DB06D0                 lea     edx, [ebp-0A8h]
  4. .text:00DB06D6                 mov     eax, off_11B56B4
  5. .text:00DB06DB                 call    sub_521388
  6. .text:00DB06E0                 mov     eax, [ebp-0A8h]
  7. .text:00DB06E6                 call    sub_408314
  8. ; Заголовок MessageBox
  9. .text:00DB06EB                 push    eax
  10. .text:00DB06EC                 lea     edx, [ebp-0ACh]
  11. .text:00DB06F2                 mov     eax, off_11B7360
  12. .text:00DB06F7                 call    sub_521388
  13. .text:00DB06FC                 mov     eax, [ebp-0ACh]
  14. .text:00DB0702                 call    sub_408314
  15. ; Текст сообщения
  16. .text:00DB0707                 push    eax
  17. .text:00DB0708                 mov     eax, ds:dword_1263234
  18. .text:00DB070D                 call    sub_4F8154
  19. ; Хэндл владельца окна MessageBox
  20. .text:00DB0712                 push    eax
  21. .text:00DB0713                 call    MessageBoxW
Достаточно заменить команду по адресу 00DB06FC на mov eax, [ebp-08Ch] и заNOPить следующий за ним вызов по адресу 00DB0702, чтобы в сообщении вместо строки о неправильной регистрации появился правильный серийник для компьютера, на котором программа будет запущена.

Программа в роли кейгена
Программа в роли кейгена

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

Поделиться ссылкой ВКонтакте
Просмотров: 432 | Комментариев: 1

Комментарии

Отзывы посетителей сайта о статье
Petya (03.03.2025 в 17:56):
ЦитатаДальше останется нажать Ctrl+C, вставить в какой-нибудь блокнотик текст из MessageBox

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

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0039 сек.) / Память: 4.5 Mb
Наверх