Есть ряд программных продуктов, которые выводят модальный диалог с запросом активации поверх основного окна программы, тем самым блокируя работу с приложением. Так ведёт себя, например, всем известный офисный пакет, но речь сейчас не о нем.
Довелось мне столкнуться с одной узкоспециализированной программой:
При извлечении ключа защиты выдает она неприятное окно, мешающее дальнейшей работе.
Пришла в голову идея - а что будет, если данное окно "отвязать" от основного окна программы? Например, так: FindWindow() находим нужный нам диалог, через SetParent() делаем его дочерним какого-нибудь окна (например, специально созданного для этого нашим приложением), а далее через EnableWindow() оживляем окна прежнего "родителя".
Код простой до ужаса:
WM_CHANGEUISTATE помогает перерисовать состояние элементов окна, в частности, клавиатурных акселераторов, которые были скрыты при выводе "нехорошего" диалога. Можно обойтись и без этого.
После того, как окно "утащили" к нам в приложение - программа работает как ни в чем не бывало:
Понятно, что это не полная "отвязка" продукта от ключа - на приложении остался "конверт" и внутри есть ряд проверок. А также 6 кусочков кода расшифровываются WibuKey непосредственно перед исполнением.
С конвертом даже не стал заморачиваться - приложение запускается один раз внутри VMware Workstation с вставленным ключом. Делается снапшот, ключ извлекается и отдается хозяину. А далее данный снапшот восстаналивается, когда нужно заново запустить это приложение уже без ключа. Благо восстановление снапшота занимает буквально несколько секунд, что намного меньше, чем я бы потратил на снятие конверта AxProtector. Да и риск "окирпичить" ключ (а, говорят, это с Wibukey периодически происходит при ковырянии приложения отладчиком) будет нулевым.
Про расшифровку кода - напишу как-нибудь в другой раз.