Защита исполняемого файла от обратного инжиниринга? - 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 ]

3 голосов
/ 04 мая 2012

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

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

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

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

Groetjes Albert

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

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

Это один из примеров совершенно запутанногоутверждение программы, демонстрирующее мою точку зрения:

printf("1677741794\n");

Никогда нельзя догадаться, что на самом деле это

printf("%d\n", 0xBAADF00D ^ 0xDEADBEEF);

. Есть интересная статья на эту тему, которая доказывает некоторые невозможные результаты.Она называется «О (Im) возможности запутывания программ» .

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

2 голосов
/ 11 марта 2012

Кто-нибудь пробовал CodeMorth: http://www.sourceformat.com/code-obfuscator.htm?Или Фемида: http://www.oreans.com/themida_features.php?

Позже человек выглядит более многообещающе.

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

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

КОНЕЦНАЯ ЦЕЛЬ : моей конечной целью для большинства программ является возможность продавать различные лицензии, которые будут включать и выключать определенные функции в моих программах.

ЛУЧШАЯ ТЕХНИКА : Я считаю, что создание системы хуков и фильтров, таких как WordPress, является абсолютным лучшим методом, который пытается сбить с толку ваших оппонентов.Это позволяет вам шифровать определенные ассоциации триггеров без фактического шифрования кода.

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

ЗНАЙТЕ ВАШИ КРЕКЕРЫ : Знайте это: главная причина взлома кода не из-за злонамеренного распространения лицензий, а из-за того, что НЕОБХОДИМО изменить ваш код, а им на самом деле НЕ НУЖНОраспространять бесплатные копии.

НАЧАЛО РАБОТЫ : выделите небольшое количество кода, который вы собираетесь зашифровать, остальную часть кода следует попытаться втиснуть в ОДИН файл, чтобы увеличить сложностьи понимание.

ПОДГОТОВКА К ШИФРОВАНИЮ : Вы будете шифровать слои с моей системой, это также будет очень сложной процедурой, поэтому создайте другую программу, которая будет отвечать запроцесс шифрования.

ШАГ ПЕРВЫЙ : Обфускация, используя имена base64 для всего.После этого зашифруйте код base64 и сохраните его во временном файле, который впоследствии будет использоваться для расшифровки и запуска этого кода.Имеет смысл?

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

STEP TWO : вы собираетесь читать в этом временном файлекак строку и затемните ее, затем base64 и сохраните во втором временном файле, который будет использоваться для дешифрования и рендеринга для конечного пользователя.

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

LAND MINE ONE : Вы захотитедержите тот факт, что вы получаете абсолютную тайнуПоэтому создайте почтовую систему с предупреждением о попытке взлома для второго уровня. Она будет запущена, давая вам знать о противнике, если что-то пойдет не так.

LAND MINE TWO : Зависимости,Вы не хотите, чтобы ваш оппонент мог запускать первый уровень, без 3-го, 4-го или 5-го уровня или даже самой программы, для которой он был разработан.Поэтому убедитесь, что в первом слое есть какой-то сценарий уничтожения, который будет активирован, если программа отсутствует, или другие слои.

Я уверен, что вы можете создать свои собственные миныПовеселитесь с ним.

ВЕЩЬ, ЧТОБЫ ПОМНИТЬ : Вы можете фактически зашифровать свой код вместо base64'ing.Таким образом, простой base64 не сможет расшифровать программу.

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

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

УДАЧИ!

...