Blog. Just Blog

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

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

Noiseware Professional от компании Imagenomic - одна из лучших программ для удаления артефактов и цифрового шума с фотографий. Все действия выполняются буквально в несколько кликов, есть пакетный режим работы и множество ручных настроек для профессионалов. Но, как обычно бывает в таких случаях, весь кайф портит запредельная стоимость программы.

Скачиваем дистрибутив, устанавливаем, запускаем. Сразу появляется окно с предложением заплатить. Ну или с предупреждением, что триальный период закончился. Это кому как повезет.

Триальное окно
Триальное окно

Самой приметной строчкой в этом окне является "is not registered", поищем ее в файле. Он, кстати, ничем не упакован. Все лежит как на блюдечке. Там же и другие строчки, так или иначе связанные с незарегистрированным статусом программы:

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

Дальше все по классической схеме. В дизассемблере смотрим на участок кода, который ссылается на эту строку, а также все, что относится к переходам на этот участок. Вот что находится:
  1. .text:00401977                 add     eax, 10h
  2. .text:0040197A                 mov     [esp+1Ch+lpString], eax
  3. ; Указатель на участок памяти
  4. .text:0040197E                 mov     ecx, dword_4B5A68
  5. ; Загрузить в EAX значение из указателя
  6. .text:00401984                 mov     eax, [ecx-0Ch]
  7. ; Если EAX=0, то программа не зарегистрирована
  8. .text:00401987                 test    eax, eax
  9. .text:00401989                 mov     [esp+1Ch+var_4], 0
  10. .text:00401991                 jz      short loc_401A03
  11. ; Иначе добавить в окно информацию о ID программы и регистрационном имени
  12. .text:00401993                 mov     edx, dword_4B5A6C
  13. .text:00401999                 push    edx
  14. .text:0040199A                 lea     eax, [esp+20h+lpString]
  15. .text:0040199E                 push    offset aS_0     ; " %s"
  16. .text:004019A3                 push    eax
  17. .text:004019A4                 call    sub_4018E0
  18. .text:004019A9                 mov     ecx, ArgList
  19. .text:004019AF                 push    ecx             ; ArgList
  20. .text:004019B0                 lea     edx, [esp+2Ch+lpString]
  21. .text:004019B4                 push    offset aS       ; "\r\n %s"
  22. .text:004019B9                 push    edx             ; int
  23. .text:004019BA                 call    sub_401900
  24. .text:004019BF                 mov     eax, dword_4B5A68
  25. .text:004019C4                 push    eax             ; ArgList
  26. .text:004019C5                 lea     ecx, [esp+38h+lpString]
  27. .text:004019C9                 push    offset aProductIdS
  28. ; "\r\n\r\n Product ID: %s"
  29. .text:004019CE                 push    ecx             ; int
  30. .text:004019CF                 call    sub_401900
  31. .text:004019D4                 add     esp, 24h
  32. .text:004019D7                 push    0               ; nCmdShow
  33. .text:004019D9                 push    3F4h            ; nIDDlgItem
  34. .text:004019DE                 mov     ecx, esi
  35. .text:004019E0                 call    ?GetDlgItem@CWnd@@QBEPAV1@H@Z
  36. ; CWnd::GetDlgItem(int)
  37. .text:004019E5                 mov     ecx, eax
  38. .text:004019E7                 call    ?ShowWindow@CWnd@@QAEHH@Z
  39. ; CWnd::ShowWindow(int)
  40. .text:004019EC                 push    0               ; nCmdShow
  41. .text:004019EE                 push    3F5h            ; nIDDlgItem
  42. .text:004019F3                 mov     ecx, esi
  43. .text:004019F5                 call    ?GetDlgItem@CWnd@@QBEPAV1@H@Z
  44. ; CWnd::GetDlgItem(int)
  45. .text:004019FA                 mov     ecx, eax
  46. .text:004019FC                 call    ?ShowWindow@CWnd@@QAEHH@Z
  47. ; CWnd::ShowWindow(int)
  48. .text:00401A01                 jmp     short loc_401A4E
  49. .text:00401A03 ; ----------------------------------------------------
  50. .text:00401A03 loc_401A03:
  51. ; Триальная ветка алгоритма
  52. .text:00401A03                 test    edi, edi
  53. .text:00401A05                 jle     short loc_401A20
  54. ; Сообщение, если триальный срок еще не закончился
  55. .text:00401A07                 push    edi
  56. .text:00401A08                 lea     edx, [esp+20h+lpString]
  57. .text:00401A0C                 push    offset aTheEvaluationP
  58. ; "The evaluation period will expire in %d"...
  59. .text:00401A11                 push    edx
  60. .text:00401A12                 call    sub_4018E0
  61. .text:00401A17                 add     esp, 0Ch
  62. .text:00401A1A                 mov     byte ptr [esi+74h], 0
  63. .text:00401A1E                 jmp     short loc_401A36
  64. .text:00401A20 ; -----------------------------------------------
  65. .text:00401A20 loc_401A20:
  66. ; Сообщение, если триальный срок уже закончился
  67. .text:00401A20                 lea     eax, [esp+1Ch+lpString]
  68. .text:00401A24                 push    offset aTheEvaluatio_0
  69. ; "The evaluation period has been expired."...
  70. .text:00401A29                 push    eax
  71. .text:00401A2A                 call    sub_4018E0
  72. .text:00401A2F                 add     esp, 8
  73. .text:00401A32                 mov     byte ptr [esi+74h], 1
  74. .text:00401A36 loc_401A36:
  75. .text:00401A36                 push    offset aThisSoftwareIs
  76. ; "This software is not registered."
  77. .text:00401A3B                 push    4C3h            ; nIDDlgItem
  78. .text:00401A40                 mov     ecx, esi
  79. .text:00401A42                 call    ?GetDlgItem@CWnd@@QBEPAV1@H@Z
  80. ; CWnd::GetDlgItem(int)
  81. .text:00401A47                 mov     ecx, eax
  82. .text:00401A49                 call    ?SetWindowTextA@CWnd@@QAEXPBD@Z
  83. ; CWnd::SetWindowTextA(char const *)
  84. .text:00401A4E loc_401A4E:
  85. .text:00401A4E                 mov     edi, [esp+1Ch+lpString]
  86. .text:00401A52                 push    edi             ; lpString
  87. .text:00401A53                 push    4C4h            ; nIDDlgItem
  88. .text:00401A58                 mov     ecx, esi
  89. .text:00401A5A                 call    ?GetDlgItem@CWnd@@QBEPAV1@H@Z
  90. ; CWnd::GetDlgItem(int)
  91. .text:00401A5F                 mov     ecx, eax
  92. .text:00401A61                 call    ?SetWindowTextA@CWnd@@QAEXPBD@Z
  93. ; CWnd::SetWindowTextA(char const *)
Все должно быть понятно. Берется указатель по адресу 004B5A68, затем относительно него считывается двойное слово. Если оно равно нулю, то программа незарегистрирована, иначе все в порядке. Точка отсчета найдена, теперь посмотрим перекрестные ссылки, которые относятся к этому указателю.

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

Не так много. Посмотрим их все по очереди:
  1. .text:00401570                 mov     eax, dword_4B5A68
  2. .text:00401575                 cmp     dword ptr [eax-0Ch], 0
  3. .text:00401579                 push    esi
  4. .text:0040157A                 mov     esi, ecx
  5. .text:0040157C                 jz      short loc_401582
Практически такая же проверка, забиваем условный переход по адресу 0040157C NOPами. Вторая перекрестная ссылка относится к вышеуказанному коду, там по адресу 00401991 тоже патчим условный переход. Третья находится чуть ниже по коду, там, по всей видимости обрабатывается "Product ID", это нам не интересно, пропускаем.
  1. .text:004143A8                 mov     eax, dword_4B5A68
  2. .text:004143AD                 cmp     dword ptr [eax-0Ch], 0
  3. .text:004143B1                 jz      short loc_41442A
Тут также забиваем условный переход NOPами.
  1. .text:0041A060                 mov     eax, dword_4B5A68
  2. .text:0041A065                 cmp     dword ptr [eax-0Ch], 0
  3. .text:0041A069                 jnz     short loc_41A084
А вот тут условный переход надо заменить на безусловный, так как условие проверки обратное. Теперь можно сохранить изменения и попробовать запустить программу. Триальное окно при запуске пропало, в окне "О программе" сказано, что программа зарегистрирована (надпись на скриншоте уже я немного подрихтовал). Других ограничений в программе нет.

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

Вот и все, программа работает как зарегистрированная, все ограничения по времени работы сняты. Можно больше не отвлекаться от разбора новогодних фотографий, а на сэкономленные деньги лучше купите что-нибудь вкусное на праздничный стол.

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

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

Комментарии

Отзывы посетителей сайта о статье
Сергей (20.01.2013 в 15:10):
ManHunter, подскажите, пожалуйста, как найти нужный код, если все строки, касающиеся регистрации/лицензии находятся в другом файле (не исполняемом)? Например, изучаю одну программку, в exe файле никаких упоминаний о лицензии нет, но в соседнем подключаемом dll файле находит; как собственно найти соответствие строк из dll в exe файле?
Never (17.01.2013 в 00:27):
И да и нет. На сколько понимаю раньше у тебя был больше академический интерес, а сейчас больше прикладной, что не может не радовать :-)
ManHunter (16.01.2013 в 22:00):
Never, а что, в "операционной" стало появляться больше фото-софта? :)
Never (16.01.2013 в 21:58):
Как же хорошо, что ты купил фотоаппарат :-)
ManHunter (13.01.2013 в 21:10):
IDA Pro
Сергей (13.01.2013 в 15:20):
А каким Вы дизассемблером пользуетесь, не подскажите? Тоже хотел один файл попробовать помучать, скачал разные программы, но одни либо просто просмотрщики, а другие не собирают файл обратно...
VIRUS (12.01.2013 в 01:57):
Хорошая статья. Спасибо!!

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

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

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