Blog. Just Blog

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

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

Sonne Flash Decompiler - предназначена для извлечения объектов и других элементов, используемых во flash-файлах. Она также позволяет извлекать файлы SWF из EXE-контейнеров и редактировать ролики в формате SWF - изменять текст, шрифты, картинки, звуки, формы, скрипты и другие элементы, находящиеся во flash-файле. Естественно, за все это аффтары хотят денег.

Качаем дистрибутив, распаковываем, устанавливаем. Сразу после запуска нам предлагают ввести регистрационные данные, а точнее имя, адрес электронной почты и серийный номер.

Окно регистрации программы
Окно регистрации программы

На ввод всякого левака программа реагирует сообщением "Invalid registration key!". Исполняемый файл ничем не упакован, искомая строчка лежит в открытом виде:

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

Традиционно переходим к дизассемблированию с целью выяснить условия появления этой строки. Код достаточно понятный, но я постараюсь его максимально прокомментировать:
  1. CODE:00644014      lea     edx, [ebp+var_28]
  2. CODE:00644017      mov     eax, [ebx+300h]
  3. ; Прочитать введенный текст из поля ввода
  4. CODE:0064401D      call    @Controls@TControl@GetText$qqrv
  5. CODE:00644022      cmp     [ebp+var_28], 0
  6. ; Если его длина не нулевая, то продолжить
  7. CODE:00644026      jnz     short loc_64406F
  8. ; Сообщение "Invalid registration key!"
  9. CODE:00644028      push    30h             ; uType
  10. CODE:0064402A      lea     edx, [ebp+var_2C]
  11. ; Указатель на указатель на строку "Invalid registration key!"
  12. CODE:0064402D      mov     eax, ds:off_662AFC
  13. CODE:00644032      mov     eax, [eax]
  14. CODE:00644034      call    @Forms@TApplication@GetTitle$qqrv
  15. CODE:00644039      mov     eax, [ebp+var_2C]
  16. CODE:0064403C      call    @System@@LStrToPChar$qqrx...
  17. CODE:00644041      push    eax             ; lpCaption
  18. CODE:00644042      mov     eax, ds:off_66262C
  19. CODE:00644047      mov     eax, [eax]
  20. CODE:00644049      call    @System@@LStrToPChar$qqrx...
  21. CODE:0064404E      push    eax             ; lpText
  22. CODE:0064404F      mov     eax, ebx
  23. CODE:00644051      call    @Controls@TWinControl@GetHandle$qqrv
  24. CODE:00644056      push    eax             ; hWnd
  25. CODE:00644057      call    MessageBoxA_0
  26. CODE:0064405C      mov     eax, [ebx+300h]
  27. CODE:00644062      mov     edx, [eax]
  28. CODE:00644064      call    dword ptr [edx+0C4h]
  29. CODE:0064406A      jmp     loc_644122
  30. CODE:0064406F ; -------------------------------------------
  31. ; Подготовка всех трех строк (имя, email и серийник) к проверке
  32. CODE:0064406F loc_64406F:
  33. CODE:0064406F      lea     eax, [ebp+var_30]
  34. CODE:00644072      mov     edx, [ebp+var_8]
  35. CODE:00644075      call    @System@@LStrFromWStr$qqrr...
  36. CODE:0064407A      mov     eax, [ebp+var_30]
  37. CODE:0064407D      push    eax
  38. CODE:0064407E      push    0
  39. CODE:00644080      lea     eax, [ebp+var_34]
  40. CODE:00644083      mov     edx, [ebp+var_4]
  41. CODE:00644086      call    @System@@LStrFromWStr$qqrr...
  42. CODE:0064408B      mov     eax, [ebp+var_34]
  43. CODE:0064408E      push    eax
  44. CODE:0064408F      lea     eax, [ebp+var_38]
  45. CODE:00644092      mov     edx, [ebp+var_C]
  46. CODE:00644095      call    @System@@LStrFromWStr$qqrr...
  47. CODE:0064409A      mov     edx, [ebp+var_38]
  48. CODE:0064409D      mov     eax, ds:off_662550
  49. CODE:006440A2      mov     eax, [eax]
  50. CODE:006440A4      pop     ecx
  51. ; Вызвать процедуру проверки серийного номера
  52. CODE:006440A5      call    @Sqledit@EditSQL$qqrp16Classes...
  53. ; Если она вернула AL!=0, то регистрационные данные верные
  54. CODE:006440AA      test    al, al
  55. CODE:006440AC      jz      short loc_6440CB
  56. ; Регистрация прошла успешно
  57. CODE:006440AE      mov     eax, ds:off_662550
  58. CODE:006440B3      mov     eax, [eax]
  59. CODE:006440B5      call    sub_626308
  60. ; Установить флажок "Зарегистрировано"
  61. CODE:006440BA      mov     eax, ds:off_66284C
  62. CODE:006440BF      mov     byte ptr [eax], 1
  63. CODE:006440C2      mov     eax, ebx
  64. ; Вывести сообщение об удачной регистрации
  65. CODE:006440C4      call    sub_643E88
  66. CODE:006440C9      jmp     short loc_644122
  67. CODE:006440CB ; ------------------------------------------------
  68. CODE:006440CB loc_6440CB:
  69. ; Вывести сообщение "Invalid registration key!"
  70. CODE:006440CB      mov     eax, ds:off_66284C
  71. CODE:006440D0      mov     byte ptr [eax], 0
  72. CODE:006440D3      push    10h             ; uType
  73. CODE:006440D5      lea     edx, [ebp+var_3C]
  74. CODE:006440D8      mov     eax, ds:off_662AFC
  75. CODE:006440DD      mov     eax, [eax]
  76. CODE:006440DF      call    @Forms@TApplication@GetTitle$qqrv
  77. CODE:006440E4      mov     eax, [ebp+var_3C]
  78. CODE:006440E7      call    @System@@LStrToPChar$qqrx17System@AnsiString
  79. CODE:006440EC      push    eax             ; lpCaption
  80. ; Указатель на указатель на строку "Invalid registration key!"
  81. CODE:006440ED      mov     eax, ds:off_66262C
  82. CODE:006440F2      mov     eax, [eax]
  83. CODE:006440F4      call    @System@@LStrToPChar$qqrx17System@AnsiString
  84. CODE:006440F9      push    eax             ; lpText
  85. CODE:006440FA      mov     eax, ebx
  86. CODE:006440FC      call    @Controls@TWinControl@GetHandle$qqrv
  87. CODE:00644101      push    eax             ; hWnd
  88. CODE:00644102      call    MessageBoxA_0
  89. ...
Итого, что мы имеем. По адресу ds:off_66284C хранится флаг регистрации. Если байт по этому адресу равен 1, то программа считается зарегистрированной, иначе нет. Ссылок на него слишком много, чтобы патчить их все, поэтому попробуем пройти под отладчиком процедуру проверки регистрационных данных.
  1. CODE:006260DC      push    ebp
  2. CODE:006260DD      mov     ebp, esp
  3. CODE:006260DF      add     esp, 0FFFFFFF4h
  4. CODE:006260E2      push    ebx
  5. CODE:006260E3      push    esi
  6. CODE:006260E4      xor     ebx, ebx
  7. CODE:006260E6      mov     [ebp+var_C], ebx
  8. CODE:006260E9      mov     [ebp+var_8], ecx
  9. CODE:006260EC      mov     [ebp+var_4], edx
  10. CODE:006260EF      mov     esi, eax
  11. CODE:006260F1      mov     eax, [ebp+var_4]
  12. CODE:006260F4      call    @System@@LStrAddRef$qqrpv
  13. CODE:006260F9      mov     eax, [ebp+var_8]
  14. CODE:006260FC      call    @System@@LStrAddRef$qqrpv
  15. CODE:00626101      mov     eax, [ebp+arg_4]
  16. CODE:00626104      call    @System@@LStrAddRef$qqrpv
  17. CODE:00626109      mov     eax, [ebp+arg_0]
  18. CODE:0062610C      call    @System@@LStrAddRef$qqrpv
  19. CODE:00626111      xor     eax, eax
  20. CODE:00626113      push    ebp
  21. CODE:00626114      push    offset loc_62619C
  22. CODE:00626119      push    dword ptr fs:[eax]
  23. CODE:0062611C      mov     fs:[eax], esp
  24. CODE:0062611F      cmp     byte ptr [esi+34h], 0
  25. CODE:00626123      jnz     short loc_626129
  26. CODE:00626125      xor     ebx, ebx
  27. CODE:00626127      jmp     short loc_626174
  28. CODE:00626129 ; ------------------------------------
  29. CODE:00626129 loc_626129:
  30. CODE:00626129      lea     edx, [ebp+var_C]
  31. CODE:0062612C      mov     eax, esi
  32. CODE:0062612E      call    sub_626708
  33. ; Функция сравнения двух текстовых строк
  34. CODE:00626133      mov     edx, [ebp+var_C]
  35. CODE:00626136      mov     eax, [ebp+var_4]
  36. CODE:00626139      call    @System@@LStrCmp$qqrv
  37. CODE:0062613E      jnz     short loc_626172
  38. CODE:00626140      mov     bl, 1
  39. CODE:00626142      mov     dl, 2
  40. CODE:00626144      mov     eax, esi
  41. CODE:00626146      call    sub_6271E4
  42. CODE:0062614B      mov     edx, [ebp+var_8]
  43. CODE:0062614E      mov     eax, esi
  44. CODE:00626150      call    sub_62683C
  45. ...
Под отладчиком в пошаговом режиме видны всякие этапы подготовки строк, какие-то действия с ними, и кульминация - вызов функции сравнения двух строк по адресу 00626139.

Серийный номер в отладчике
Серийный номер в отладчике

В окне регистров видно, что сравнивается наш левый серийник с какой-то красивой строкой "SFD2568741". Попробуем повторить регистрацию, но теперь вместо серийного номера используем строку из отладчика "SFD2568741". На этот раз никакой ругани нет, наоборот, программа радостно приняла серийник и поблагодарила:

Сообщение об успешной регистрации
Сообщение об успешной регистрации

В окне "About" также появились наши регистрационные данные, стартовое окно с предложением купить также исчезло:

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
will shine (08.10.2011 в 04:51):
> затем если это делфи иду в DeDe. Там уже нет проблем пройти по кнопочке в процедуру.

DeDe - конечно, полезная вещь, но дизассемблер в ней уж очень примитивный, да и не развивается она уже больше, насколько мне известно. Больше годится для получения максимальной информации о ресурсах и классах приложения для последующего анализа логики опять же в IDA.
Есть ещё такая штука для Delphi реверсинга как Interactive Delphi Reconstructor (IDR): http://kpnc.org/idr32/en/
Serg (10.07.2011 в 01:18):
ManHunter, скажите пожалуйста, как вы переходите из heiw в Ida?
Я делаю так: сначала смотрю Peid на чем сделана прога, затем если это делфи иду в DeDe. Там уже нет проблем пройти по кнопочке в процедуру.
Fantom (26.06.2011 в 22:35):
ManHunter, спасибо за ответ! Буду дальше постигать реверсинг :-)
ManHunter (26.06.2011 в 17:08):
Voffka, ну так хорошо же :) Нашим проще. Видимо из-за лени или недостатка навыков юзают какой-то сторонний компонент.

Fantom, в IDA нажимаешь Ctrl+X, получаешь список перекрестных ссылок. В данном случае будет указатель на строку. И ссылка в коде уже на него, поэтому я так и написал: "Указатель на указатель на строку".
mov (25.06.2011 в 12:25):
процедура регистрации вызывается по адресу:
006440A5  |.  E8 3220FEFF   CALL <SonneFla.VeeRegisterManager.sub_00>
006440AA  |.  84C0          TEST AL,AL
006440AC  |. /74 1D         JE SHORT SonneFla.006440CB

после вызова идёт проверка al, и если al=0, то серийный номер не правильный.
Voffka (25.06.2011 в 09:32):
Не понятно, мода чтоль пошла на такую защиту, уже не один десяток прог встретил с идентичной защитой, причем от разных авторов.
mov (25.06.2011 в 00:00):
Dimas - спасибо, так получается (с помощью IDR). А как только Олей и Идой - непонятно!
Fantom (24.06.2011 в 23:41):
меня, как и mov`a, интересует как вы переходите с адреса в HIEW d IDA ?
mov (24.06.2011 в 23:34):
скажите, как от найденного сообщения (в Hiew адрес 6288А0) перешли в IDA  по адресу листинга 644014? У меня все ссылки на эту строку начинаются с адреса 62.., т.е. далеко и не очевидно. Как заставили иду отображать вызовы ф-ций в виде имен, а не адресов?
DimitarSerg (24.06.2011 в 16:53):
Защита простенькая, раз серийник в открытом виде валяется... Сниффер для таких прог - раз плюнуть, но всеравно спасибо - знания и опыт лишними не бывают !
Dimas (24.06.2011 в 05:42):
Я сделал слегка по другому - декомпилировал в IDR, в форме ENTERKEYFORM брякнулся на нажатие кнопки регистрации и выудил код отладчиком)
Спасибо за статьи по реверсу

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

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

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