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

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

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

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

Строки в файле
Изучаем листинг, чтобы понять логику работы. Нас интересуют проверка серийного номера, условный переход при успешной валидации и ветка кода с сообщением об ошибке. Также можно обнаружить имя файла, в котором хранится правильный серийный номер.
Code (Assembler) : Убрать нумерацию
- .text:0040C895 call @System@Variant@$bdtr$qqrv
- .text:0040C89A mov ecx, dword_8A9710
- .text:0040C8A0 push ecx
- .text:0040C8A1 push offset unk_8A9708
- .text:0040C8A6 call sub_413808
- .text:0040C8AB add esp, 8
- ; Проверить серийный номер
- .text:0040C8AE cmp byte_8A9AB1, 0
- ; Нет, ошибка
- .text:0040C8B5 jz loc_40C95E
- ; Да, серийник правильный
- .text:0040C8BB mov [ebp+var_28], 18h
- .text:0040C8C1 mov edx, offset unk_8925DB
- .text:0040C8C6 lea eax, [ebp+var_8]
- .text:0040C8C9 call sub_88B434
- .text:0040C8CE inc [ebp+var_1C]
- .text:0040C8D1 mov eax, [eax]
- .text:0040C8D3 call @Dialogs@ShowMessage
- .text:0040C8D8 dec [ebp+var_1C]
- .text:0040C8DB lea eax, [ebp+var_8] ; block
- .text:0040C8DE mov edx, 2
- .text:0040C8E3 call @System@Variant@$bdtr$qqrv
- .text:0040C8E8 mov ecx, dword_8A9710
- .text:0040C8EE push ecx ; char
- .text:0040C8EF mov [ebp+var_28], 24h
- .text:0040C8F5 lea eax, [ebp+var_10]
- .text:0040C8F8 call unknown_libname_377
- .text:0040C8FD push eax
- .text:0040C8FE inc [ebp+var_1C]
- ; Сохранить серийник
- .text:0040C901 mov edx, offset aSerial_number
- ; "\\serial_number.dat"
- .text:0040C906 lea eax, [ebp+var_C]
- .text:0040C909 call sub_88B434
- .text:0040C90E inc [ebp+var_1C]
- .text:0040C911 lea edx, [ebp+var_C]
- .text:0040C914 mov eax, offset dword_8A96F4
- .text:0040C919 pop ecx
- .text:0040C91A call sub_88B5A8
- .text:0040C91F lea edx, [ebp+var_10]
- .text:0040C922 mov eax, [edx]
- .text:0040C924 push eax ; block
- .text:0040C925 push offset unk_8A9708 ; int
- .text:0040C92A call sub_414BE4
- .text:0040C92F add esp, 0Ch
- .text:0040C932 dec [ebp+var_1C]
- .text:0040C935 lea eax, [ebp+var_10] ; block
- .text:0040C938 mov edx, 2
- .text:0040C93D call @System@Variant@$bdtr$qqrv
- .text:0040C942 dec [ebp+var_1C]
- .text:0040C945 lea eax, [ebp+var_C] ; block
- .text:0040C948 mov edx, 2
- .text:0040C94D call @System@Variant@$bdtr$qqrv
- .text:0040C952 mov eax, _EnterSerial
- .text:0040C957 call sub_668434
- .text:0040C95C jmp short loc_40C98B
- .text:0040C95E ; ---------------------------------------------
- .text:0040C95E loc_40C95E:
- .text:0040C95E mov [ebp+var_28], 30h
- ; Строка "Неверный серийный номер!"
- .text:0040C964 mov edx, offset unk_892605
- .text:0040C969 lea eax, [ebp+var_14]
- .text:0040C96C call sub_88B434
- .text:0040C971 inc [ebp+var_1C]
- .text:0040C974 mov eax, [eax]
- .text:0040C976 call @Dialogs@ShowMessage
- .text:0040C97B dec [ebp+var_1C]

Перекрестные ссылки на ячейку памяти
Теоретически можно пропатчить все пять проверок, изначально я планировал сделать именно так. Однако возникло предположение, что существуют дополнительные скрытые проверки, не отображенные в дизассемблере явно. Поэтому я поднялся выше по коду от точки проверки и обнаружил, что по адресу 0040C8A6 вызывается интересная подпрограмма sub_413808.
Code (Assembler) : Убрать нумерацию
- .text:00413B8C inc ebx
- .text:00413B8D cmp ebx, 5
- .text:00413B90 jl loc_413B09
- .text:00413B96 mov edx, [ebp+var_68]
- .text:00413B99 mov esi, [edx]
- .text:00413B9B cmp esi, [ebp+var_5C]
- .text:00413B9E jz short loc_413BDA
- .text:00413BA0 mov eax, [ebp+arg_0]
- .text:00413BA3 mov edx, 2
- ; Ошибка, "0"
- .text:00413BA8 mov byte ptr [eax+3A9h], 0
- .text:00413BAF xor eax, eax
- .text:00413BB1 push eax
- .text:00413BB2 lea eax, [ebp+var_4] ; block
- .text:00413BB5 dec [ebp+var_3C]
- .text:00413BB8 call @System@Variant@$bdtr$qqrv
- .text:00413BBD dec [ebp+var_3C]
- .text:00413BC0 lea eax, [ebp+arg_4] ; block
- .text:00413BC3 mov edx, 2
- .text:00413BC8 call @System@Variant@$bdtr$qqrv
- .text:00413BCD pop eax
- .text:00413BCE mov edx, [ebp+var_58]
- .text:00413BD1 mov large fs:0, edx
- .text:00413BD8 jmp short loc_413C20
- .text:00413BDA ; ----------------------------------------------
- .text:00413BDA loc_413BDA:
- .text:00413BDA inc edi
- .text:00413BDB add [ebp+var_68], 4
- .text:00413BDF cmp edi, 5
- .text:00413BE2 jl loc_413B02
- .text:00413BE8 mov ecx, [ebp+arg_0]
- .text:00413BEB mov al, 1
- .text:00413BED mov edx, 2
- ; Успешно, "1"
- .text:00413BF2 mov byte ptr [ecx+3A9h], 1
- .text:00413BF9 push eax
- .text:00413BFA lea eax, [ebp+var_4] ; block
- .text:00413BFD dec [ebp+var_3C]
- .text:00413C00 call @System@Variant@$bdtr$qqrv
- .text:00413C05 dec [ebp+var_3C]
- .text:00413C08 lea eax, [ebp+arg_4] ; block
- .text:00413C0B mov edx, 2
- .text:00413C10 call @System@Variant@$bdtr$qqrv
- .text:00413C15 pop eax
- .text:00413C16 mov edx, [ebp+var_58]
- .text:00413C19 mov large fs:0, edx

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


