Blog. Just Blog

Исследование программы "Экстрактор текста"

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

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

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

Сообщение незарегистрированной версии
Сообщение незарегистрированной версии

При первом старте приложение сразу напоминает о лицензировании: появляется окно с предложением ввести серийный номер или приобрести его.

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

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

Строки в файле
Строки в файле

Изучаем листинг, чтобы понять логику работы. Нас интересуют проверка серийного номера, условный переход при успешной валидации и ветка кода с сообщением об ошибке. Также можно обнаружить имя файла, в котором хранится правильный серийный номер.
  1. .text:0040C895                 call    @System@Variant@$bdtr$qqrv
  2. .text:0040C89A                 mov     ecx, dword_8A9710
  3. .text:0040C8A0                 push    ecx
  4. .text:0040C8A1                 push    offset unk_8A9708
  5. .text:0040C8A6                 call    sub_413808
  6. .text:0040C8AB                 add     esp, 8
  7. ; Проверить серийный номер
  8. .text:0040C8AE                 cmp     byte_8A9AB1, 0
  9. ; Нет, ошибка
  10. .text:0040C8B5                 jz      loc_40C95E
  11. ; Да, серийник правильный
  12. .text:0040C8BB                 mov     [ebp+var_28], 18h
  13. .text:0040C8C1                 mov     edx, offset unk_8925DB
  14. .text:0040C8C6                 lea     eax, [ebp+var_8]
  15. .text:0040C8C9                 call    sub_88B434
  16. .text:0040C8CE                 inc     [ebp+var_1C]
  17. .text:0040C8D1                 mov     eax, [eax]
  18. .text:0040C8D3                 call    @Dialogs@ShowMessage
  19. .text:0040C8D8                 dec     [ebp+var_1C]
  20. .text:0040C8DB                 lea     eax, [ebp+var_8] ; block
  21. .text:0040C8DE                 mov     edx, 2
  22. .text:0040C8E3                 call    @System@Variant@$bdtr$qqrv
  23. .text:0040C8E8                 mov     ecx, dword_8A9710
  24. .text:0040C8EE                 push    ecx             ; char
  25. .text:0040C8EF                 mov     [ebp+var_28], 24h
  26. .text:0040C8F5                 lea     eax, [ebp+var_10]
  27. .text:0040C8F8                 call    unknown_libname_377
  28. .text:0040C8FD                 push    eax
  29. .text:0040C8FE                 inc     [ebp+var_1C]
  30. ; Сохранить серийник
  31. .text:0040C901                 mov     edx, offset aSerial_number
  32. ; "\\serial_number.dat"
  33. .text:0040C906                 lea     eax, [ebp+var_C]
  34. .text:0040C909                 call    sub_88B434
  35. .text:0040C90E                 inc     [ebp+var_1C]
  36. .text:0040C911                 lea     edx, [ebp+var_C]
  37. .text:0040C914                 mov     eax, offset dword_8A96F4
  38. .text:0040C919                 pop     ecx
  39. .text:0040C91A                 call    sub_88B5A8
  40. .text:0040C91F                 lea     edx, [ebp+var_10]
  41. .text:0040C922                 mov     eax, [edx]
  42. .text:0040C924                 push    eax             ; block
  43. .text:0040C925                 push    offset unk_8A9708 ; int
  44. .text:0040C92A                 call    sub_414BE4
  45. .text:0040C92F                 add     esp, 0Ch
  46. .text:0040C932                 dec     [ebp+var_1C]
  47. .text:0040C935                 lea     eax, [ebp+var_10] ; block
  48. .text:0040C938                 mov     edx, 2
  49. .text:0040C93D                 call    @System@Variant@$bdtr$qqrv
  50. .text:0040C942                 dec     [ebp+var_1C]
  51. .text:0040C945                 lea     eax, [ebp+var_C] ; block
  52. .text:0040C948                 mov     edx, 2
  53. .text:0040C94D                 call    @System@Variant@$bdtr$qqrv
  54. .text:0040C952                 mov     eax, _EnterSerial
  55. .text:0040C957                 call    sub_668434
  56. .text:0040C95C                 jmp     short loc_40C98B
  57. .text:0040C95E ; ---------------------------------------------
  58. .text:0040C95E loc_40C95E:
  59. .text:0040C95E                 mov     [ebp+var_28], 30h
  60. ; Строка "Неверный серийный номер!"
  61. .text:0040C964                 mov     edx, offset unk_892605
  62. .text:0040C969                 lea     eax, [ebp+var_14]
  63. .text:0040C96C                 call    sub_88B434
  64. .text:0040C971                 inc     [ebp+var_1C]
  65. .text:0040C974                 mov     eax, [eax]
  66. .text:0040C976                 call    @Dialogs@ShowMessage
  67. .text:0040C97B                 dec     [ebp+var_1C]
Теперь посмотрим в дизассемблере перекрестные ссылки на ячейку byte_8A9AB1. Тут что-то странное: вижу только строки сравнения, и ничего не инициализируется нужным значением.

Перекрестные ссылки на ячейку памяти
Перекрестные ссылки на ячейку памяти

Теоретически можно пропатчить все пять проверок, изначально я планировал сделать именно так. Однако возникло предположение, что существуют дополнительные скрытые проверки, не отображенные в дизассемблере явно. Поэтому я поднялся выше по коду от точки проверки и обнаружил, что по адресу 0040C8A6 вызывается интересная подпрограмма sub_413808.
  1. .text:00413B8C                 inc     ebx
  2. .text:00413B8D                 cmp     ebx, 5
  3. .text:00413B90                 jl      loc_413B09
  4. .text:00413B96                 mov     edx, [ebp+var_68]
  5. .text:00413B99                 mov     esi, [edx]
  6. .text:00413B9B                 cmp     esi, [ebp+var_5C]
  7. .text:00413B9E                 jz      short loc_413BDA
  8. .text:00413BA0                 mov     eax, [ebp+arg_0]
  9. .text:00413BA3                 mov     edx, 2
  10. ; Ошибка, "0"
  11. .text:00413BA8                 mov     byte ptr [eax+3A9h], 0
  12. .text:00413BAF                 xor     eax, eax
  13. .text:00413BB1                 push    eax
  14. .text:00413BB2                 lea     eax, [ebp+var_4] ; block
  15. .text:00413BB5                 dec     [ebp+var_3C]
  16. .text:00413BB8                 call    @System@Variant@$bdtr$qqrv
  17. .text:00413BBD                 dec     [ebp+var_3C]
  18. .text:00413BC0                 lea     eax, [ebp+arg_4] ; block
  19. .text:00413BC3                 mov     edx, 2
  20. .text:00413BC8                 call    @System@Variant@$bdtr$qqrv
  21. .text:00413BCD                 pop     eax
  22. .text:00413BCE                 mov     edx, [ebp+var_58]
  23. .text:00413BD1                 mov     large fs:0, edx
  24. .text:00413BD8                 jmp     short loc_413C20
  25. .text:00413BDA ; ----------------------------------------------
  26. .text:00413BDA loc_413BDA:
  27. .text:00413BDA                 inc     edi
  28. .text:00413BDB                 add     [ebp+var_68], 4
  29. .text:00413BDF                 cmp     edi, 5
  30. .text:00413BE2                 jl      loc_413B02
  31. .text:00413BE8                 mov     ecx, [ebp+arg_0]
  32. .text:00413BEB                 mov     al, 1
  33. .text:00413BED                 mov     edx, 2
  34. ; Успешно, "1"
  35. .text:00413BF2                 mov     byte ptr [ecx+3A9h], 1
  36. .text:00413BF9                 push    eax
  37. .text:00413BFA                 lea     eax, [ebp+var_4] ; block
  38. .text:00413BFD                 dec     [ebp+var_3C]
  39. .text:00413C00                 call    @System@Variant@$bdtr$qqrv
  40. .text:00413C05                 dec     [ebp+var_3C]
  41. .text:00413C08                 lea     eax, [ebp+arg_4] ; block
  42. .text:00413C0B                 mov     edx, 2
  43. .text:00413C10                 call    @System@Variant@$bdtr$qqrv
  44. .text:00413C15                 pop     eax
  45. .text:00413C16                 mov     edx, [ebp+var_58]
  46. .text:00413C19                 mov     large fs:0, edx
Анализ показал, что эта функция вызывается всего в двух местах. Судя по логике работы, один вызов отвечает за глобальную проверку при запуске программы, а второй - за валидацию при вводе серийного номера. В конечном счете, если отбросить лишнюю логику, функция возвращает лишь два значения: "0" или "1". Заменяем по адресу 00413BA8 команду mov byte ptr [eax+3A9h],0 на mov byte ptr [eax+3A9h],1 и сохраняем изменения. Запускаем и проверяем результат.

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

Обрабатываются все файлы без ограничений, никаких сообщений о покупке не появляется. Цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
kaktustv (13.03.2026 в 12:26):
Ну, там можно подсмотреть адресок сообщения о неверном серийном номере.
ManHunter (13.03.2026 в 03:07):
Только как hex-просмотр, по привычке.
Ja99er (12.03.2026 в 09:54):
Благодарим за интересный разбор Маэстро. Скажите пожалуйста, для чего мы (Вы) смотрели в Hiew строчку Неверный серийный номер ? Какую роль отыграл Hiew ?
А так всё очень доходчиво и понятно.
Спасибо !

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

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

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