Рекомендации по защите ресурсов от обратного проектирования

Чтобы обеспечить некоторый уровень защиты от обратного проектирования или декомпиляции, я решил переместить важные части моего приложения C #, включая несколько ресурсов xml, в собственный файл DLL C ++ на основе описанного метода здесь для использования ресурсов в программах на C ++ и практика1 и Practice2 для использования файлов DLL C ++ в приложениях C #. Теперь у меня два вопроса:

  1. Это правильный подход для решения проблемы защиты приложений от реверс-инжиниринга?
  2. W̶h̶a̶t̶ ̶i̶s̶ ̶t̶h̶e̶ ̶c̶o̶r̶r̶e̶c̶t̶ ̶w̶a̶y̶ ̶o̶f̶ ̶r̶e̶t̶u̶r̶n̶i̶n̶g̶ ̶t̶e̶x̶t̶ ̶c̶o̶n̶t̶e̶n̶t̶s̶ ̶i̶n̶ ̶C̶+̶+̶ ̶D̶L̶L̶ ̶f̶i̶l̶e̶s̶ ̶b̶a̶s̶e̶d̶ ̶o̶n̶ ̶p̶r̶a̶c̶t̶i̶c̶e̶1̶ ̶a̶n̶d̶ ̶p̶r̶a̶c̶t̶i̶c̶e̶2̶.̶ ̶I̶ ̶h̶a̶v̶e̶ ̶r̶e̶a̶d̶ ̶m̶a̶n̶a̶y̶ ̶s̶a̶m̶p̶l̶e̶s̶,̶ ̶b̶u̶t̶ ̶a̶l̶l̶ ̶o̶f̶ ̶t̶h̶o̶s̶e̶ ̶t̶h̶a̶t̶ ̶I̶ ̶r̶e̶a̶d̶ ̶h̶a̶d̶ ̶d̶e̶s̶c̶r̶i̶b̶e̶d̶ ̶b̶y̶ ̶u̶s̶i̶n̶g̶ ̶A̶d̶d̶/̶S̶u̶b̶t̶r̶a̶c̶t̶/̶M̶u̶l̶t̶i̶p̶l̶y̶/̶D̶e̶v̶i̶d̶e̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶s̶.̶

Обновление: я пропускаю второй вопрос, поскольку это может быть вопрос по кодированию, в то время как первый вопрос касается практики.


person utvecklare    schedule 20.02.2016    source источник


Ответы (1)


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

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

person Sergey Kalinichenko    schedule 20.02.2016
comment
Я не понимаю вашего мнения о шифровании. Код во время выполнения должен уметь расшифровывать, верно? - person manuell; 20.02.2016
comment
@manuell Я согласен с dasblinkenlight = ›ваша точка зрения действительна, но она подразумевает, что специалисту по реверсированию необходимо иметь доступ не только к dll, но и к работающей системе, если вы используете пароль / сертификат для расшифровки, предоставляемый средой выполнения. Кроме того, вы можете расшифровать хорошо известный собственный пароль, предоставляемый средой выполнения, в C ++, который было бы очень сложно, если не невозможно, восстановить. Конечно, такой дизайн сопряжен со значительными накладными расходами, поэтому я бы серьезно взвесил вероятность того, что кто-то перепроектирует код - обычно путь «судебного иска» намного дешевле. - person zaitsman; 20.02.2016
comment
@manuell Безусловно, код должен расшифровать ресурсы перед их использованием, поэтому любой, у кого достаточно решимости, сможет сделать то же самое. Цель упражнения не в том, чтобы сделать взлом невозможным (потому что это всегда возможно). Цель состоит в том, чтобы сделать его непрактичным для взлома, потому что усилия, необходимые для этого, значительно перевешивают выгоду от получения доступа к ресурсу. - person Sergey Kalinichenko; 20.02.2016
comment
@dasblinkenlight Я согласен, что это самый низкий и наименее эффективный подход. Но, учитывая важность приложения и пользователей этого приложения, не уверен, есть ли у нас и наших клиентов опыт создания сложного и декомпилированного приложения. Я думаю о том, чтобы скрыть важные разделы в собственной библиотеке C ++, чтобы предотвратить легкую декомпиляцию программ. Кроме того, использование контрольных сумм может быть еще одним способом убедиться, что это приложение не изменилось. К сожалению, у меня нет опыта в области шифрования приложений. Есть ли какой-нибудь простой пример / учебник, как это сделать? - person utvecklare; 20.02.2016
comment
@utvecklare Есть разница между скрытием ресурса от просмотра и затруднением его изменения. Контрольная сумма обеспечит вам достойную защиту от взлома ваших ресурсов. Лучше использовать сильный хэш, и он лишь немного сложнее (см. SHA-256). Шифрование сложнее, но есть много доступных ресурсов, чтобы сделать его управляемым, даже если вы поначалу мало о нем знали. Например, вот вопросы и ответы, объясняющие, как зашифровать и расшифровать строку. - person Sergey Kalinichenko; 20.02.2016
comment
@dasblinkenlight Спасибо за дальнейшие разъяснения. Итак, один из надежных способов - зашифровать хэш ресурса. Но все же у меня нет всей картины. Представьте, что аутентификация запрос-ответ должна поддерживаться настольным клиентским приложением с C #. Как метод / класс для создания ответа должен быть реализован в клиентском приложении таким образом, чтобы его было трудно реконструировать? Верно ли говорить, что этот метод / класс является ресурсом? - person utvecklare; 22.02.2016
comment
@utvecklare Метод, реализующий ответ, даже не является ресурсом, это обычно код (если вы не используете шаблонный ответ, то есть пароль, и в этом случае он становится ресурсом). Любой, у кого есть отладчик, может реконструировать код, имея для этого достаточно времени и достойный стимул. Все, что вы можете делать в программном обеспечении, - это усложнять им задачу до такой степени, чтобы они перестали пытаться. - person Sergey Kalinichenko; 22.02.2016