Вы наверное слышали про легендарную защиту StarForce. Для многих она ассоциируется со старыми играм на CD-дисках. Но кода-то популярный StarForce часто используется и по сей день. В этой статье посмотрим, как устроена защита StarForce и как ее обходят.
Еще по теме: Отладка программ с помощью WinDbg
В статье речь пойдет о традиционной области деятельности StarForce, а именно о защите ПО от копирования. Эта функция называется StarForce ProActive.
Мы попробуем разобрать особенности, достоинства и недостатки StarForce ProActiv, а в конце я покажу простой способ обхода защиты StarForce ProActiv. Надеюсь, разработчики StarForce примут к сведению данную информацию и смогут пофиксить уязвимость.
Статья в образовательных целях и не призывает к каким-либо незаконным действиям. Ни редакция spy-soft.net, ни автор не несут ответственность за ваши действия.
Обход защиты StarForce
Чтобы разобраться как устроена защита, проанализируем какое‑нибудь приложение, защищенное с помощью StarForce ProActive. В начале убедимся, что мы имеем дело с программой защищенной StarForce, а не каким-то другом протектором. Для этой цели можно воспользоваться бесплатной тулзой Detect It Easy (см. также Как определить тип файла в Linux с помощью Detect It Easy).
Если вы по какой-то причине не смогли скачать актуальную версию Detect It Easy, можно прибегнуть к другими вьюверам EXE PE типа CFF Explorer или hiew. В таком случае признаком присутствия защиты StarForce ProActive в исследуемом файле могут служить специфические секции в хидере запускаемого модуля ( .ps4 или .sforce3 в более старых версиях защиты).
Кроме этого, обычно рядом с защищенной программой находится библиотека с именем из непроизносимого сочетания символов или с более простым наименованием — protect.dll. В любом случае в ней будут находится экспортируемые функции такого вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
PSM_0 PSA_CheckFeaturesGrantedByLicense PSA_DummyFunction PSA_GetFeaturesGrantedByLicense PSA_GetLicenseConfirmationTime PSA_GetLicenseConfirmationTimeLimit PSA_GetLicenseCreationDateTime PSA_GetLicenseExecutionTimeLimit PSA_GetLicenseExpirationDateTime PSA_GetLicenseInformation PSA_GetLicenseLifeTimeLimit PSA_GetLicenseNumberOfRunsLimit PSA_GetLicenseStartDateTime PSA_GetLicenseStoragePath PSA_GetNumberOfConnections PSA_GetRemainingExecutionTime |
Кроме упомянутой библиотеки, разрабы любят добавлять в рабочий каталог программы модулем активации лицензии StarForce (как правило с названием pcnsl.exe). Данный модуль также содержит упомянутые выше экспортные функции и снабжен иконкой с золотым ключиком.
И библиотека, и активатор по непонятным мне причинам упакованы популярным упаковщиком UPX, но не торопитесь радоваться и распаковывать. Потому что распакованная библиотека сразу же перестает быть для приложения родной: как и у других видов защиты, здесь есть функция контроля целостности.
Давайте загрузим защищенную программу в отладчик — например, в любимый всеми x64dbg — и как видим, тут тоже все плохо: Старфорс определил отладчик, о чем и говорит в появившемся окне.
Как правило в таких случаях может помочь специальный плагин к x64dbg — ScillaHide. Но в этот раз он не может разрулить: хоть он и спасает от этого окна, но отладчик с грохотом падает увидев безумный код внутри библиотеки, причем даже не начав распаковку кода приложения. Интересно, что x64dbg смог подключиться к активной задаче (если, разумеется, установить соответствующий флажок в ScillaHide), при этом в памяти процесса можно найти фрагменты расшифрованного кода, однако прервать выполнение нельзя — отладчик выдает «Ошибку приостановки потока».
При попытке поставить точку останова на фрагмент расшифрованного кода или функцию из внешней библиотеки приложение завершается. Дампить активный процесс внешним дампером или «Сциллой» тоже без толку: на выходе все равно получается запакованный и зашифрованный модуль.
Чтобы сильнее усложнить хакерам жизнь, создатели StarForce ProActive приготовили еще одну приятную мелочь: окна сообщений защиты создает не сама защищаемая программа, а модуль активации pcnsl.exe. Который запускается автоматически при старте приложения и все время обменивается с программой информацией. В общем, может показаться, что куда ни кинь — всюду клин, даже у Enigma, о которой мы рассказывали в статье (Взлом программы защищенной протектором Enigma) лазеек было больше.
Но, конечно, даже у самой профессиональной и навороченной защиты имеется свое слабое место (вы, наверное, уже догадались, о чем я говорю, если читали мои предыдущие статьи на аналогичную тему). Я имею в виду триальный режим, в котором пользователю не отдают программу навечно, а позволяют с ней поиграть какое‑то время или определенное количество запусков. Есть такой режим и у StarForce. Сейчас мы попробуем разобраться, как его обойти без всяких отладчиков: с помощью смекалки, магии и парочки простых понятных инструментов.
Как я уже говорил, главная уязвимость этого режима защиты заключается в том, что для его нормальной работы (точнее, наоборот — чтобы программа переставала работать после завершения демонстрации) защита должна оставить какую‑то неудаляемую или хотя бы очень незаметную метку на компьютере пользователя. А мест для хранения подобных меток в Windows не так уж много, по сути всего два — это реестр и файловая система.
Помня о легендарности StarForce и о том, что систему разрабатывали крутые чуваки, вполне можно ждать от нее какого‑нибудь фирменного запрещенного джедайского приема, вроде хранения метки где‑то в служебных секторах диска или в недокументированных ячейках энергонезависимой памяти контроллера. Но если это не так, то все (или почти все), что записывается в файловую систему или реестр, может быть задокументировано и вытащено на белый свет при помощи замечательной программы Process Monitor, которая не раз уж помогала нам в решении подобных задач.
Итак, запускаем ProcMon, ставим фильтр на имя процесса основной программы (а заодно и на модуль pcnsl.exe, с которым у защищенной программы, как мы уже успели понять, довольно тесное взаимодействие). Первое, на что обращаем внимание, — это целый куст реестра, отведенный под приложение с информацией о лицензии.
Как видите, в отличие от Enigma и Obsidium, у StarForce нет специализированных разделов реестра. Легенды гласят, что в старых версиях защиты они существовали и назывались:
1 |
HKCU/SOFTWARE/StarForce |
или, чуть более оригинально
1 |
HKCU/SOFTWARE/SF |
Но в целях конспирации их переместили в папку программы, что ничуть не помешало нам их найти без особого труда.
Удаляем эту ветку, и вроде бы почти получилось — при запуске программа, как и в самый первый раз, выдает окно о начале активации триала. Однако привязка тут двухуровневая: при нажатии кнопки «Активировать» выдается новое окошко, судя по которому программа все‑таки откуда‑то узнала, что триальный период уже закончился.
Пришлось довольно долго попыхтеть, анализируя простыню лога, пока я не обнаружил весьма странное обращение программы к конфигурационному файлу в одной из папок пользователя (мы умышленно не приводим его название и местоположение). С чего бы обычному приложению в него лезть? Подозрительно! Открываем данный файл — и в нем мы видим примерно такие строки:
1 2 |
[{436E44ED-269F-DA68-CA05-3EF38F4E7BBD}] Class={B550918B-6C02-BB96-5111-C81A7F525081} |
GIUD в первой из них точно такой же, как и имя подпапки Keys, найденной нами в реестре. Аккуратно удаляем эти две строки из файла, удаляем ветку реестра и при перезапуске программы получаем свеженький чистый триал без особых хлопот с отладчиком.
Заключение
В общем, мы еще раз убедились в том, что система StarForce вовсе не канула в Лету, а продолжает развивать и совершенствовать собственные технологии. Но, конечно, идеальных методов защиты не существует, и пытливый ум при достаточной усидчивости и мотивации всегда найдет быстрый путь преодолеть преграды любой сложности.
Надеюсь, разработчики подумают о том, как усилить создаваемую ими защиту, а читателям я хочу напомнить, что этот рассказ был написан исключительно в академических целях и нарушать штатную работу коммерческих приложений — незаконно. Берегите себя, и да пребудет с вами сила!
Еще по теме: Обход защиты протектора Obsidium