Blog. Just Blog

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

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

eXeScope - одна из моих любимых программ для работы с ресурсами исполняемых файлов. Последняя версия 6.50, давно не обновлялась, но на работоспособность это никак не влияет. eXeScope предоставляет широкий выбор инструментов как для начинающего исследователя, так и для профессиональных реверсеров: вывод информации о заголовке, функциях импорта, просмотр различных ресурсов с возможностью их редактирования, импорта и экспорта. А также eXeScope сам может оказаться неплохим объектом для исследования, потому что программа шароварная с двухнедельным испытательным периодом.

Качаем дистрибутив (офсайт на японском языке, без переводчиков там все равно делать нечего), распаковываем, запускаем. Попытаемся зарегистрировать программу с любыми левыми данными, получаем сообщение "Invalid ID or Name". Файл ничем не упакован, строка легко находится.

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

Посмотрим в дизассемблере код, который на нее ссылается.
  1. ...
  2. CODE:004C2AB0                 mov     edx, ds:off_4CFE4C
  3. CODE:004C2AB6                 mov     edx, [edx]
  4. CODE:004C2AB8                 mov     eax, ds:off_4CFC54
  5. CODE:004C2ABD                 mov     eax, [eax]
  6. ; Вызвать процедуру проверки регистрационных данных
  7. CODE:004C2ABF                 call    sub_4CBF7C
  8. CODE:004C2AC4                 test    al, al
  9. ; Если она вернула AL=0, то регистрация неправильная
  10. CODE:004C2AC6                 jz      loc_4C2B59
  11. CODE:004C2ACC                 mov     eax, ds:off_4CFEE8
  12. CODE:004C2AD1                 mov     eax, [eax]
  13. CODE:004C2AD3                 call    sub_404C50
  14. CODE:004C2AD8                 test    eax, eax
  15. CODE:004C2ADA                 jle     short loc_4C2B59
  16. ; Сохранить регистрационные данные
  17. CODE:004C2ADC                 lea     edx, [ebp+var_10]
  18. CODE:004C2ADF                 mov     eax, ds:off_4CFEFC
  19. CODE:004C2AE4                 mov     eax, [eax]
  20. CODE:004C2AE6                 call    sub_4926FC
  21. CODE:004C2AEB                 mov     eax, [ebp+var_10]
  22. CODE:004C2AEE                 lea     ecx, [ebp+var_C]
  23. CODE:004C2AF1                 mov     edx, offset dword_4C2BB8
  24. CODE:004C2AF6                 call    sub_409B20
  25. CODE:004C2AFB                 mov     ecx, [ebp+var_C]
  26. CODE:004C2AFE                 mov     dl, 1
  27. CODE:004C2B00                 mov     eax, off_43BE2C
  28. CODE:004C2B05                 call    sub_43BEDC
  29. CODE:004C2B0A                 mov     esi, eax
  30. CODE:004C2B0C                 mov     eax, ds:off_4CFEE8
  31. CODE:004C2B11                 mov     eax, [eax]
  32. CODE:004C2B13                 push    eax
  33. CODE:004C2B14                 mov     ecx, offset aName_1 ; "Name"
  34. CODE:004C2B19                 mov     edx, offset dword_4C2BD8
  35. CODE:004C2B1E                 mov     eax, esi
  36. CODE:004C2B20                 mov     edi, [eax]
  37. CODE:004C2B22                 call    dword ptr [edi+4]
  38. CODE:004C2B25                 mov     eax, ds:off_4CFE4C
  39. CODE:004C2B2A                 mov     eax, [eax]
  40. CODE:004C2B2C                 push    eax
  41. CODE:004C2B2D                 mov     edx, offset dword_4C2BD8
  42. CODE:004C2B32                 mov     ecx, offset dword_4C2BE4
  43. CODE:004C2B37                 mov     eax, esi
  44. CODE:004C2B39                 mov     edi, [eax]
  45. CODE:004C2B3B                 call    dword ptr [edi+4]
  46. CODE:004C2B3E                 mov     eax, esi
  47. CODE:004C2B40                 call    sub_403BE0
  48. CODE:004C2B45                 mov     eax, ds:off_4CFC5C
  49. CODE:004C2B4A                 mov     byte ptr [eax], 1
  50. CODE:004C2B4D                 mov     dword ptr [ebx+24Ch], 1
  51. CODE:004C2B57                 jmp     short loc_4C2B79
  52. CODE:004C2B59 ; ----------------------------------------------
  53. CODE:004C2B59 loc_4C2B59:
  54. ; Сообщение о неправильной регистрации
  55. CODE:004C2B59                 push    0
  56. CODE:004C2B5B                 lea     edx, [ebp+var_14]
  57. CODE:004C2B5E                 mov     eax, offset aInvalidIdOrNam
  58. ; "Invalid ID or Name"...
  59. CODE:004C2B63                 call    sub_4C38D0
  60. CODE:004C2B68                 mov     eax, [ebp+var_14]
  61. CODE:004C2B6B                 mov     cx, word_4C2C20
  62. CODE:004C2B72                 mov     dl, 1
  63. CODE:004C2B74                 call    sub_4376A8
  64. ...
Теперь пройдем функцию проверки регистрации под отладчиком:
  1. ...
  2. CODE:004CBF9A                 xor     ebx, ebx
  3. CODE:004CBF9C                 mov     eax, [ebp+var_4]
  4. ; Первая проверка - длина строки должна быть 10 символов
  5. CODE:004CBF9F                 call    sub_404C50
  6. CODE:004CBFA4                 cmp     eax, 0Ah
  7. CODE:004CBFA7                 jnz     short loc_4CC005
После первой проверки мы знаем длину серийного номера - 10 символов.
  1. ; Вторая проверка - серийный код должен начинаться с "A1910" или "A1423"
  2. CODE:004CBFA9                 mov     edx, [ebp+var_4]
  3. CODE:004CBFAC                 mov     eax, offset aA1910 ; "A1910"
  4. CODE:004CBFB1                 call    sub_404F94
  5. CODE:004CBFB6                 dec     eax
  6. CODE:004CBFB7                 jz      short loc_4CBFC9
  7. CODE:004CBFB9                 mov     edx, [ebp+var_4]
  8. CODE:004CBFBC                 mov     eax, offset aA1423 ; "A1423"
  9. CODE:004CBFC1                 call    sub_404F94
  10. CODE:004CBFC6                 dec     eax
  11. CODE:004CBFC7                 jnz     short loc_4CC005
Следующая проверка - в программе захардкодены две строки, с которых может начинаться правильный серийный номер.
  1. ; Следующая проверка - символы серийного номера, начиная со второго,
  2. ; должны быть цифрами
  3. CODE:004CBFC9                 mov     eax, 2
  4. CODE:004CBFCE loc_4CBFCE:
  5. CODE:004CBFCE                 mov     edx, [ebp+var_4]
  6. CODE:004CBFD1                 mov     dl, [edx+eax-1]
  7. CODE:004CBFD5                 cmp     dl, 30h
  8. CODE:004CBFD8                 jb      short loc_4CC005
  9. CODE:004CBFDA                 cmp     dl, 39h
  10. CODE:004CBFDD                 ja      short loc_4CC005
  11. CODE:004CBFDF                 inc     eax
  12. CODE:004CBFE0                 cmp     eax, 0Bh
  13. CODE:004CBFE3                 jnz     short loc_4CBFCE
На следующем этапе проверяется, чтобы все символы серийника, начиная со второго, были цифрами. Это не совсем логично, ведь после предыдущей проверки как минимум 4 символа уже гарантированно цифры.
  1. CODE:004CBFE5                 mov     eax, [ebp+var_4]
  2. ; Взять предпоследний символ серийника
  3. CODE:004CBFE8                 movzx   eax, byte ptr [eax+8]
  4. CODE:004CBFEC                 mov     edx, [ebp+var_4]
  5. ; Взять последний символ серийника
  6. CODE:004CBFEF                 movzx   edx, byte ptr [edx+9]
  7. ; Сумма ASCII-кодов символов
  8. CODE:004CBFF3                 add     eax, edx
  9. ; Поделить на 10
  10. CODE:004CBFF5                 mov     ecx, 0Ah
  11. CODE:004CBFFA                 xor     edx, edx
  12. CODE:004CBFFC                 div     ecx
  13. ; Остаток от деления должен быть = 4
  14. CODE:004CBFFE                 cmp     edx, 4
  15. CODE:004CC001                 jnz     short loc_4CC005
  16. ...
И в заключительной проверке сумма ASCII-кодов последнего и предпоследнего символов делится на 10, остаток должен быть равен 4. Остальные символы серийника нигде не проверяются и могут быть любыми цифрами, регистрационное имя также нигде не учитывается и не проверяется. Под эту схему, например, подходит серийный номер "A191000044". Попробуем его ввести в окно регистрации, никаких сообщений об ошибке не появляется. В дальнейшем в окне регистрации поле ввода блокируется и сообщается, что программа уже зарегистрирована.

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (11.07.2014 в 09:15):
Осталось переписать его на winapi и добавить музыку.
78195085 (11.07.2014 в 01:44):
Hi All !
Тоже самое, но вес поменьше (кейген `ремикс`)... :) -> http://rghost.ru/56831279

PS : Музыки и пр. нет :(
ManHunter (04.07.2014 в 00:07):
Только кейген получился в два раза больше программы. При таких размерах туда можно не только музыку, но и видео прикрутить.
78195085 (03.07.2014 в 19:28):
Доброго вечерка ManHunter  !
Как дань уважения к классике написал генератор ключей для eXeScope v6.50
Ссылка ;) -> http://rghost.ru/56710218

PS:
Музыку не 'прикрутил', устал однако. Ностальгия нахлынула.
Alex (17.07.2010 в 17:07):
Удивительная программа Дизассемблер. Автору статьи респект.
Sergey_K (13.04.2010 в 00:38):
Спасибо!
alexb (31.01.2010 в 23:51):
Спасибо. Хотя сам удивился, что дотыкался до кнопки Dowload :))
INC. (31.01.2010 в 15:40):
Thanks

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

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

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