Blog. Just Blog

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

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

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

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

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

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

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

Теперь все как обычно, загоняем файл в дизассемблер и подождем, когда он закончит работу. После этого поищем в листинге ссылки на строку о незарегистрированности. Последовательно найдется несколько указателей, ссылающихся друг на друга.
  1. ; DATA XREF: DATA:off_485754
  2. DATA:00485234 off_485234      dd offset aOnly1st2Charac
  3. ; "Only 1st 2 characters allowed in unregi"...
  1. ; DATA XREF: sub_47F938+48
  2. DATA:00485754 off_485754      dd offset off_485234
На последний указатель ссылается следующий код:
  1. ...
  2. ; Проверить двойное слово по адресу 485624
  3. CODE:0047F971                 mov     eax, ds:off_485624
  4. CODE:0047F976                 cmp     dword ptr [eax], 0
  5. ; Если оно не равно 0, то сообщение о незарегистрированности не выводить
  6. CODE:0047F979                 jnz     short loc_47F9A3
  7. CODE:0047F97B                 push    0
  8. CODE:0047F97D                 lea     eax, [ebp+var_10]
  9. ; Указатель на строку 'Only 1st 2 characters allowed in unregistered version'
  10. CODE:0047F980                 mov     edx, ds:off_485754
  11. CODE:0047F986                 mov     edx, [edx]
  12. ; Вывести сообщение на экран
  13. CODE:0047F988                 call    sub_4046DC
  14. CODE:0047F98D                 mov     eax, [ebp+var_10]
  15. CODE:0047F990                 mov     cx, word_48094C
  16. CODE:0047F997                 mov     dl, 2
  17. ...
Значит, что если в двойном слове по адресу 485624 записано ненулевое значение, то программа считается зарегистрированной. Осталось выяснить условие, при котором это значение туда заносится. Посмотрим по очереди все участки кода, которые ссылаются на адрес 485624. В основном это такие же или похожие проверки на нулевое значение, а вот один код очень интересный, в нем как раз и выполняется установка значений.
  1. CODE:0047E1FB                 mov     edx, [ebp+var_2C]
  2. CODE:0047E1FE                 lea     eax, [ebp+var_C]
  3. CODE:0047E201                 call    sub_404584
  4. CODE:0047E206                 mov     eax, ds:off_4856C4
  5. CODE:0047E20B                 mov     edx, [ebp+var_C]
  6. CODE:0047E20E                 call    sub_404540
  7. ; Указатель на флаг зарегистрированности
  8. CODE:0047E213                 mov     eax, ds:off_485624
  9. CODE:0047E218                 xor     edx, edx
  10. ; Записать туда дефолтное значение 0
  11. CODE:0047E21A                 mov     [eax], edx
  12. CODE:0047E21C                 mov     eax, [ebp+var_8]
  13. CODE:0047E21F                 mov     al, [eax+5]
  14. ; Какая-то проверка
  15. CODE:0047E222                 cmp     al, 80h
  16. ; Если она не пройдена, то программа не зарегистрирована
  17. CODE:0047E224                 jb      short loc_47E231
  18. ; Записать значение 511h в флаг зарегистрированности
  19. CODE:0047E226                 mov     eax, ds:off_485624
  20. CODE:0047E22B                 mov     dword ptr [eax], 511h
  21. CODE:0047E231 loc_47E231:
Получается, что если программа зарегистрирована, то в ячейку заносится значение 511h, если не зарегистрирована - то 0. Если посмотреть выше по коду, то там видны обращения ко ключам реестра, связанным с регистрацией. И все это дело оформлено в виде отдельной процедуры. Для того, чтобы программа считала себя зарегистрированной, в ячейку должно быть записано правильное значение - 511h. Это можно сделать, пропатчив все условные переходы, связанные с проверкой наличия ключа реестра, его значения и еще множества каких-то условий, чтобы получившийся линейный код доходил до адреса с инициализацией. Второй вариант - просто записать в самое начало процедуры команды: MOV eax, ds:off_485624; MOV dword ptr [eax], 511h; RET. В этом случае процедура будет сразу инициализировать флаг нужным значением и возвращать управление обратно.

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

После патча пропал стартовый наг-скрин, ограничение на символы, пункт покупки в меню, и появилась информация о регистрации в окне "О программе". Задача выполнена.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 3378 | Комментариев: 12

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Vitalik (23.03.2012 в 10:48):
Что то я не нахожу в новой программе это наг. Сейчас выскакивает
If you this program useful then please register at
Порывшись в коде нашел ad7yj38fhdG9rG7n65EhY87HrW297UJk8TF5Re3wj76HYp65WQ90pmZa ключик глотает но не регает. Как бы функционал смахивает на фулл. Но вот наг напрягает
0052CF10  /$  55            PUSH EBP
0052CF11  |.  89E5          MOV EBP,ESP
0052CF13  |.  B8 10D05200   MOV EAX,OFFSET 0052D010
0052CF18  |.  A3 707F5800   MOV DWORD PTR DS:[587F70],EAX
0052CF1D  |.  B8 10D25200   MOV EAX,OFFSET 0052D210
0052CF22  |.  A3 747F5800   MOV DWORD PTR DS:[587F74],EAX
0052CF27  |.  B8 00CF5200   MOV EAX,0052CF00
0052CF2C  |.  A3 787F5800   MOV DWORD PTR DS:[587F78],EAX
0052CF31  |.  B8 802A4000   MOV EAX,00402A80
0052CF36  |.  A3 7C7F5800   MOV DWORD PTR DS:[587F7C],EAX
0052CF3B  |.  A0 50D65200   MOV AL,BYTE PTR DS:[52D650]
0052CF40  |.  A2 807F5800   MOV BYTE PTR DS:[587F80],AL
0052CF45  |.  C9            LEAVE
0052CF46  \.  C3            RETN
------------------------------------------------------
0052CF50      C605 20305800 MOV BYTE PTR DS:[583020],0
0052CF57      E8 B4FFFFFF   CALL 0052CF10
0052CF5C  |.  B8 707F5800   MOV EAX,OFFSET 00587F70
0052CF61      E8 9A34EEFF   CALL 00410400
0052CF66  \.  C3            RETN
Подскажите уважаемый ManHunter как первык кол обмануть чтобы нага небыло. Нопы не помогают.
Srinivas (05.08.2011 в 10:46):
how did u get this means which program
http://www.manhunter.ru/upload...0cf63bc7.gif
Can u tell me.
ManHunter (23.05.2011 в 10:44):
Я никогда не выкладывал дистрибутивы, тем более на свой сервер. В остальном ничего особо не изменилось. Ищешь место, где инициализируется 511h, далее патч начала процедуры проверки как написано в статье. Затраченное время около 5 минут. Никаких ложных прыжков и прочей хни не замечено. Ну и пруф, конечно, чтобы не было сомнений:
http://s11.radikal.ru/i183/110...c45c2b3d.gif
mov (22.05.2011 в 18:24):
ранее вы ещё не выкладывали дистрибутивы на сервер, вследствие чего польза этого исследования уменьшилась (а может, увеличилась, ибо до всего надо доходить самому)  - по ссылке скачивается новая версия с новой логикой защиты, новыми смещениями, строками, проверкой забаненых ключей и кучей люжных прыжков для запутывания
Isaev (21.11.2010 в 17:43):
На счёт закейгенить, я в ней сам заблудился :)))
А что не доделал на кого зарегена?
Красивее бы было, а то как-то не закончено смотрится.
ezfalc0n (16.11.2010 в 01:14):
думаю автор на донате больше б заработал, хотя нет - с таким соотношением жадности и качества поделки - врядли.
хотя - мож для их менталитета - эт нормально?
ворота поставили, а забор забыли - про защиту.

спасибо - мало таких уютных местечек в сети
fat-designer (08.11.2010 в 15:02):
Надо учить ассемблер. Интересно, с фотошопом будет столь же легко?
ManHunter (01.11.2010 в 18:15):
Ну есть же платные блокноты, платные программы для выбора цвета, платные редакторы реестра, и другие программы для всякой прочей мелочи. Имя им Легион, и все ихние аффтары хотят подрезать бабла за свои поделия.
zummenix (01.11.2010 в 18:13):
Мне показалось, на вид программа простая, и за это просят денег? Скоро дойдет до того, что проги показывающие что-то типа MessageBox'а станут платными :)
Vampir (01.11.2010 в 15:37):
когда все просят патч, и кейген не нужен ;)
ManHunter (31.10.2010 в 10:22):
Щаз придет товарищ Исаев, и скажет, что надо было закейгенить. Потом придет Вовка и скажет, что опять ничего полезного :)
AyTkACT (31.10.2010 в 04:30):
запись в ds:off_485624 - изящное решение :)
Мануал, как обычно, полезен.
Спасибо.

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

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

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