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


Скриншот программы Diacrit

Программа Diacrit предназначена для удобного ввода многобайтных символов различных национальных алфавитов, математических символов и значков, которых нет на клавиатуре. Что-то типа стандартной таблицы символов Windows, только более специализированная. Символы заносятся в буфер обмена, а затем их можно вставить в нужное приложение. В незарегистрированной версии доступны только два первых символа, а лицензия стоит почти 10 килорублей. Будем это устранять.

Запускаем программу, сперва появляется наг-скрин. После этого выбираем какой-нибудь язык из предлагаемого списка, и попытаемся выбрать какой-нибудь символ, начиная с третьего. Получим вот такое триальное сообщение:


Сообщение незарегистрированной программы

Отлично, теперь поищем эту строчку в файле. Исполняемый файл ничем не упакован и не зашифрован, все находится в лучшем виде:


Нехорошая строка найдена

Теперь все как обычно, загоняем файл в дизассемблер и подождем, когда он закончит работу. После этого поищем в листинге ссылки на строку о незарегистрированности. Последовательно найдется несколько указателей, ссылающихся друг на друга.
; DATA XREF: DATA:off_485754
DATA:00485234 off_485234      dd offset aOnly1st2Charac
; "Only 1st 2 characters allowed in unregi"...
Code (Assembler) : Убрать нумерацию
; DATA XREF: sub_47F938+48
DATA:00485754 off_485754      dd offset off_485234

На последний указатель ссылается следующий код:
...
; Проверить двойное слово по адресу 485624
CODE:0047F971                 mov     eax, ds:off_485624
CODE:0047F976                 cmp     dword ptr [eax], 0
; Если оно не равно 0, то сообщение о незарегистрированности не выводить
CODE:0047F979                 jnz     short loc_47F9A3
CODE:0047F97B                 push    0
CODE:0047F97D                 lea     eax, [ebp+var_10]
; Указатель на строку 'Only 1st 2 characters allowed in unregistered version'
CODE:0047F980                 mov     edx, ds:off_485754
CODE:0047F986                 mov     edx, [edx]
; Вывести сообщение на экран
CODE:0047F988                 call    sub_4046DC
CODE:0047F98D                 mov     eax, [ebp+var_10]
CODE:0047F990                 mov     cx, word_48094C
CODE:0047F997                 mov     dl, 2
...

Значит, что если в двойном слове по адресу 485624 записано ненулевое значение, то программа считается зарегистрированной. Осталось выяснить условие, при котором это значение туда заносится. Посмотрим по очереди все участки кода, которые ссылаются на адрес 485624. В основном это такие же или похожие проверки на нулевое значение, а вот один код очень интересный, в нем как раз и выполняется установка значений.
CODE:0047E1FB                 mov     edx, [ebp+var_2C]
CODE:0047E1FE                 lea     eax, [ebp+var_C]
CODE:0047E201                 call    sub_404584
CODE:0047E206                 mov     eax, ds:off_4856C4
CODE:0047E20B                 mov     edx, [ebp+var_C]
CODE:0047E20E                 call    sub_404540
; Указатель на флаг зарегистрированности
CODE:0047E213                 mov     eax, ds:off_485624
CODE:0047E218                 xor     edx, edx
; Записать туда дефолтное значение 0
CODE:0047E21A                 mov     [eax], edx
CODE:0047E21C                 mov     eax, [ebp+var_8]
CODE:0047E21F                 mov     al, [eax+5]
; Какая-то проверка
CODE:0047E222                 cmp     al, 80h
; Если она не пройдена, то программа не зарегистрирована
CODE:0047E224                 jb      short loc_47E231
; Записать значение 511h в флаг зарегистрированности
CODE:0047E226                 mov     eax, ds:off_485624
CODE:0047E22B                 mov     dword ptr [eax], 511h
CODE:0047E231 loc_47E231:

Получается, что если программа зарегистрирована, то в ячейку заносится значение 511h, если не зарегистрирована - то 0. Если посмотреть выше по коду, то там видны обращения ко ключам реестра, связанным с регистрацией. И все это дело оформлено в виде отдельной процедуры. Для того, чтобы программа считала себя зарегистрированной, в ячейку должно быть записано правильное значение - 511h. Это можно сделать, пропатчив все условные переходы, связанные с проверкой наличия ключа реестра, его значения и еще множества каких-то условий, чтобы получившийся линейный код доходил до адреса с инициализацией. Второй вариант - просто записать в самое начало процедуры команды: MOV eax, ds:off_485624; MOV dword ptr
, 511h; RET. В этом случае процедура будет сразу инициализировать флаг нужным значением и возвращать управление обратно.

[IMG]https://pp.vk.me/c424630/v424630982/2d8f/vgilzSxOFcA.jpg

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

После патча пропал стартовый наг-скрин, ограничение на символы, пункт покупки в меню, и появилась информация о регистрации в окне "О программе". Задача выполнена.
Теги:
защита, взлом
Добавлено: 20 Сентября 2013 09:02:11 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...