Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Защита ресурсов программы

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Есть некоторая проблема с защитой embedded ресурсов программы.

Ситуация такова:

1. Есть программа на C#, распространяемая в виде exe

2. Есть зашифрованный файл в виде ресурса

3. Есть встроенный ключ расшифровки (программа должна работать без подключения к сети Интернет).

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

Понятно что воспрепятствовать возможности получить этот файл, в указанных выше условиях, нельзя, но нужно отсечь мамкиных хакеров.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Все новое хорошо забытое старое. Блочный шифр например AES шифрует весь файл ресурса, ключь блочного шифра лежит как другой ресурс зашифрованный уже асимметричным шифром например RSA или эллиптическими кривыми. Файл «лицензии» — обычно обыкновенный X509 сертификат. В каждой копии программы ресурс защищен своим собственным ключем, система сборки которая готовит релизный продажный билд, делает сборку под каждого клиента отдельно. Как правило линкует скомпилированные объектные файлы и зашифрованные ресурсы, сборка из исходников это дорого но если модули вынесены в DLL и лежат отдельно то можно и исходный самого приложения компилировать. Недостатки — если есть тиральная версия, можно снять дамп памяти вместе с ресурсом в нее загруженным, затем перепаковать бинарник с подмененным уже расшифрованным ресурсом и убранным механизмом расшифровки. Есть специальные анти-дебагер и антидамповые механизмы. Все подробности в трудах Мыщьха, он же Крисс Касперски.

Обновление: Как я недавно ломал .Net приложение.
Может быть будет интересно.
Обратился ко мне знакомый, с прибором стоимостью более 8000$ долларов, от одной известной фирмы, производителя оптики.
Суть обращения: новый софт не хочет работать с его старым прибором.
Софт, написан на .Net защищен обфускатором и еще какой-то неведомой хренью (скорее всего Agile NET) так что dnSpy у некоторых методов тела не показывает, а на некоторых валится с исключениями.
Что пробовал описывать не буду. Но в конце концов все свелось к двум утилитам: ExtremeDumper и к тому же dnSpy.
Первая позволила снять дамп с рабочего процесса и получить уже вполне себе нормально читаемый код (в dnSpy) хотя все еще обфусцированный.
Попытка подложить полученные сборки после дампа в директорию с exe-чиной ничего не дали — приложение не запускалось.
Но, опять-таки помог dnSpy, пере сохранения сборок с некоторыми флагами, позволило привести их в рабочее состояние.
А дальше все просто. Так как код теперь стал читаем то в том же dnSpy, после изучения кода понадобилось пропатчить всего в 3-х местах (прямо в IL коде), что бы приложение уже не ругалось на то что железяка старая. И все вполне стало работать как нужно.
Так что ИМХО опять таки, только встроенная самописная виртуальная машина (при грамотном подходе навешивания зависимостей работы приложения на нее) + встроенный байт-код (для виртуальной машины), создало бы больше проблем со взломом.

Я правильно понял, что изначально приложении из себя представляло экзешник с несколькими подключаемыми к ней DLL? В таком случае обычно для обфускаторов невозможно обфусцировать все public члены таких DLL, что существенно упрощает деобфусцирование (я использовал github.com/de4dot/de4dot). Поэтому перед обфускацией нужно по возможности мержить библиотеки и exe в одну сборку. Если сборку не получается смержить ее можно зашифровать как ресурс — но этот подход хуже потому что в рантайме можно будет поймать момент когда она расшифровывается и загружается в память. Еще куча техник есть Pruning, шифрование всех строк, всех ресурсов. Оно все работает в комплексе.

Я пробовал de4dot, он не смог и ругался на неизвестный ему обфускатор.

Виртуальная машина.
При чем своя, самописная, хитровыдуманной системой команд. Компилятор к ней, с какого нибудь С-подобного языка в ее байткод. Можно сделать хоть с C#, через NRefactory, хоть к clang с IR дописать бекенд. Весь критический код, проверки лицензии, пишется на этом языке и компилирутся в байткод VM.
Код вместе с машиной встраивается в приложение/библиотеку.
Взломать можно все, но тут придется продебажить VM, разобраться с ее системой команд, написать дизассемблер, разобраться как работает дизассемблированый код проверки ключа.
Много работы, короче.

Предложили самый простой способ, разделить файл на два:
— 1 файл сгенерированный случайный массив длинной в размер файла
— 2 файл поксоренный на него оригинальный файл.

Эти два ключа пишутся утилитой в один класс с указанными в утилите именем. Тоесть автоматически найти ключ для расшифровки файла нельзя, нужно руками дебажить код, в общем случае обфусцированный.

Способ прост и элегантен, как предложение отпилить ножки у кровати, чтобы избавится от боязни подкроватного монстра, вместо дорогостоящего лечения у психоаналитика.

Делай программу с индивидуальными ключами. Файл для скачивания недоступен, ты отдаёшь только покупателю по временной ссылке. То есть даже если и сопрут — то будешь знать кто. Обычный человеческий фактор, но этот фактор реально тормозит сливание софта в сеть от 5 лет до бесконечности (зависит от цены софта).

Ключ расшифровки делай временным. То есть иногда его всё же программа должна обновлять. В идеале, если ты и программу продаёшь на время, например на 2 года, а далее автоматически продлеваешь версию на тот же срок за 10% от стоимости.

В программе делай неявные закладки, которые раз в очень долгий срок обращаются к вроде бы несущественным файлам. Это чтобы мамкины хакеры просто не имели достаточно времени на исследования проги. Важно, чтобы момент обнаружение проблем и момент когда прога начнёт сбоить — были разнесены во времени.

Данные желательно перешифровывать всякий раз при расшифровке. Да, прога не должна зависеть от интернета. Но если интернет таки нащупала, то успевает натворить дел.

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

Самый неочевидный момент: веди форум. Добавь в прогу проблему, которая обсуждается на форуме. Проблема должна возникать в пиратских версиях. А на форуме надо зарегиться, чтобы скачать решение (которе не факт, что будет работать), и лучше если через соц.сети. Так ты будешь иметь прямой контакт со своими клиентами, и многих убедишь что купить дешевле и вообще без проблем.

Если же контента много, в частности, если это аудио-видео, то никак. Потому что за дело возьмутся далеко не мамкины хакеры. Они тупо возьмут хакнутые операционки и будут таскать у тебя контент прямо с потоков данных.

Если же файл достаточно стабилен, например картографические данные, то просто спойли данные в кеше случайным фактором. Например, длиннющие ссылки с краказябликами, якобы на скачку, запоротые данные, которые потом втихаря меняются на расшифрованные. Ну и моя любимая фенечка теста машины Тюринга — несколько попыток. Мамкины хакеры никогда не делают несколько попыток ввести одни и те же самые данные если что-то не работает. А люди всегда так делают, если что-то не получилось, они пробуют снова. Добавь этих мелочей в программу, и то что для человека будет мелким багом, для мамкиного хакера — сигналом о неудачной попытке, и он тупо пропустит точки входа. А человек просто лишний раз ткнёт кнопку «обновить». Если же это будет делать хакер... ты просто посчитаешь попытки за время.

Ну и ещё одна мелочь: следи за временем. Спонтанная смена дат — слишком очевидная попытка взлома. Если даты при этом не падают в очень давний момент в прошлом (слёт даты на компьютере или устройстве), и не восстанавливаются после (притом независимо от попыток получить ресурс) — значит не стоит пока ничего предпринимать, но если признаки явные, если дата идёт в подделку ровно в сроки ограничения лицензии — просто УНИЧТОЖЬ ценный ресурс программы. Даже если ты ошибся, человек просто переустановит прогу. О чём конечно же напишешь в лог, а инсталлятор этот лог прочитает целиком, и если количество попыток зашкаливает — просто насрёт в файл с ценными данными, не выдав никаких ошибок, но написав понятную только тебе фразу в лог (что поможет тебе в саппорте). Грубо говоря, если клиент прогу у тебя купил, но пытается взломать, с целью надоить больше копий — ты сможешь популярно ему разъяснить, что делать так не нужно.

Сделай так, чтобы прога могла общаться меж собой в локальных сетях. Так ты будешь знать о количестве копий в организации. Легализуй это как функцию чата, пусть и бесполезную для работы. Проще всего — штук 20 наугад выбранных UDP портов и поиск общих ресурсов на стандартных портах. Кроме того, инсталлятор может делать некий общий сетевой ресурс, вроде виртуального принтера и прочую чушь, просто для того чтобы прога, пошарившись по сети, видела все остальные свои экземпляры, и могла получить инфу о них прямо таки из данных устройства, даже когда сама прога не активна, а само устройство меняло свой статус в зависимости от активности проги в данный момент (и даже в зависимости от количества активностей).

Если кратко, ты сам должен быть немножко взломщиком. Но ломать должен человеческий фактор, убеждая что время-деньги на взлом того не стоят. Только это всё не сработает, если проект таки отдадут в руки профессионалу, и дадут ему правильных денег. Вот только не дадут. Жаба обычно давит. Особенно если результат будет не гарантированный, а попытка быстрого взлома даст рабочую не до конца программу, которая к тому же где-то добудет бэкдор, поставит, а он спустя время показательно нагадит, всунув какую-то рекламу несуществующего казино или прона,а ещё лучше, всунет в данные, которыми делятся как результатом работы. Это чтобы нанятого хакера по итогу в установке вируса и обвинили, и доделать работу не дали.

Делай программу с индивидуальными ключами.

Не читал все, но я просто открою сборку чем то вроде .NET Reflector и уберу все проверки ключей и обращения к серверу. Там все будет видно как на ладони.

Так есть же огромное количество упаковщиков исполняемых файлов (не путать с архиваторами). Ясен пень, что есть и анпакеры, но я так понял, защититься от тех, кто в курсах, что такое Ida, SoftIce и PeID — не ставится ))

2 последние тулзы померли вместе с виндовс ХП, ваши знания слегка устарели. С пакерами всегда будет головная боль с антивирями

Пару недель назад обфускейтил исходники и шифровал все ресурсы c помощью www.red-gate.com/...​evelopment/smartassembly

PS. Конечно же я не покупал это чудо, а просто крякнул.

Использовать прогу для защиты, которая не смогла себя защитить, как же это не логично

Сколько времени после релиза продержались Windows 10 и GTA IV, до того как их взломали? Не больше часов 5.

виндовс вообще не парятся над защитой, у них вся прибыль с корпоративных клиентов. Гта 5 разве щас можно по сети играть на пиратке на офф серверах?

Версия .Net?
P.S. тег embedded лишний.

Давать бесплатные советы по защите коммерческого софта зло. На профильных форумах такие темы сразу закрывали

VMProtect имхо справится вполне. Защита ресурсов есть даже в Lite версии. Не реклама.

Ну да, пока самым адекватным решением было бы:
1. Использование нечто типа VMProtect причем расшифровка и обработка данных из файла в другой нити.
2. Шифрование файла обычным RSA алгоритмом.
3. Kлюч хранить захардкоденым в виде константного массива байтов и хешированным к каким-то числом чтобы нельзя было обнаружить просмотром файла.

Взломать можно, но уже после вдумчивого изучения.

Труды «Криса Касперски» он же Мыщьх вам в помощь. В целом есть стандартные решения которые шифуют весь exe файл, и добавляют функцию main которая сначала расшифровывает код и загружает его в память.

Так а в чём проблема? Ты расписал уже по шагам её решение. Или тебе надо низкоуровневое решение? Я бы взял RAR или 7ZIP архив, накидал бы туда ресурсов, зашифровал средствами архиватора, потом взял бы одну из многочисленных библиотечек или прямо unrar.dll в исходниках или такое же для 7zip и с помощью API доставал бы нужные файлы. Архив хорош тем, что зашифрованные файлы можно хранить иерархически. Пароль AFAIR можно делать на каждый файл свой. Естественно что пароли будут в исполнимом файле, но задача стоит обломать мамкиного хакера. Папкиного хакера уже не получится. В качестве дополнительной защиты от мамкиного хакера пароль передавать не в открытом виде в .dll, а хотя бы в поксоренном, т.к. все эти unXXXX.dll часто поставляются в исходниках, то там же перед доступом к запароленным заархивированным файлам восстанавливать пароль.

Спасибо. Вопрос защиты от папкиного хакера вообще не стоит, там потратишь на защиту больше ресурсов чем будет потрачено на её взлом.

Підписатись на коментарі