Обфускация на уровне исходного кода более эффективна, чем обфускаторы?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Глядя на некоторые декомпиляторы, такие как 9 лучей, Саламандра, Джунгли, многие методы обфускации, кажется, уже побеждены, есть одно особенно пугающее утверждение:

Автоматически удаляет строковые шифрования, введенные обфускаторами ~ Саламандра

Как и ручное управление, более эффективное обфускирование на уровне исходного кода чем намыленное, "поверхностное" обфускирование после компиляции / в середине компиляции с помощью хорошо известных (легко побеждаемых??) обфускирующих программ?

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

Решение

Запутывание исходного кода обречено на провал с точки зрения обслуживания.

Если ваш проект такой "секретный", я думаю, у вас есть два варианта:

  • Разместите "секретный" код собственности за сервисом на сервере, который вы контролируете

  • Закодируйте его на языке, который так непросто декомпилировать, например C / C ++

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

Может быть, и спорно, но для этого вы разрушите ремонтопригодность.

Действительно ли это того стоит?

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

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

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

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

Есть также некоторые приемы, которые вы можете использовать, чтобы разрушить рефлектор (в некоторых случаях Obfuscator из PreEmptive ломает рефлектор, но, конечно, вы все равно можете прочитать IL). Однажды у меня был интересный разговор с разработчиком инструмента для запутывания, и я не смогу сделать это правильно, но у него был способ полностью сломать рефлектор, динамически перемещая код. Например, один момент в вашей функции а затем вы перейдете к середине функции б. Doign this приводит к тому, что PEVerify вызывает ошибки, так что они на самом деле никогда не реализовывали это, но это была хорошая идея.

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

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

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

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

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

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

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

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

<Ол>
  • Проект настолько велик, что хит читаемости вернется, чтобы кусать вас в задницу.
  • Люди, которые хотят перепроектировать это, сделают это так или иначе. Для определения того, что нужно делать, потребуется немного больший интеллект (вместо того, чтобы просто читать имена членов).
  • Я встревожен, что вы даже рассматриваете запутывание на уровне кода. Разве вы не будете запутывать код для себя тоже? Как вы намереваетесь когда-нибудь снова поработать над этим? Ради ремонтопригодности этого делать не следует.

    Но учтите это: -

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

    Теперь это какая-то идея.

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

    вы можете использовать такую технику, как эта : http://g.palem.in/SecureAssembly.html используя это, вы пишете на .net, но встраиваете в исполняемый файл на c ++ свой исполняемый файл .net ,

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