Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Софтовая компания Absolute Software делает программы, нацеленные на обработку мультимедийных файлов. Среди унылых стопицотдесятых реинкарнаций всяких конвертеров проскакивают неплохие решения, например Amazon DVD Shrinker, которым я частенько пользуюсь.

Скриншот программы Absolute Video to Audio Converter
Скриншот программы Absolute Video to Audio Converter

Защита во всех программах однотипная, так что достаточно разобрать ее на примере одной из их программ. Пусть это будет Absolute Video to Audio Converter, программа для извлечения звуковых дорожек из видеофайлов. Пользовался несколько раз, впечатления хорошие. Для исследования нам конечно понадобится дистрибутив программы и отладчик. Правильные регистрационные данные мы будем находить уже известным способом "ловись рыбка большая и маленькая", то есть фишингом.

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

Строка найдена
Строка найдена

Теперь найдем и посмотрим код, который на нее ссылается. Он понятен даже без моих комментариев, в дизассемблере имена библиотечных функций говорят сами за себя:
  1. ...
  2. CODE:004D9B0C                 lea     edx, [ebp+var_4]
  3. CODE:004D9B0F                 mov     eax, [ebx+314h]
  4. ; Прочитать в память введенные имя и серийный номер
  5. CODE:004D9B15                 call    @Controls@TControl@GetText$qqrv
  6. CODE:004D9B1A                 lea     edx, [ebp+var_8]
  7. CODE:004D9B1D                 mov     eax, [ebx+318h]
  8. CODE:004D9B23                 call    @Controls@TControl@GetText$qqrv
  9. CODE:004D9B28                 mov     eax, ds:off_4E5BB0
  10. CODE:004D9B2D                 mov     eax, [eax]
  11. ; В регистрах ECX и EDX содержатся указатели на имя и введенный серийник
  12. CODE:004D9B2F                 mov     ecx, [ebp+var_8]
  13. CODE:004D9B32                 mov     edx, [ebp+var_4]
  14. ; Интересующая нас процедура проверки серийного номера
  15. CODE:004D9B35                 call    sub_4E1A34
  16. ; Если процедура вернула AL=0, то серийный номер введен неправильно
  17. CODE:004D9B3A                 test    al, al
  18. CODE:004D9B3C                 jz      short loc_4D9B6E
  19. ; Регистрация успешна, записать куда-то в реестр имя и серийник,
  20. ; поблагодарить за покупку, но это для нас уже интереса не представляет
  21. CODE:004D9B3E                 mov     eax, ds:off_4E5BB0
  22. CODE:004D9B43                 mov     eax, [eax]
  23. CODE:004D9B45                 mov     edx, [ebp+var_4]
  24. CODE:004D9B48                 call    sub_4E1BC4
  25. CODE:004D9B4D                 push    40h             ; uType
  26.                               ; "Congratulations!"
  27. CODE:004D9B4F                 mov     ecx, offset aCongratulation
  28.                               ; "Register successfully!  Thank you for y"...
  29. CODE:004D9B54                 mov     edx, offset aRegisterSucces
  30. CODE:004D9B59                 mov     eax, ds:off_4E5E40
  31. CODE:004D9B5E                 mov     eax, [eax]      ; int
  32. CODE:004D9B60                 call    @Forms@TApplication@MessageBox$qqrpxct1i
  33. CODE:004D9B65                 mov     eax, ebx
  34. CODE:004D9B67                 call    @Forms@TCustomForm@Close$qqrv
  35. CODE:004D9B6C                 jmp     short loc_4D9B86
  36. CODE:004D9B6E ; ---------------------------------------------------------
  37. CODE:004D9B6E loc_4D9B6E:
  38. ; Сюда мы попадем в случае неудачной регистрации
  39. CODE:004D9B6E                 push    40h             ; uType
  40. CODE:004D9B70                 mov     ecx, offset aSorry ; "Sorry"
  41.                               ; "Invalid user name or registration code!"
  42. CODE:004D9B75                 mov     edx, offset aInvalidUserNam
  43. CODE:004D9B7A                 mov     eax, ds:off_4E5E40
  44. CODE:004D9B7F                 mov     eax, [eax]      ; int
  45. CODE:004D9B81                 call    @Forms@TApplication@MessageBox$qqrpxct1i
  46. CODE:004D9B86 loc_4D9B86:
  47. CODE:004D9B86                 xor     eax, eax
  48. CODE:004D9B88                 pop     edx
  49. CODE:004D9B89                 pop     ecx
  50. ...
То есть процедура проверки серийного номера должна вернуть в регистре AL единицу в случае успешной регистрации и ноль если введенные данные ошибочные. Теперь посмотрим саму процедуру проверки. Ее можно просто пропатчить, чтобы она всегда возвращала 1, но тогда теряется весь интерес к исследованию. Пройдем по ней отладчиком в пошаговом режиме.
  1. ; Процедура проверки серийного номера. В принципе, можно пропатчить первые
  2. ; команды на MOV AL,1 - RET, но это как-то неспортивно :)
  3. CODE:004E1A34                 push    ebp
  4. CODE:004E1A35                 mov     ebp, esp
  5. CODE:004E1A37                 add     esp, 0FFFFFFE4h
  6. CODE:004E1A3A                 push    ebx
  7. CODE:004E1A3B                 xor     ebx, ebx
  8. CODE:004E1A3D                 mov     [ebp+var_C], ebx
  9. CODE:004E1A40                 mov     [ebp+var_8], ecx
  10. CODE:004E1A43                 mov     [ebp+var_4], edx
  11. CODE:004E1A46                 mov     eax, [ebp+var_4]
  12. CODE:004E1A49                 call    @System@@LStrAddRef$qqrpv
  13. CODE:004E1A4E                 mov     eax, [ebp+var_8]
  14. CODE:004E1A51                 call    @System@@LStrAddRef$qqrpv
  15. CODE:004E1A56                 lea     eax, [ebp+var_14]
  16. CODE:004E1A59                 mov     edx, off_4D6428
  17. CODE:004E1A5F                 call    unknown_libname_93
  18. CODE:004E1A64                 lea     eax, [ebp+var_1C]
  19. CODE:004E1A67                 mov     edx, off_4D6428
  20. CODE:004E1A6D                 call    unknown_libname_93
  21. CODE:004E1A72                 xor     eax, eax
  22. ; Тут начинаются всякие шаманские танцы по превращению имени в правильный
  23. ; серийный номер...
  24. CODE:004E1A74                 push    ebp
  25. CODE:004E1A75                 push    offset loc_4E1AF6
  26. CODE:004E1A7A                 push    dword ptr fs:[eax]
  27. CODE:004E1A7D                 mov     fs:[eax], esp
  28. CODE:004E1A80                 xor     ebx, ebx
  29. CODE:004E1A82                 lea     edx, [ebp+var_14]
  30. CODE:004E1A85                 mov     eax, ds:off_4E5A30
  31. CODE:004E1A8A                 call    sub_4D6AB8
  32. CODE:004E1A8F                 lea     edx, [ebp+var_1C]
  33. CODE:004E1A92                 mov     eax, ds:off_4E5A34
  34. CODE:004E1A97                 call    sub_4D6AB8
  35. CODE:004E1A9C                 lea     eax, [ebp+var_4]
  36. CODE:004E1A9F                 push    eax
  37. CODE:004E1AA0                 lea     ecx, [ebp+var_1C]
  38. CODE:004E1AA3                 lea     edx, [ebp+var_14]
  39. CODE:004E1AA6                 mov     eax, [ebp+var_4]
  40. CODE:004E1AA9                 call    sub_4D8EA4
  41. CODE:004E1AAE                 lea     edx, [ebp+var_C]
  42. CODE:004E1AB1                 mov     eax, [ebp+var_4]
  43. CODE:004E1AB4                 call    sub_4D6690
  44. ; ... и заканчивается вся эта движуха банальным сравнением правильного
  45. ; серийного номера и введенного нами. Регистр EAX указывает на введенные
  46. ; данные, EDX указывает на правильный серийный номер для введенного имени
  47. CODE:004E1AB9                 mov     eax, [ebp+var_8]
  48. CODE:004E1ABC                 mov     edx, [ebp+var_C]
  49. ; Вызвать функцию сравнения двух строк
  50. CODE:004E1ABF                 call    @System@@LStrCmp$qqrv
  51. CODE:004E1AC4                 jnz     short loc_4E1AC8
  52. CODE:004E1AC6                 mov     bl, 1
  53. CODE:004E1AC8 loc_4E1AC8:
  54. CODE:004E1AC8                 xor     eax, eax
  55. CODE:004E1ACA                 pop     edx
  56. CODE:004E1ACB                 pop     ecx
  57. ...
Содержимое регистров перед сравнением никаких сомнений вызывать не должно:

Правильный серийный номер
Правильный серийный номер

Заковыристая строка, обведенная красной рамкой, - это и есть правильный серийный номер для введенного имени. Сохраним его куда-нибудь и повторим регистрацию, но теперь уже с найденным серийником.

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

Программа примет новый серийник и поздравит нас с успешной регистрацией. Теперь очень желательно перезапустить программу и проверить функционал, но и тут тоже никаких сюрпризов не будет. Значит все сделано правильно. Таким же способом находятся регистрационные данные для других программ этого разработчика.

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

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

Комментарии

Отзывы посетителей сайта о статье
irokkezz (21.09.2011 в 22:35):
Свой вопрос снимаю.
Лучше пропатчить функцию, отвечающую за считывание регистрационных данных из реестра по адресу 004e1844, тогда рег. данные вообще вводить не нужно.
irokkezz (21.09.2011 в 13:39):
Доброго времени суток, ManHunter!
С фишингом потренировался, получилось, спасибо.
А вот пропатчивание функции проверки серийника по адресу 004E1A34 почему то не проходит, признаки триальности остаются.
harut (23.04.2009 в 13:46):
!
виртуоз.
спасибо за прекрасный и содержательный блог.
ManHunter (22.04.2009 в 10:02):
Конечно видеофайлов. Поправил, спасибо.
Gorba (22.04.2009 в 09:57):
"программа для извлечения звуковых дорожек из аудиофайлов" - Наверное из видеофайлов?

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

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

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