Blog. Just Blog

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

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

Для разнообразия сегодня исследуем какую-нибудь игрушку. Пусть это будет Amazon Chess - красивые шахматы, где в качестве игровых фигур выступают полуобнаженные амазонки. Если же вид вооруженных блондинок и брюнеток отвлекает от игры, то можно переключить на режим обычной шахматной доски. Смущает только цена в десятку баксов.

Итак, качаем дистрибутив, устанавливаем, запускаем. Сразу открывается окно, в котором нам предлагают ввести серийный номер и зарегистрировать игру. На ввод всякого левака получаем ожидаемое "Invalid serial number".

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

Исполняемый файл ничем не упакован, строка находится легко. Теперь в дизассемблере посмотрим код, который на нее ссылается.
  1. ...
  2. CODE:004AF0FE                 push    dword ptr fs:[eax]
  3. CODE:004AF101                 mov     fs:[eax], esp
  4. CODE:004AF104                 lea     edx, [ebp+var_8]
  5. CODE:004AF107                 mov     eax, [ebx+324h]
  6. CODE:004AF10D                 call    @Mask@TCustomMaskEdit@GetText$qqrv
  7. ; Mask::TCustomMaskEdit::GetText(void)
  8. ; Получить текст из поля ввода
  9. CODE:004AF112                 mov     eax, [ebp+var_8]
  10. CODE:004AF115                 lea     edx, [ebp+var_4]
  11. CODE:004AF118                 call    @Sysutils@UpperCase$qqrx17System
  12. ; Sysutils::UpperCase(System::AnsiString)
  13. ; Перевести его в верхний регистр
  14. CODE:004AF11D                 mov     eax, [ebp+var_4]
  15. ; Вызвать процедуру проверки серийника
  16. CODE:004AF120                 call    sub_4A8CB8
  17. CODE:004AF125                 test    al, al
  18. ; Если она вернула AL!=0, то серийник правильный
  19. CODE:004AF127                 jnz     short loc_4AF150
  20. CODE:004AF129                 push    0               ; uType
  21. CODE:004AF12B                 mov     ecx, offset dword_4AF1A4 ; lpCaption
  22. CODE:004AF130                 mov     edx, offset aInvalidSerialN
  23. ; Сообщение "Invalid serial number"
  24. CODE:004AF135                 mov     eax, ds:off_4B9EA0
  25. CODE:004AF13A                 mov     eax, [eax]      ; int
  26. CODE:004AF13C                 call    @Forms@TApplication@MessageBox$qqrpxct1i
  27. ; Forms::TApplication::MessageBox(char *,char *,int)
  28. CODE:004AF141                 xor     edx, edx
  29. CODE:004AF143                 mov     eax, [ebx+324h]
  30. CODE:004AF149                 call    @Mask@TCustomMaskEdit@SetText
  31. ; Mask::TCustomMaskEdit::SetText(System::AnsiString)
  32. CODE:004AF14E                 jmp     short loc_4AF177
  33. CODE:004AF150 ; ------------------------------------------
  34. ; Игра успешно зарегистрирована
  35. CODE:004AF150 loc_4AF150:
  36. CODE:004AF150                 mov     eax, [ebp+var_4]
  37. CODE:004AF153                 call    sub_4A8D78
  38. CODE:004AF158                 mov     eax, ebx
  39. CODE:004AF15A                 call    sub_4AF1E8
  40. CODE:004AF15F                 push    0               ; uType
  41. CODE:004AF161                 mov     ecx, offset dword_4AF1A4 ; lpCaption
  42. CODE:004AF166                 mov     edx, offset aAmazonChessIsR
  43. ; Собщение "Amazon Chess is registered"
  44. CODE:004AF16B                 mov     eax, ds:off_4B9EA0
  45. CODE:004AF170                 mov     eax, [eax]      ; int
  46. CODE:004AF172                 call    @Forms@TApplication@MessageBox
  47. ; Forms::TApplication::MessageBox(char *,char *,int)
  48. CODE:004AF177                 xor     eax, eax
  49. CODE:004AF179                 pop     edx
  50. CODE:004AF17A                 pop     ecx
  51. CODE:004AF17B                 pop     ecx
  52. ...
Дальше есть два варианта - пропатчить процедуру проверки, чтобы она всегда возвращала AL=1, или попробовать разобрать алгоритм проверки.
  1. ; Если патчить, то это делается в самом начале процедуры
  2. CODE:004A8CB8                 push    ebp   ; <-- MOV AL,1; RET
  3. CODE:004A8CB9                 mov     ebp, esp
  4. CODE:004A8CBB                 add     esp, 0FFFFFFF8h
  5. CODE:004A8CBE                 push    ebx
  6. CODE:004A8CBF                 push    esi
  7. CODE:004A8CC0                 push    edi
  8. CODE:004A8CC1                 xor     edx, edx
  9. CODE:004A8CC3                 mov     [ebp+var_8], edx
  10. CODE:004A8CC6                 mov     [ebp+var_4], eax
  11. CODE:004A8CC9                 mov     eax, [ebp+var_4]
  12. CODE:004A8CCC                 call    @System@@LStrAddRef$qqrpv
  13. ; System::__linkproc__ LStrAddRef(void *)
  14. CODE:004A8CD1                 xor     eax, eax
  15. CODE:004A8CD3                 push    ebp
  16. CODE:004A8CD4                 push    offset loc_4A8D47
  17. CODE:004A8CD9                 push    dword ptr fs:[eax]
  18. CODE:004A8CDC                 mov     fs:[eax], esp
  19. CODE:004A8CDF                 xor     ebx, ebx
  20. CODE:004A8CE1                 cmp     [ebp+var_4], 0
  21. CODE:004A8CE5                 jz      short loc_4A8CF4
  22. CODE:004A8CE7                 mov     eax, [ebp+var_4]
  23. CODE:004A8CEA                 call    sub_4049D0
  24. ; Проверить длину введенного серийного номера
  25. CODE:004A8CEF                 cmp     eax, 17h
  26. CODE:004A8CF2                 jz      short loc_4A8D01
  27. CODE:004A8CF4 loc_4A8CF4:
  28. CODE:004A8CF4                 lea     eax, [ebp+var_4]
  29. ; Дополнить до маски "00000-00000-00000-00000"
  30. CODE:004A8CF7                 mov     edx, offset _str_00000_00000_000.Text
  31. CODE:004A8CFC                 call    @System@@LStrLAsg$qqrpvpxv
  32. ; System::__linkproc__ LStrLAsg(void *,void *)
  33. CODE:004A8D01 loc_4A8D01:
  34. CODE:004A8D01                 mov     esi, 3E8h
  35. CODE:004A8D06                 mov     edi, offset off_4B8A88
  36. CODE:004A8D0B loc_4A8D0B:
  37. CODE:004A8D0B                 lea     edx, [ebp+var_8]
  38. CODE:004A8D0E                 mov     eax, [ebp+var_4]
  39. ; Сканеры криптоалгоритмов показывают, что здесь вызывается функция расчета
  40. ; хэша MD5 от серийника
  41. CODE:004A8D11                 call    sub_4A9990
  42. ; Расчетная MD5 проверяется по очереди с заранее сохраненными значениями
  43. CODE:004A8D16                 mov     edx, [ebp+var_8]
  44. CODE:004A8D19                 mov     eax, [edi]
  45. CODE:004A8D1B                 call    @System@@LStrCmp$qqrv
  46. ; System::__linkproc__ LStrCmp(void)
  47. CODE:004A8D20                 jnz     short loc_4A8D26
  48. CODE:004A8D22                 mov     bl, 1
  49. CODE:004A8D24                 jmp     short loc_4A8D2C
  50. CODE:004A8D26 ; ---------------------------------------------------
  51. CODE:004A8D26 loc_4A8D26:
  52. CODE:004A8D26                 add     edi, 4
  53. CODE:004A8D29                 dec     esi
  54. CODE:004A8D2A                 jnz     short loc_4A8D0B
  55. CODE:004A8D2C loc_4A8D2C:
  56. CODE:004A8D2C                 xor     eax, eax
  57. CODE:004A8D2E                 pop     edx
  58. CODE:004A8D2F                 pop     ecx
  59. CODE:004A8D30                 pop     ecx
  60. CODE:004A8D31                 mov     fs:[eax], edx
  61. CODE:004A8D34                 push    offset loc_4A8D4E
  62. CODE:004A8D39 loc_4A8D39:
  63. CODE:004A8D39                 lea     eax, [ebp+var_8]
  64. CODE:004A8D3C                 mov     edx, 2
  65. CODE:004A8D41                 call    @System@@LStrArrayClr$qqrpvi
  66. ; System::__linkproc__ LStrArrayClr(void *,int)
  67. CODE:004A8D46                 retn
  68. CODE:004A8D47 ; ---------------------------------------------------
  69. CODE:004A8D47 loc_4A8D47:
  70. CODE:004A8D47                 jmp     unknown_libname_67
  71. CODE:004A8D4C ; ---------------------------------------------------
  72. CODE:004A8D4C                 jmp     short loc_4A8D39
  73. CODE:004A8D4E ; ---------------------------------------------------
  74. CODE:004A8D4E loc_4A8D4E:
  75. CODE:004A8D4E                 mov     eax, ebx
  76. CODE:004A8D50                 pop     edi
  77. CODE:004A8D51                 pop     esi
  78. CODE:004A8D52                 pop     ebx
  79. CODE:004A8D53                 pop     ecx
  80. CODE:004A8D54                 pop     ecx
  81. CODE:004A8D55                 pop     ebp
  82. CODE:004A8D56                 retn
В результате анализа получаем следующее: от введенного серийного номера считается хэш MD5, после чего он сравнивается по очереди с готовыми хэшами из списка внутри программы. Такую схему регистрации мы уже встречали. Способ обхода точно такой же - замена одного из хэшей в таблице на свой и регистрация с заранее известным серийным номером.

Заменяем хэш в блоке
Заменяем хэш в блоке

Первый хэш в блоке заменен на MD5 от cерийника "11111-11111-11111-11111", сохраним изменения и попробуем зарегистрировать игру. На этот раз регистрация пройдет успешно. Ну а пропатченный вариант даже не требует ввода серийника.

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

Музыкальное сопровождение в игре можно заменить на свое, музыка хранится в открытом виде в файлах main_theme.mp3 и title_theme.mp3

Поделиться ссылкой ВКонтакте
Просмотров: 5642 | Комментариев: 3

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

Комментарии

Отзывы посетителей сайта о статье
Super_DJ (09.05.2012 в 16:58):
На версии 2.12 защита осталась прежней.
Спасибо за мануал.
Jungle (26.02.2010 в 06:32):
А русская версия распространяется бесплатно. Там регистрация беслпатно.
INC. (19.02.2010 в 00:44):
Thanks

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

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

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