Задача: максимизировать стоимость обфускации обратной инженерии

Отказ от ответственности. Подобные вопросы были заданы несколько раз на SO, однако этот вопрос гораздо более конкретный и до сих пор не был адекватно рассмотрен.

Мы разрабатываем новое упакованное программное обеспечение, которое по соображениям безопасности бизнеса должно запускаться на нашем клиентском сервере в PHP. Программное обеспечение продается с конечной лицензией для каждого пользователя; ценовой диапазон составляет от $20-80 за пользователя, целевой рынок - это небольшие (и веб-сайты) консультанты и ИТ-агентства.

Чтобы отбить пиратство (например, удаление пользовательской лицензии), мы хотели бы максимизировать защиту кода PHP любыми доступными технологиями, что не создает неудобства для пользователя.

Давайте сломаем это:

  • не вызывает неудобств у пользователя: никаких дополнительных серверных установок (без декодера zend или других двоичных файлов). Должен работать на общедоступном PHP-хостере с простым ванилом.

  • Максимизируйте защиту: нарушение защиты должно перевесить стоимость покупки дополнительной лицензии. То есть для профессионального хакера требуется не менее 3-5 рабочих дней, чтобы удалить защиту пользовательской лицензии.

  • Любые средства, технологически доступные: могут звонить домой, использовать криптографию высокого класса, могут реализовать эмулятор c64.

Проактивно решать самые невысокие решения:

  • НЕ Ищем идеальную обфускацию, просто чрезвычайно тяжелые (определяемые как: должны занимать не менее 3-5 рабочих дней для дешифрования), или другие методы борьбы с пиратством

  • НЕ Ищем программные пакеты "черного ящика", которые я не знаю, как они работают, и не может определить, соответствует ли это нашей цели; ищет алгоритмические и готовые идеи.

  • НЕ Ищем лицензию/защиту на стороне закона, мы уже имеем это.

  • Мы знаем, что, учитывая достаточное время и фокус, всякая запутанность будет взломана рано или поздно; мы просто хотим, чтобы это не было экономичным решением.

Учитывая приведенные выше ограничения, какие методы или идеи вы бы использовали для максимизации мер по борьбе с пиратством?

Bounty-hunt: точка подходит для самого сложного алгоритмического метода для обратного проектирования кода с учетом вышеприведенных ограничений.

Update/Bounty-hunt: я принял решение Ира Бакстера, в основном потому, что остальные не смогли ответить на основной вопрос и попытались подвергнуть сомнению основные предположения (бизнес, закрытый источник, yadda yadda). Спасибо всем!

Ответы

Ответ 1

Я думаю, что вы хотите преобразовать код алгоритмически, чтобы запутать не только то, что выполняется, но и запутать структуры данных. Мы предполагаем, что мы начнем с чистой версии программы, созданной разработчиком. Он всегда работает с чистой версией. Obfuscation производит версию для корабля. Хорошая обфускация приведет к выпуску версии корабля с точно такой же функциональностью, как и оригинал, поэтому дальнейшее тестирование (возможно) не требуется.

Для скремблирования потока управления идея состоит в том, чтобы взять хорошо написанный код, который у вас есть в начале, и проталкивать его посредством преобразований, которые делают статический (и человеческий) анализ решений, которые управляют потоком, сложными, умножая набор предположений которые необходимо проанализировать. Например, если у вас есть два указателя и сохранить значение через один, может ли это повлиять на значение, воспринимаемое другим? В зависимости от того, смещены ли указатели на нет, вы можете получить два разных ответа. Теперь возьмите N указателей, каждый из которых может быть псевдонимом; вы получаете 2 ^ N возможных отношений с псевдонимом. Если читатель не знает точной комбинации, он не сможет определить, может ли решение быть истинным, ложным или условным. Конечно, инструмент, который генерирует это, создает условия, результаты которых он знает, потому что он проектирует (генерирует) гнездо указателя крысы для получения определенного результата.

См. Обзор об обфускации кода (не моя статья), в котором обсуждается множество потоков управления и обфускации потока данных. Это, скорее всего, не последнее резюме того, что возможно, но его довольно поучительный. Следует отметить, что такое обфускация влияет на время выполнения.

В статьях по этой теме ясно, что программы контроля и потока данных, запутанные, чрезвычайно сложны, чтобы статические анализаторы "понимали" ; в документах представлены/приведены ссылки на алгоритмическую сложность обработки таких запутанных программ.

Теперь вы можете утверждать, что люди не являются статическими анализаторами и поэтому не имеют таких же ограничений. Возможно, ты прав; Роджер Пенроуз знаменито утверждает, что у людей нет таких же ограничений, как машины Тьюринга; аргумент не разрешен длинным выстрелом. Но весь фундамент технологии шифрования/хэширования основан на практически том же свойстве аргументов вычислительной сложности. И на сегодняшний день никто не оказался достаточно умным, чтобы взломать эти технологии способами которые могут быть использованы в повседневной жизни по течениям (хорошо, или ваши банковские счета будут пустыми).

Чтобы сделать это с помощью программы PHP, вам нужны инструменты, которые могут анализировать PHP-код и выполнять такие преобразования. Наш DMS Software Reengineering Toolkit обладает надежными парсерами PHP и может применяют очень сложные преобразования к коду. Чтобы сделать это очень хорошо, вы хотите применить преобразования глобально по всему вашему коду, а не только по каждому файлу. У нас нет такого рода преобразования обфускации, реализованного на PHP, но если вы действительно хотели это сделать, это было бы так. Мы применили комплексные преобразования к программам PHP для других коммерческих продуктов, которые мы продаем.

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

EDIT: Obfuscation!= AntiPiracy - тема в других ответах. Итак, как обфускация помогает?

Сначала вам нужно заняться проблемой борьбы с пиратством. Очевидные вещи:

  • Добавить комментарии к каждому файлу. Они служат предупреждением для людей. Не хорошие.
  • Добавьте строки авторских прав в разных местах и ​​периодически распечатывайте их;  они попадут в память и сыграют роль, когда пират украдет код; он тоже украл эту строку.
  • Добавьте строку в ваше приложение, в котором говорится: "Лицензия на". Это делает ваш клиент без энтузиазма о том, чтобы его украсть.
  • Добавьте в приложение, чтобы он работал на предполагаемой машине клиента.  (Поскольку ваше приложение должно быть очень дешевым, вам, вероятно, придется автоматизировать   процесс регистрации)
  • Иногда у телефона приложения есть свой идентификатор машины.

Теперь эти шаги не позволяют кому-то (юридически и технически) украсть ваш код.
Если это все, что у вас есть, невозмутимый пират просто удалит технические проверки и украдет их.

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

Если код достаточно запутан, ему будет сложно найти проверку лицензии и позвоните по телефону, чтобы отключить их. (Я предлагаю несколько проверок, ни один из них не всегда вызывал, чтобы затруднить для него указание, когда он будет успешным.). Обфускация, хорошо сделанная, должна защищать печать оригинала имя владельца, что означает, что у первоначального владельца будет некоторый интерес, чтобы он не был украденного, как вы назовете его вместе с пиратом в любом иске.

Если они побеждают лицензии, авторские права на печать и телефонные механизмы, и просто хотите запустить его в задней комнате, не сказав вам, вы можете застрять. (За 80,00 $, я не могу представить, почему они пошли на все эти проблемы только для этого эффекта). Но многие воры хотят изменить программное обеспечение, чтобы "улучшить" его, особенно если они хотят вашего рынка. Серьезная обфускация не позволит им это сделать; это даже затрудняет их добавление собственных контрольных лицензий. Это очень сильно ограничивает стоимость.

Они могут просто украсть его и освободить в мир бесплатно; ваша надежда здесь приложение трудно взломать. Если они преуспеют, ваша единственная хорошая защита  является постоянным потоком обновлений, которые получают лицензированные владельцы.

Обфускация - это ключ к успешной защите от пиратства, ИМХО.

Ответ 2

Obfuscation != Anti-piracy Например, у вас может быть сильно запутанный класс, но я могу использовать отражение, чтобы увидеть все методы, которые реализует этот класс. Затем я могу расширить этот класс и переопределить любые методы, которые мне не нравятся. Вы храните секрет? Потому что любое секретное значение можно извлечь из памяти с помощью отладчика.

3-5 дней? Даже с Zend-Guard требуется 3-5 секунд для разрыва с использованием некоторого инструмента с открытым исходным кодом. Большинство инструментов обфускации очень примитивны и легко разбиваются.

Извините, но я не думаю, что для этого есть хорошее решение.

Ответ 3

Лучший метод борьбы с пиратством - это не метод.

Если вы не хотите использовать такие инструменты, как zend, тогда вам лучше ничего не делать.

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

Сделайте хорошее приложение. чтобы он работал хорошо. дайте Фантастический сервис и клиенты, которых вы хотите, с радостью заплатите. те клиенты, которых вы не хотите, НИКОГДА не платите, поэтому не тратьте время на них. И угадайте, что они на самом деле становятся хорошей рекламой. люди видят ваше программное обеспечение на других сайтах, которые они ищут.

Таким образом, вы получаете бесплатную рекламу.

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

Я хотел добавить немного личного опыта.

В 90-х годах я много месяцев создавал методы шифрования, чтобы уменьшить/предотвратить пиратство сильно пиратской части программного обеспечения, в конце концов мне "в основном" удалось.

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

Раньше я болтался в группе новостей, посвященной взлому моего программного обеспечения и тому подобное, и даже завязал разговоры. один вежливый парень сказал: "Почему вы тратите свое время, мы делаем это ради удовольствия". но я был привязан. это было соревнование.

Если бы я потратил время и силы на совершенствование программного обеспечения, я бы заработал в 10 раз сумму, которую, как я думал, потерял для пиратства.

Это была глупая победа.

Ответ 4

Я много думал об этом, и то, что вы просите, по существу невозможно. Вы можете запутаться до конца, и люди все равно украдут ваше программное обеспечение. Это мало что можно сделать. Если вы напишете код, чтобы позвонить домой, кто-то его вычеркнет и просто поместит true. Лучше всего писать качественное программное обеспечение, чтобы люди хотели его купить. Это либо это, либо использование коммерческого решения, такого как ionCube или Zend.

Ответ 5

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

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

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

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

Это все еще не идеально, кто-то "сможет" клонировать производственную машину, обойти/перенаправить лицензирование (и вы не будете знать, так как это будет копия) и попытаться уйти на проверку, у вас есть код, для которого требуется лицензия (как кто-то, упомянутый выше, установить для всей логики значение "Истина" )... но вы могли бы потратить время на проверку и шифрование вашей системы лицензирования и сделать ее трудоемкой и "рискованный" процесс. Unlesss.. как последний штрих... у вас может быть какая-то поставка из вашего продукта, сгенерированного вашим сервером (ни один из кода в том, что есть у клиента), и не подталкивается к программному обеспечению, имеющему этот механизм лицензирования. Но я не знаю, насколько это возможно.

Ответ 6

Надувание искусственного кода

Используя пост-процессоры для автоматического раздувания кода и вставки логических множителей, вы сильно изменяете код

Я использую теги в исходном источнике, чтобы указать тип кода в каждом методе и какой множитель кода использовать. Randomisers также могут помочь, так как каждый релиз выглядит совсем по-другому.

Набухание кода достигается целым рядом процессов. например повторение и случайное воспроизведение переменных до и после их официального охвата. Множество дополнительных логических шагов, которые никогда не последуют. Разбиение отдельных операторов на многие случайные малые шаги. Чересстройте их с помощью как можно большего числа других утверждений, если последний шаг находится в правильном порядке. etc и т.д.

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

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

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

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

Я не делал этого с PHP, но с другими языками с аналогичными ограничениями, такими как PHP

Примечание: Этот метод отлично подходит для сложного научного программного обеспечения, где в любом случае имеется большое количество критической логики и математики. Возможно, это не так хорошо подходит для типичных веб-сайтов, таких как CMS, если ваши кодовые мультипликаторы очень убедительны.

Ответ 7

Если я получу это правильно, почему бы не инвестировать в сервер, который должен быть доставлен в рамках стоимости приложения, сервер, который может быть размещен у клиента, и только один порт открыт для доступа к http, я имею в виду с 1000 долларов США, которые вы может получить машину, которая может работать как безопасная для вашего программного обеспечения. Если кто-то попытается взломать его, вы узнаете.

Другим решением может быть:

В настоящее время я работаю над огромной компанией, которая имеет около 350 торговых точек (магазинов) по всей стране. Поскольку мы не можем полагаться на подключение к Интернету, 100% у нас есть сервер в каждом магазине. Этот сервер обрабатывает бизнес, необходимый для фактической продажи, и связан с локальной базой данных. Остальная часть материала находится на сервере головного офиса. Теперь у клерков есть компьютеры перед ними, и все эти компьютеры работают с приложением, размещенным на локальном сервере, catch на локальном сервере - это реестр, который знает, если определенная служба размещена локально (на том же компьютере) или удаленно (в головном офисе) и выполняет вызов по требованию (через http из удаленного места или прямой вызов из локальной службы). Службы могут быть размещены в любом месте (локальном или удаленном), и все, что нужно сделать, это настроить свое местоположение в реестре, просто введя одно из ключевых слов: локальное, удаленное приложение (ключевое слово приложения означает, что услуга сначала вызывается с удаленного и если он терпит неудачу, он называется локально). Таким образом, вы можете сделать приемлемый компромисс. Очень необходимый материал может сидеть локально, а остальная бизнес-логика может находиться на вашем сервере, где никто не может ее трогать.

Ответ 8

Короткий ответ - нет, нет способа обфускации кода таким сложным образом, что требуется трещины дней. Простое объяснение: обфускация - это двухсторонний процесс. Это можно сделать и отменить. Если компьютер может это сделать, определенный человек тоже может это сделать.
Вместо того, чтобы тратить столько времени на защиту своего кода, почему бы не взять намек с популярного телешоу 24 (примечание стороны: никогда не было отменено!). Чтобы убедиться, что сценарии не были украдены или открыты для публики, они обозначили водяной знак каждым номером, определенным для участника, режиссера, продюсера и т.д. Вы можете сделать что-то подобное с вашими сценариями, "водяным знаком" каждого файла PHP. Это может быть так просто, как изменение имени переменной, чтобы отразить идентификатор клиента или что-то такое же сложное, как распространение идентификационных символов над несколькими значениями и именами переменных и функций. Попробуйте использовать этот идентификатор и/или его части как можно больше незаметных мест в ваших сценариях. Только вы можете узнать точную комбинацию, которая создает идентифицирующую информацию. Таким образом, если код просочился, вы можете подать в суд на ответственную сторону.

Ответ 9

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