Blog. Just Blog

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

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

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

Забираем с офсайта дистрибутив последней портативной 32-битной версии, распаковываем архив, смотрим. Главный исполняемый файл ничем не накрыт, отправляем его в дизассемблер.

Ошибка соединения с сервером
Ошибка соединения с сервером

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

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

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

Меняем начало функции
Меняем начало функции

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

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

В заголовке окна никаких посторонних надписей, ссылка на регистрацию пропала, а в окне "О программе" красуется коммерческая лицензия. Цель достигнута.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 500 | Комментариев: 7

Комментарии

Отзывы посетителей сайта о статье
user (28.07.2021 в 00:59):
Жирный он однако какой.
Пользую иногда ReNamer
http://www.den4b.com/
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,
ЦитатаКак в hiew ..... сдвинуть столбцы?

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

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

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

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