Защита исполняемого файла от обратного инжиниринга? - PullRequest
200 голосов
/ 26 июня 2011

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

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

Некоторые вещи, о которых я думал до сих пор:

  • Внедрение кода (вызов фиктивных функций до и после фактических вызовов функций)
  • Обфускация кода (искажение двоичного кода)
  • Напишите мои собственные процедуры запуска (сложнее привязать отладчики)

    void startup();  
    int _start()   
    {  
        startup( );  
        exit   (0)   
    }  
    void startup()  
    {  
        /* code here */  
    }
    
  • Проверка времени выполнения для отладчиков (и принудительное завершение при обнаружении)

  • Функциональные батуты

     void trampoline(void (*fnptr)(), bool ping = false)  
     {  
       if(ping)  
         fnptr();  
       else  
         trampoline(fnptr, true);  
     }
    
  • Бессмысленные распределения и освобождения (стек сильно меняется)

  • Бессмысленные фиктивные звонки и батуты (тонны прыжков на выходе разборки)
  • Тонны литья (для запутанной разборки)

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

Ответы [ 24 ]

6 голосов
/ 26 июня 2011

Если кто-то хочет потратить время, чтобы изменить ваш двоичный файл, то вы абсолютно ничего не можете сделать, чтобы остановить его.Вы можете сделать, если умеренно сложнее, но это все.Если вы действительно хотите узнать об этом, получите копию http://www.hex -rays.com / idapro / и разберите несколько двоичных файлов.

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

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

6 голосов
/ 27 июня 2011

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

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

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

Обновление: новое понятие запутывания, называемое неразличимым запутыванием, может смягчить результат невозможности (статья)

5 голосов
/ 26 июня 2011

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

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

Чтобы иметь возможность выбрать правильный вариант, вам следует подумать о следующих аспектах:

  1. Вполне вероятно, что "новые пользователи" не хотят платить, но используют Ваше программное обеспечение?
  2. Вероятно ли, что существующим клиентам нужно больше лицензий, чем у них?
  3. Сколько готовы платить потенциальные пользователи?
  4. Хотите ли вы предоставить лицензии для пользователя / одновременных пользователей / рабочей станции / компании?
  5. Нужно ли ваше программное обеспечение для обучения / настройки, чтобы быть полезным?

Если ответ на вопрос 5 «да», не беспокойтесь о нелегальных копиях. Они все равно не будут полезны.

Если ответ на вопрос 1 «да», то сначала подумайте о ценообразовании (см. Вопрос 3).

Если вы ответите на вопросы 2 «да», то модель «оплата за использование» может подойдет для Вас.

Исходя из моего опыта, оплата за использование + настройка и обучение - лучшая защита для Вашего программного обеспечения, потому что:

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

Прежде чем вы подумаете о внедрении DRM или обфускации, вы можете подумать об этих моментах и ​​о том, применимы ли они к вашему программному обеспечению.

4 голосов
/ 26 июня 2011

На первый взгляд защищенный код на виртуальной машине казалось невозможным для обратного инжиниринга. Themida Packer

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

IDA Pro также поставляется с изящным ассемблерным кодом для преобразования исходного кода C, хотя сгенерированный код будет больше похож на математический беспорядок указателя / адреса ... если вы сравните его с оригинальным, вы сможете исправить все ошибки и вырвать что угодно.

4 голосов
/ 21 июля 2013

Чтобы избежать реверс-инжиниринга, вы не должны давать код пользователям.Тем не менее, я рекомендую использовать онлайн-приложение ... однако (поскольку вы не указали контекст), которое может быть бессмысленным для вас.

4 голосов
/ 26 июня 2011

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


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

Что бы ни собирал человек, его можно разобрать.

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

Если вы хотите что-то защититьпротив RE вы должны знать, по крайней мере, общие методы, используемые RE.

Таким образом, слова

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

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

(Существуют примеры программного обеспечения, использующего защиту неверным образом, когда такая защита практически отсутствует. Чтобы избежать расплывчатости, я приведу пример, кратко описанный вИнтернет: Оксфордский словарь английского языка, второе издание, на компакт-диске v4. Вы можете прочитать о неудачном использовании SecuROM на следующей странице: Оксфордский словарь английского языка (OED) на компакт-диске в 16-, 32- или 64-Битовая среда Windows: установка на жесткий диск, ошибки, макросы обработки текста, работа в сети, шрифты и т. д. )

Все занимает время.

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

Смысл защиты программного обеспечения состоит в том, чтобы запугивать новичков, останавливать обычные РЗ и вызывать улыбку на лице опытныхRE после ее / его (надеюсь, интересного) путешествия в центр вашей заявки.

В деловой беседе вы можете сказать, что все дело в задержке конкуренции, насколько это возможно.

(Посмотрите на красивую презентацию Серебряная иголка в Skype от Филиппа Бионди и Фабриса Дескло, показанную на Black Hat 2006).


Вы знаете, что есть многовещей о RE там, так что начните читать.:)

Я говорил о виртуализации, поэтому я дам вам ссылку на один примерный поток из EXETOOLS FORUM : Лучший защитник программного обеспечения: Themida или Enigma Protector? ,Это может помочь вам в дальнейших поисках.

4 голосов
/ 27 июня 2011

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

Сказав, что есть вещи, которые вы должны сделать, такие как:

  • Используйте максимально возможный уровень оптимизации (обратный инжиниринг - это не только получение последовательности сборки, но и понимание кода и его перенос на язык более высокого уровня, такой как C).Высокооптимизированный код может следовать за b. H.
  • Сделать структуры плотными, не имея больших типов данных, чем необходимо.Перестройка членов структуры между официальными выпусками кода.Вы также можете использовать переупорядоченные битовые поля в структурах.
  • Вы можете проверить наличие определенных значений, которые не следует изменять (например, сообщение об авторских правах).Если байтовый вектор содержит «vwxyz», вы можете иметь другой байтовый вектор, содержащий «abcde», и сравнить различия.Делающая это функция не должна передавать указатели на векторы, а использовать внешние указатели, определенные в других модулях как (код псевдо-C) "char * p1 = & string1 [539];"и "char p2 = & string2 [-11731];".Таким образом, не будет никаких указателей, указывающих точно на две строки.В коде сравнения вы сравниваете для « (p1-539 + i) - * (p2 + 11731 + i) == некоторое значение».Взломщик подумает, что сменить string1 безопасно, потому что никто, кажется, не ссылается на него.Погрузите тест в какое-то неожиданное место.

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

4 голосов
/ 27 июня 2011

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

Но 3 дополнительных примечания:

  1. Возможно сделать реверс-инжиниринг невозможным, НО (и это очень, очень большой, но),Вы не можете сделать это на обычном процессоре.Я также много занимался разработкой аппаратного обеспечения и часто использовал FPGA.Например, на Virtex 5 FX установлен процессор PowerPC, и вы можете использовать APU для реализации собственных кодов операций процессора на вашем оборудовании.Вы можете использовать эту возможность для реального дешифрования инсталляций для PowerPC, которые недоступны извне или другому программному обеспечению, или даже выполнить команду на оборудовании.Поскольку FPGA имеет встроенное шифрование AES для своего потока битов конфигурации, вы не можете выполнить его реинжиниринг (за исключением того, что кому-то удается сломать AES, но тогда, я думаю, у нас есть другие проблемы ...).Таким образом, поставщики аппаратного IP также защищают свою работу.

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

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

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

3 голосов
/ 28 сентября 2015

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

Вы можете сделать это, полагаясь на программу остановки («останавливает ли программа X?»), Которая в общем случае не можетрешить.Добавление программ, которые трудно рассуждать в вашей программе, делает вашу программу трудной для рассуждения.Такие программы легче построить, чем разорвать их на части.Вы также можете добавить код в программу, которая имеет различные степени сложности для рассуждения;отличным кандидатом является программа рассуждений об псевдонимах («указателях»).

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

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.39.1946&rep=rep1&type=pdf

Я не видел, чтобы конкретные методы Коллберга применялись к производственному коду, особенно к исходному коду C или C ++.

Обфускатор Java DashO, похоже, использует похожие идеи.http://www.cs.arizona.edu/~collberg/Teaching/620/2008/Assignments/tools/DashO/

...