Запутывание двоичных файлов на основе C, чтобы избежать декомпиляции

StackOverflow https://stackoverflow.com/questions/2273610

  •  20-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

Самый простой способ:Купите продукт упаковщика / криптографа /обфускатора.Некоторые из них дорогие и используются в играх, некоторые - нет.Загуглите их по таким модным словечкам, как "защита от копирования" и т.д.

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

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

о, я совсем забыла:

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

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

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

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

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

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

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

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

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

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

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

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

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

Зачем запутывать код, если от этого есть коммерческая выгода?Честно говоря, предположим, что коммерческий код достаточно оптимизирован, запутан и работает, тогда произошла самая неприятная вещь - сбой.... вы застряли, имхо, поскольку производственный двоичный код запутан, что затрудняет его реализацию. отладка там, где происходит сбой и который трудно воспроизвести, он навсегда застрянет в списке ОШИБОК...

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

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

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

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

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

Если вы намерены предотвратить реверс-инжиниринг кода, это, вероятно, сработает.Если вы намерены помешать кому-то взломать систему безопасности, то одно только запутывание не остановит решительного злоумышленника.В какой-то момент принимается решение «да/нет», и им не нужно ни понимать код, чтобы найти его, ни обойти его.

Компилятор Tiny C модифицирован для создания запутанного кода: http://blogs.conus.info/node/58

Чтобы обеспечить некоторую теоретическую поддержку ответов здесь:в 2001 Барак и др.ал. доказал, что обфускация программы невозможно в общем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top