Защита исполняемого файла от обратного проектирования?

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

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

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

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

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

  • Функциональные трамплины

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

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

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

205
задан Ryan Tenney 30 April 2012 в 17:04
поделиться