
Скриншот программы 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
Программа успешно "зарегистрирована"
После патча пропал стартовый наг-скрин, ограничение на символы, пункт покупки в меню, и появилась информация о регистрации в окне "О программе". Задача выполнена.