Blog. Just Blog

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

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

Программа FastCopy предназначена для наиболее быстрого копирования файлов из одного места в другое. Скорость достигается за счет использования асинхронных алгоритмов и особенностей взаимодействия с SSD. Поддерживаются очень длинные пути и имена файлов, а результаты копирования можно проконтролировать путем сверки данных в источнике и цели. И вроде бы даже почти бесплатная, и вроде бы ничем не напрягает и ничего особо не просит, но вот полноценная верификация данных доступна только в профессиональной версии. Которую, как вы могли догадаться, надо покупать за денежку. Или не надо, смотря как к этому вопросу подойти.

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

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

При попытке выбрать полноценный вариант верификации, вываливается вот такое окно с сообщением.

Строка сообщения в ресурсах
Строка сообщения в ресурсах

В ресурсах строка содержится под индексом 199 или 0C7h, если в шестнадцатеричной системе счисления. Перейдем в дизассемблер и поищем в листинге место, где этот индекс используется совместно с функциями работы с ресурсами и вывода сообщения. Помимо других фрагментов, обнаружится следующий код.
  1. .text:00436899                 mov     ecx, edi
  2. .text:0043689B                 call    sub_46AC20
  3. ; Проверить флаг зарегистрированности
  4. .text:004368A0                 cmp     dword ptr [edi+152Ch], 1
  5. .text:004368A7                 mov     [ebp+var_280], eax
  6. ; Если он равен 1, то перепрыгнуть
  7. .text:004368AD                 jz      short loc_4368C8
  8. .text:004368AF                 mov     ecx, [edi+139Ch]
  9. .text:004368B5                 cmp     ecx, 0Ah
  10. .text:004368B8                 jz      short loc_436901
  11. .text:004368BA                 cmp     ecx, 5
  12. .text:004368BD                 jnz     short loc_4368F7
  13. .text:004368BF                 cmp     dword ptr [edi+13A0h], 1
  14. .text:004368C6                 jz      short loc_436901
  15. .text:004368C8 loc_4368C8:
  16. .text:004368C8                 push    [ebp+var_238]
  17. .text:004368CE                 mov     ecx, edi
  18. .text:004368D0                 push    esi
  19. .text:004368D1                 push    ebx
  20. .text:004368D2                 mov     ebx, [ebp+arg_0]
  21. .text:004368D5                 push    eax
  22. .text:004368D6                 push    ebx
  23. .text:004368D7                 call    sub_435440
  24. .text:004368DC                 mov     eax, [edi+13A8h]
  25. .text:004368E2                 and     eax, 2000000h
  26. .text:004368E7                 or      eax, 0
  27. .text:004368EA                 jz      loc_436970
  28. .text:004368F0                 mov     eax, 1
  29. .text:004368F5                 jmp     short loc_436972
  30. .text:004368F7 ; ---------------------------------------
  31. .text:004368F7 loc_4368F7:
  32. .text:004368F7                 cmp     ecx, 2
  33. .text:004368FA                 jz      short loc_436901
  34. .text:004368FC                 cmp     ecx, 3
  35. .text:004368FF                 jnz     short loc_4368C8
  36. .text:00436901 loc_436901:
  37. ; Загрузить строку из ресурсов и вывести сообщение
  38. .text:00436901                 mov     ecx, 0C7h       ; uID
  39. .text:00436906                 call    sub_45D8A0
  40. .text:0043690B                 cmp     dword ptr [edi+2324h], 0
  41. .text:00436912                 mov     esi, eax
  42. .text:00436914                 jz      short loc_43693E
  43. .text:00436916                 push    esi             ; lpBuffer
  44. .text:00436917                 mov     ecx, edi
  45. .text:00436919                 call    sub_441BA0
Тут проверяется флаг, записанный в ячейку памяти, в правильном варианте он должен быть равен 1. Теперь надо найти место в коде, где этот флаг инициализируется. Для этого надо поискать строку "+152Ch]", которая определяет адрес этой переменной относительно какого-то буфера в памяти. Тут нас ждет неприятный сюрприз. Конкретно с этим адресом связаны только проверки его содержимого, ни одной команды записи в эту ячейку памяти найти не удалось. Зато обнаружится вот такой интересный код:
  1. .text:00432171                 add     esp, 4
  2. .text:00432174                 mov     ecx, edi
  3. .text:00432176                 call    sub_4327A0
  4. .text:0043217B                 xor     ecx, ecx
  5. ; Проверит флаг зарегистрированности
  6. .text:0043217D                 cmp     dword ptr [edi+152Ch], 1
  7. ; Взвести или нет регистр CL по результатам проверки
  8. .text:00432184                 setz    cl
  9. .text:00432187                 call    sub_45C070
  10. .text:0043218C                 mov     ecx, edi
  11. .text:0043218E                 call    sub_4396F0
  12. ; Инициализация данных программы
  13. .text:00432193                 mov     eax, [edi+1A6Ch]
  14. .text:00432199                 mov     [edi+22F8h], eax
  15. .text:0043219F                 mov     eax, [edi+1A70h]
  16. .text:004321A5                 mov     [edi+22FCh], eax
  17. .text:004321AB                 mov     eax, [edi+1A34h]
  18. .text:004321B1                 mov     [edi+2304h], eax
  19. .text:004321B7                 mov     eax, [edi+1A38h]
  20. .text:004321BD                 mov     [edi+2308h], eax
  21. .text:004321C3                 mov     eax, [edi+1AC0h]
  22. .text:004321C9                 mov     edx, [edi+1B18h]
  23. .text:004321CF                 mov     [edi+230Ch], eax
  24. .text:004321D5                 mov     eax, [edi+1A48h]
  25. .text:004321DB                 mov     [edi+2318h], eax
  26. .text:004321E1                 mov     eax, [edi+1A4Ch]
  27. .text:004321E7                 mov     [edi+231Ch], eax
По характерной последовательности команд записи в разные ячейки памяти можно с большой долей уверенности сказать, что тут выполняется инициализация программы после запуска. Об этом же говорит находящаяся выше по коду строка "Can't initialize...", работа с параметрами командной строки и подобные очень примечательные штуки. Меняем команду cmp dword ptr [edi+152Ch], 1 на команду mov byte ptr [edi+152Ch], 1 равную ей по длине, а следующую команду setz cl на mov cl, 1 при необходимости забив NOP'ом остаток. Я использую фразу "при необходимости", потому что команда mov cl,1 может иметь как двухбайтный, так и трехбайтный вариант написания. Сохраняем изменения, запускаем, смотрим. В заголовке окна появился довесок "Pro", выбор варианта полной проверки не вызывает никаких сообщений, в окне "О программе" тоже упоминается профессиональная версия. Но при попытке открыть менеджер лицензий наша фейковая регистрация мгновенно слетает.

Запускаем программу под отладчиком, ставим точку останова по адресу 0043217D. Запускаем программу на выполнение, когда точка останова сработает, узнаем адрес в памяти, который соответствует ячейке с флагом регистрации.

Адрес ячейки памяти
Адрес ячейки памяти

Переключаемся на дамп и ставим точку останова на запись в память по найденному адресу. Отпускаем программу на выполнение и открываем менеджер лицензий. Точка останова сработает на команде rep stosb в следующем участке кода:
  1. .text:00488650                 mov     ecx, [esp+arg_8]
  2. .text:00488654                 movzx   eax, [esp+arg_4]
  3. .text:00488659                 mov     edx, edi
  4. .text:0048865B                 mov     edi, [esp+arg_0]
  5. .text:0048865F                 test    ecx, ecx
  6. .text:00488661                 jz      loc_4887A3
  7. .text:00488667                 imul    eax, 1010101h
  8. .text:0048866D                 cmp     ecx, 20h
  9. .text:00488670                 jbe     loc_488755
  10. .text:00488676                 cmp     ecx, 80h
  11. .text:0048867C                 jb      loc_48870D
  12. .text:00488682                 bt      dword_4DDB24, 1
  13. .text:0048868A                 jnb     short loc_488695
  14. ; Забить нулевыми значениями блок памяти
  15. .text:0048868C                 rep stosb
  16. .text:0048868E                 mov     eax, [esp+arg_0]
  17. .text:00488692                 mov     edi, edx
  18. .text:00488694                 retn
  19. .text:00488695 ; ---------------------------------------
  20. .text:00488695 loc_488695:
  21. .text:00488695                 bt      dword_4D9080, 1
  22. .text:0048869D                 jnb     loc_488755
  23. .text:004886A3                 movd    xmm0, eax
  24. .text:004886A7                 pshufd  xmm0, xmm0, 0
При каких-то условиях блок памяти, в котором записана наша фейковая регистрация, забивается нулевыми байтами. Чтобы этого избежать надо заNOPить команду rep stosb. Сохраняем изменения, запускаем, проверяем.

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

Теперь ничего не слетает, в менеджере лицензий отображается фейковая регистрация. А судя по тому, сколько перекрестных ссылок прописано на код сброса регистрации, это было сделано правильно. На этом цель достигнута, все работает, никаких ограничений у программы больше нет.

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

Комментарии

Отзывы посетителей сайта о статье
user (31.08.2024 в 14:21):
Вот так нормально -

;-----------------------FastCopy.CRK
FastCopy 5.7.15

Set registered
FastCopy.exe
.0043217D: 83 C6 ;0003157D:
.0043217E: BF 87 ;0003157E:
.00432184: 0F 31 ;00031584:
.00432185: 94 C9 ;00031585:
.00432186: C1 41 ;00031586:
.0042C237: 15 59 ;0002B637:
;-----------------------FastCopy.CRK END
pawel97 (26.08.2024 в 21:57):
488650 - это ж memset, современные ida это показывают, да и мудрёность функции и две сотни ссылок как бы намекают, чтоо лучше не трогать. А вот по стеку выше 42c1e0 - уже лучший кандидат для патча, вроде как инитилка лиценс манагера
dodgy (26.08.2024 в 21:22):
Вроде все сделал по науке. На одной машине везде показывает Pro, но валится в дамп после десятка-двух скопированных файлов. Непатченный exe, норм.

На другой машине, этот же патченный exe сразу слетает Pro на менеджере лицензий. И потом при копировании тоже улетает в дамп. Хм.

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

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

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