Запутывание двоичных файлов на основе C, чтобы избежать декомпиляции - PullRequest
22 голосов
/ 16 февраля 2010

Есть ли какой-нибудь способ запутать исполняемые файлы или библиотеки на основе C для предотвращения декомпиляции?

Ответы [ 13 ]

35 голосов
/ 16 февраля 2010

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

Тогда люди будут готовы заплатить за это.

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

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

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

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

13 голосов
/ 16 февраля 2010

Простой способ : купить упаковщик / криптор / обфускатор продукт. Некоторые дорогие и используются в играх, некоторые нет. Google для них модными словами, такими как «защита от копирования» и т. Д.

Быстрый способ : запаковать с UPX , а затем обработать заголовок где-нибудь, чтобы он все равно был загружен в память и нормально работал, но утилита upx завершится с ошибкой ( попробуйте поле версии). 95% сдастся, если утилита upx завершится неудачей.

Трудный путь : написать свой собственный упаковщик.

о, я забыл:

реальный простой способ : просто отправьте его как есть. Нет, на самом деле, что бы вы ни делали, люди все равно могут перепроектировать ваш код. Количество усилий, которое вы вкладываете в него, ограничивает количество, которое можно повернуть вспять.

5 голосов
/ 16 февраля 2010

скомпилировать с полной оптимизацией.

3 голосов
/ 16 февраля 2010

"запутанные исполняемые файлы" не имеют смысла. Аппаратное обеспечение должно быть способно «понимать» код в состоянии выполнить его, и оно может понять аппаратное обеспечение, а человек, занимающийся обратным проектированием, может это понять. Максимум, что вы можете сделать, - это сделать его более утомительным для понимания, но, вероятно, не намного, а по цене.

2 голосов
/ 21 января 2017

Декомпиляция ( Нет больше Gotos ), а также практика запутывания ( Flowtables ) и теория (Запутывание неразличимости) являются активными областями исследования, и поэтому нет никаких решений - только инструменты, методы и экспертиза. Если вы действительно хотите, чтобы ваш код был невосприимчив к декомпиляции, создайте веб-приложение и разместите сервер чувствительного кода. Но если вы придерживаетесь модели предоставления кому-то двоичного файла, то вы должны разумно оценить компромисс между безопасностью и производительностью. Обфускация обходится дорого, и все равно никогда не бывает идеальной. Некоторые варианты

  • Используйте упаковщик, отличный от UPX (UPX устанавливается во многих дистрибутивах Linux). Стоимость производительности низкая, и у большинства людей нет навыков, чтобы вручную распаковать двоичный файл для статического анализа. Но опытным реверсерам стоимость распаковки несущественна
  • Ознакомьтесь с Tigress, диверсифицирующим виртуализатором / обфускатором с богатыми возможностями для обфускации C-источник-источник. Для повышения производительности используйте вспомогательные преобразования, выравнивание потока управления, объединение / разбиение функций, буквенное кодирование
  • Если вы хотите еще большей защиты, ознакомьтесь с основными преобразованиями Tigress: виртуализация, JITing и т. Д., Но я уверен, что они дороже, и ваши пользователи могут заметить замедление, если вы будете использовать эти преобразования.

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

2 голосов
/ 16 февраля 2010

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

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

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

2 голосов
/ 16 февраля 2010

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

Если вы говорите о написании нового кода, попробуйте Self Modyfing C Code , который, вероятно, будет самым сложным способом перестройки вашего приложения.

2 голосов
/ 16 февраля 2010

Чтобы было сложнее? Конечно. Пожалуйста, не делай этого.

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

1 голос
/ 16 февраля 2010

Зачем запутывать код, если от него есть коммерческая выгода? Честно говоря, предположим, что коммерческий код достаточно оптимизирован, запутан и работает, а затем произошла мать всей неловкой вещи - сбой .... вы застряли в imho, поскольку производственный двоичный код запутывается, делая его труднее отладка там, где происходит сбой и его трудно воспроизвести, он навсегда останется в списке ошибок ...

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

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

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

0 голосов
/ 09 декабря 2015

Чтобы обеспечить некоторую теоретическую поддержку ответов здесь: в 2001 Barak et. al. доказано, что запутывание программы невозможно вообще .

...