Исследование защиты программы FastCopy
Скриншот программы FastCopy
Программа FastCopy предназначена для наиболее быстрого копирования файлов из одного места в другое. Скорость достигается за счет использования асинхронных алгоритмов и особенностей взаимодействия с SSD. Поддерживаются очень длинные пути и имена файлов, а результаты копирования можно проконтролировать путем сверки данных в источнике и цели. И вроде бы даже почти бесплатная, и вроде бы ничем не напрягает и ничего особо не просит, но вот полноценная верификация данных доступна только в профессиональной версии. Которую, как вы могли догадаться, надо покупать за денежку. Или не надо, смотря как к этому вопросу подойти.
Первым делом забираем с офсайта дистрибутив, устанавливаем, смотрим. Главный исполняемый файл ничем не упакован, отправляем его на дизассемблирование. Параллельно смотрим, как себя ведет незарегистрированная версия.
Сообщение незарегистрированной программы
При попытке выбрать полноценный вариант верификации, вываливается вот такое окно с сообщением.
Строка сообщения в ресурсах
В ресурсах строка содержится под индексом 199 или 0C7h, если в шестнадцатеричной системе счисления. Перейдем в дизассемблер и поищем в листинге место, где этот индекс используется совместно с функциями работы с ресурсами и вывода сообщения. Помимо других фрагментов, обнаружится следующий код.
Code (Assembler) : Убрать нумерацию
- .text:00436899 mov ecx, edi
- .text:0043689B call sub_46AC20
- ; Проверить флаг зарегистрированности
- .text:004368A0 cmp dword ptr [edi+152Ch], 1
- .text:004368A7 mov [ebp+var_280], eax
- ; Если он равен 1, то перепрыгнуть
- .text:004368AD jz short loc_4368C8
- .text:004368AF mov ecx, [edi+139Ch]
- .text:004368B5 cmp ecx, 0Ah
- .text:004368B8 jz short loc_436901
- .text:004368BA cmp ecx, 5
- .text:004368BD jnz short loc_4368F7
- .text:004368BF cmp dword ptr [edi+13A0h], 1
- .text:004368C6 jz short loc_436901
- .text:004368C8 loc_4368C8:
- .text:004368C8 push [ebp+var_238]
- .text:004368CE mov ecx, edi
- .text:004368D0 push esi
- .text:004368D1 push ebx
- .text:004368D2 mov ebx, [ebp+arg_0]
- .text:004368D5 push eax
- .text:004368D6 push ebx
- .text:004368D7 call sub_435440
- .text:004368DC mov eax, [edi+13A8h]
- .text:004368E2 and eax, 2000000h
- .text:004368E7 or eax, 0
- .text:004368EA jz loc_436970
- .text:004368F0 mov eax, 1
- .text:004368F5 jmp short loc_436972
- .text:004368F7 ; ---------------------------------------
- .text:004368F7 loc_4368F7:
- .text:004368F7 cmp ecx, 2
- .text:004368FA jz short loc_436901
- .text:004368FC cmp ecx, 3
- .text:004368FF jnz short loc_4368C8
- .text:00436901 loc_436901:
- ; Загрузить строку из ресурсов и вывести сообщение
- .text:00436901 mov ecx, 0C7h ; uID
- .text:00436906 call sub_45D8A0
- .text:0043690B cmp dword ptr [edi+2324h], 0
- .text:00436912 mov esi, eax
- .text:00436914 jz short loc_43693E
- .text:00436916 push esi ; lpBuffer
- .text:00436917 mov ecx, edi
- .text:00436919 call sub_441BA0
Code (Assembler) : Убрать нумерацию
- .text:00432171 add esp, 4
- .text:00432174 mov ecx, edi
- .text:00432176 call sub_4327A0
- .text:0043217B xor ecx, ecx
- ; Проверит флаг зарегистрированности
- .text:0043217D cmp dword ptr [edi+152Ch], 1
- ; Взвести или нет регистр CL по результатам проверки
- .text:00432184 setz cl
- .text:00432187 call sub_45C070
- .text:0043218C mov ecx, edi
- .text:0043218E call sub_4396F0
- ; Инициализация данных программы
- .text:00432193 mov eax, [edi+1A6Ch]
- .text:00432199 mov [edi+22F8h], eax
- .text:0043219F mov eax, [edi+1A70h]
- .text:004321A5 mov [edi+22FCh], eax
- .text:004321AB mov eax, [edi+1A34h]
- .text:004321B1 mov [edi+2304h], eax
- .text:004321B7 mov eax, [edi+1A38h]
- .text:004321BD mov [edi+2308h], eax
- .text:004321C3 mov eax, [edi+1AC0h]
- .text:004321C9 mov edx, [edi+1B18h]
- .text:004321CF mov [edi+230Ch], eax
- .text:004321D5 mov eax, [edi+1A48h]
- .text:004321DB mov [edi+2318h], eax
- .text:004321E1 mov eax, [edi+1A4Ch]
- .text:004321E7 mov [edi+231Ch], eax
Запускаем программу под отладчиком, ставим точку останова по адресу 0043217D. Запускаем программу на выполнение, когда точка останова сработает, узнаем адрес в памяти, который соответствует ячейке с флагом регистрации.
Адрес ячейки памяти
Переключаемся на дамп и ставим точку останова на запись в память по найденному адресу. Отпускаем программу на выполнение и открываем менеджер лицензий. Точка останова сработает на команде rep stosb в следующем участке кода:
Code (Assembler) : Убрать нумерацию
- .text:00488650 mov ecx, [esp+arg_8]
- .text:00488654 movzx eax, [esp+arg_4]
- .text:00488659 mov edx, edi
- .text:0048865B mov edi, [esp+arg_0]
- .text:0048865F test ecx, ecx
- .text:00488661 jz loc_4887A3
- .text:00488667 imul eax, 1010101h
- .text:0048866D cmp ecx, 20h
- .text:00488670 jbe loc_488755
- .text:00488676 cmp ecx, 80h
- .text:0048867C jb loc_48870D
- .text:00488682 bt dword_4DDB24, 1
- .text:0048868A jnb short loc_488695
- ; Забить нулевыми значениями блок памяти
- .text:0048868C rep stosb
- .text:0048868E mov eax, [esp+arg_0]
- .text:00488692 mov edi, edx
- .text:00488694 retn
- .text:00488695 ; ---------------------------------------
- .text:00488695 loc_488695:
- .text:00488695 bt dword_4D9080, 1
- .text:0048869D jnb loc_488755
- .text:004886A3 movd xmm0, eax
- .text:004886A7 pshufd xmm0, xmm0, 0
Программа успешно "зарегистрирована"
Теперь ничего не слетает, в менеджере лицензий отображается фейковая регистрация. А судя по тому, сколько перекрестных ссылок прописано на код сброса регистрации, это было сделано правильно. На этом цель достигнута, все работает, никаких ограничений у программы больше нет.
Просмотров: 431 | Комментариев: 3
Метки: исследование защиты
Комментарии
Отзывы посетителей сайта о статье
pawel97
(26.08.2024 в 21:57):
488650 - это ж memset, современные ida это показывают, да и мудрёность функции и две сотни ссылок как бы намекают, чтоо лучше не трогать. А вот по стеку выше 42c1e0 - уже лучший кандидат для патча, вроде как инитилка лиценс манагера
dodgy
(26.08.2024 в 21:22):
Вроде все сделал по науке. На одной машине везде показывает Pro, но валится в дамп после десятка-двух скопированных файлов. Непатченный exe, норм.
На другой машине, этот же патченный exe сразу слетает Pro на менеджере лицензий. И потом при копировании тоже улетает в дамп. Хм.
На другой машине, этот же патченный exe сразу слетает Pro на менеджере лицензий. И потом при копировании тоже улетает в дамп. Хм.
Добавить комментарий
Заполните форму для добавления комментария
;-----------------------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