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

Скриншот программы Advanced Renamer
Программа Advanced Renamer предназначена для пакетного переименования файлов по различным параметрам, например, по данным из EXIF, дате, времени и т.п. И программа-то вроде как бесплатная, и работает без ограничений, но почему-то в заголовке красуется надпись "NOT REGISTERED" и для коммерческого использования требуется купить лицензию. А можно и не покупать.
Забираем с офсайта дистрибутив последней портативной 32-битной версии, распаковываем архив, смотрим. Главный исполняемый файл ничем не накрыт, отправляем его в дизассемблер.

Ошибка соединения с сервером
При попытке зарегистрировать программу какими-нибудь левыми данными, она пытается проверить введенный серийник на своем сервере. Это нехорошо.

Строка в файле
Поиском по строке из заголовка находим ее в файле. Написание слитное, потому что программа мультиязычная, а это индекс строки в языковых файлах. По перекрестной ссылке на строку выходим на следующий код:
Code (Assembler) : Убрать нумерацию
- .text:009D7BDE push offset loc_9D7DA9
- .text:009D7BE3 push dword ptr fs:[eax]
- .text:009D7BE6 mov fs:[eax], esp
- ; Получить статус регистрации
- .text:009D7BE9 mov eax, [ebx+918h]
- .text:009D7BEF call sub_939E84
- .text:009D7BF4 mov eax, [ebx+918h]
- ; Вызвать функцию проверки
- .text:009D7BFA call sub_93AB78
- ; Программа зарегистрирована?
- .text:009D7BFF test al, al
- ; Нет
- .text:009D7C01 jz loc_9D7CEC
- ; Да
- .text:009D7C07 lea eax, [ebp+var_4]
- .text:009D7C0A push eax
- .text:009D7C0B lea edx, [ebp+var_8]
- .text:009D7C0E mov eax, offset aRegisteredto
- ; "RegisteredTo"
- .text:009D7C13 call sub_921C20
- .text:009D7C18 mov eax, [ebp+var_8]
- .text:009D7C1B push eax
- .text:009D7C1C mov eax, [ebx+918h]
- .text:009D7C22 mov eax, [eax+8]
- .text:009D7C25 mov [ebp+var_10], eax
- .text:009D7C28 mov [ebp+var_C], 11h
- .text:009D7C2C lea edx, [ebp+var_10]
- .text:009D7C2F xor ecx, ecx
Code (Assembler) : Убрать нумерацию
- .text:0093AB78 sub_93AB78 proc near
- .text:0093AB78 push ebx
- .text:0093AB79 mov ebx, eax
- ; Второй DWORD в блоке регистрации нулевой?
- .text:0093AB7B cmp dword ptr [ebx+4], 0
- ; Установить AL в зависимости от результата
- .text:0093AB7F setnz al
- .text:0093AB82 pop ebx
- .text:0093AB83 retn
- .text:0093AB83 sub_93AB78 endp
Code (Assembler) : Убрать нумерацию
- ; Указатель на блок регистрации
- .text:009D7C45 mov eax, [ebx+918h]
- ; Байт по смещению 10h в блоке регистрации равен 1?
- .text:009D7C4B cmp byte ptr [eax+10h], 1
- ; Нет, лицензия персональная
- .text:009D7C4F jnz short loc_9D7C97
- ; Коммерческая лицензия
- .text:009D7C51 lea edx, [ebp+var_18]
- .text:009D7C54 mov esi, [ebx+3ECh]
- .text:009D7C5A mov eax, esi
- .text:009D7C5C call sub_586A44
- .text:009D7C61 push [ebp+var_18]
- .text:009D7C64 push offset asc_9D7DEC ; " ("
- .text:009D7C69 lea edx, [ebp+var_1C]
- .text:009D7C6C mov eax, offset aCommercialuse
- ; "CommercialUse"
- .text:009D7C71 call sub_921C20
- .text:009D7C76 push [ebp+var_1C]
- .text:009D7C79 push offset asc_9D7E28 ; ")"
- .text:009D7C7E lea eax, [ebp+var_14]
- .text:009D7C81 mov edx, 4
- .text:009D7C86 call sub_40BCEC
- .text:009D7C8B mov edx, [ebp+var_14]
- .text:009D7C8E mov eax, esi
- .text:009D7C90 call sub_586A98
- .text:009D7C95 jmp short loc_9D7CDB
- .text:009D7C97 ; ---------------------------------------
- .text:009D7C97 loc_9D7C97:
- .text:009D7C97 lea edx, [ebp+var_24]
- .text:009D7C9A mov esi, [ebx+3ECh]
- .text:009D7CA0 mov eax, esi
- .text:009D7CA2 call sub_586A44
- .text:009D7CA7 push [ebp+var_24]
- .text:009D7CAA push offset asc_9D7DEC ; " ("
- .text:009D7CAF lea edx, [ebp+var_28]
- .text:009D7CB2 mov eax, offset aPersonaluse
- ; "PersonalUse"
- .text:009D7CB7 call sub_921C20
- .text:009D7CBC push [ebp+var_28]
- .text:009D7CBF push offset asc_9D7E28 ; ")"
Code (Assembler) : Убрать нумерацию
- .text:00939E84 sub_939E84 proc near
- .text:00939E84 push ebp
- .text:00939E85 mov ebp, esp
- .text:00939E87 mov ecx, 0Ah
- .text:00939E8C loc_939E8C:
- .text:00939E8C push 0
- .text:00939E8E push 0
- .text:00939E90 dec ecx
- .text:00939E91 jnz short loc_939E8C
- .text:00939E93 push ecx
- .text:00939E94 push ebx
- .text:00939E95 push esi
- ; Записать в регистр EBX указатель на блок регистрации
- .text:00939E96 mov ebx, eax
- .text:00939E98 xor eax, eax
- .text:00939E9A push ebp
- .text:00939E9B push offset loc_93A1F6
- .text:00939EA0 push dword ptr fs:[eax]
- .text:00939EA3 mov fs:[eax], esp
- .text:00939EA6 mov eax, ebx
- .text:00939EA8 call sub_93A9EC
- .text:00939EAD mov [ebp+var_29], 0
- .text:00939EB1 call sub_4391F0
- .text:00939EB6 push eax
- .text:00939EB7 lea edx, [ebp+var_34]
- ...
- ...
- .text:0093A184 call sub_40C044
- .text:0093A189 test eax, eax
- .text:0093A18B jle short loc_93A193
- ; Коммерческая лицензия
- .text:0093A18D mov byte ptr [ebx+10h], 1
- .text:0093A191 jmp short loc_93A1AD
- ...
- ...
- .text:0093A1A0 call sub_40C044
- .text:0093A1A5 test eax, eax
- .text:0093A1A7 jle short loc_93A1AD
- ; Персональная лицензия
- .text:0093A1A9 mov byte ptr [ebx+10h], 0
- ...
- ...

Меняем начало функции
Тем самым для всех дальнейших проверок мы устанавливаем тип лицензии "коммерческая". Следующий патч будет для функции проверки наличия регистрации. По адресу 0093AB78 записываем пару команд MOV EAX,1 и RET. Сохраняем изменения, запускаем программу.

Программа успешно "зарегистрирована"
В заголовке окна никаких посторонних надписей, ссылка на регистрацию пропала, а в окне "О программе" красуется коммерческая лицензия. Цель достигнута.
Просмотров: 1361 | Комментариев: 7
Метки: исследование защиты

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

ManHunter
(25.07.2021 в 21:02):
Да точно так же и будет, какая разница. Тем более тут как раз x86

Федя
(25.07.2021 в 20:50):
Стоящий пример !!!,(да все в простом отладчике легко находится )

Luna ©orporation
(25.07.2021 в 20:21):
А для х86 как будет ?!?
Спасибо!
Спасибо!

ManHunter
(25.07.2021 в 19:31):
Строка юникодная, надо в режиме просмотра текста переключиться на юникод F8 -> Unicode OEM/Even и потом искать как обычную строку

Vnv
(25.07.2021 в 19:07):
newfuck,
Ctrl + <--
Ctrl + <--

newfuck
(25.07.2021 в 18:47):
как в hiew найти строку NotRegistered? Не ищёт ни по Ф7, ни по Alt+F6. Пока IDR не заюзал, ничего не нашёл:
http://i.prntscr.com/5xDdZ9T_S...JiTRxZUA.png
Как в hiew уменьшить шрифт либо сдвинуть столбцы?
http://i.prntscr.com/5xDdZ9T_S...JiTRxZUA.png
Как в hiew уменьшить шрифт либо сдвинуть столбцы?

Добавить комментарий
Заполните форму для добавления комментария

Пользую иногда ReNamer
http://www.den4b.com/