Запутывание двоичных файлов на базе С для предотвращения декомпиляции

Там некоторый путь состоит в том, чтобы запутать исполняемые файлы на базе С или библиотеки для предотвращения декомпиляции?

23
задан Jonathan Sterling 9 December 2010 в 04:29
поделиться

10 ответов

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

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

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

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

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

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

35
ответ дан 29 November 2019 в 01:04
поделиться

Вот сложная (но, возможно, интересная) альтернатива. Если вы пишете что-то серьезное, то вы, вероятно, должны использовать одно из предложений Брайанов, но просто из любопытства, я хотел спросить, можно ли написать F # вычислительное выражение, чтобы сделать это. Можно объявить тип, представляющий int , который должен использоваться только с проверенными операциями:

type CheckedInt = Ch of int with
  static member (+) (Ch a, Ch b) = Checked.(+) a b
  static member (*) (Ch a, Ch b) = Checked.(*) a b
  static member (+) (Ch a, b) = Checked.(+) a b
  static member (*) (Ch a, b) = Checked.(*) a b

Тогда можно определить построитель вычислительных выражений (это вообще не монада, потому что типы операций совершенно нестандартны):

type CheckedBuilder() = 
  member x.Bind(v, f) = f (Ch v)      
  member x.Return(Ch v) = v
let checked = new CheckedBuilder()  

При вызове метода «bind» данное целое значение будет автоматически преобразовано в целое число, которое должно использоваться с операциями checked , поэтому остальная часть кода будет использовать операторы + и * , объявленные как члены. Вы заканчиваете с чем-то таким:

checked { let! a = 10000 
          let! b = a * 10000 
          let! c = b * 21 
          let! d = c + 47483648 // !
          return d }

Это бросает исключение, потому что оно переполняется на отмеченной линии. При изменении числа возвращается значение int (так как элемент Return восстанавливает числовое значение из типа Checked ). Это немного сумасшедшая техника: -) но я подумал, что это может быть интересно!

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

-121--2200485-

Это более видное место в яванском мире на самом деле. В основном «» = = «» является перегрузкой оператора и .Equals () является базовым методом для класса Object .

-121--1858873-

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

5
ответ дан 29 November 2019 в 01:04
поделиться

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

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

Сложный путь : Напишите свой собственный упаковщик.

о, я забыл:

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

13
ответ дан 29 November 2019 в 01:04
поделиться

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

0
ответ дан 29 November 2019 в 01:04
поделиться

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

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

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

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

1
ответ дан 29 November 2019 в 01:04
поделиться

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

3
ответ дан 29 November 2019 в 01:04
поделиться

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

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

2
ответ дан 29 November 2019 в 01:04
поделиться

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

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

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

2
ответ дан 29 November 2019 в 01:04
поделиться

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

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

2
ответ дан 29 November 2019 в 01:04
поделиться

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

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

0
ответ дан 29 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: