Как убедиться, что ваш код безопасен?
-
19-09-2019 - |
Вопрос
Я программист.У меня около 5 лет опыта программирования на разных языках.Я беспокоился о скорости моего кода, об оптимизации памяти, в которой используется мой код, о хорошем стиле кодирования и так далее.Но я никогда не задумывался, насколько безопасен мой код.Поэтому я разобрал свой код, чтобы посмотреть, на что способен хакер.Будет ли легко взломать мой код?И я увидел, что это так!Это очень просто, потому что я хранил
- серийный номер в виде строки
- коды шифрования и дешифрования, а также
Так что, если у кого-то есть минимальные знания ассемблера, он / она может просто использовать дизассемблер, и после 10-20 минут отладки мой код будет взломан!!!Я думаю, даже это можно было бы сделать, открыв exe-файл с помощью notepad!:-)
Итак, я спрашиваю о следующем:
- Где я должен хранить такую защищенную информацию?
- Каковы общие стратегии предоставления защищенного кода?
Решение
Первое, что вы должны осознать, это то, что вы никогда не помешаете определенному реверсору взломать какие-либо схемы защиты, потому что все, что может сделать код, реверсор в конечном итоге найдет, как это воспроизвести.Единственный способ добиться какой-либо надежной защиты - это сделать так, чтобы поставляемая программа была не более чем тупым клиентом и принимала основную нагрузку на себя на каком-нибудь сервере, к которому у реверсивера нет доступа.
Убрав это с пути, вы, безусловно, сможете это сделать сильнее ибо это был бы реверсивный способ разрушить вашу защиту. Запутывание это своего рода первый шаг в достижении этой цели.У меня нет опыта использования обфускаторов, но я уверен, что вы можете найти несколько предложений для некоторых из них на SO.Кроме того, если вы используете язык более низкого уровня, такой как C / C ++, простая компиляция кода с полной оптимизацией и удалением всех символов отладки приводит к приличному количеству запутываний.
Я читал эта статья несколько лет назад, но я все еще думаю, что эта техника актуальна и сегодня.Это один из разработчиков видеоигры под названием Spyro, рассказывающий о наборе методов, которые они использовали для предотвращения пиратства.Они утверждают, что взломанная версия стала доступна только через 3 месяца после релиза, что довольно впечатляет.
Другие советы
Если вас беспокоит пиратство, то есть много путей, которыми вы можете воспользоваться.Ужесточение защиты кода (запутывание, лицензионные коды, привязка программного обеспечения к определенному ПК, защита оборудования / ключа и т.д.) - это одно из них, но стоит иметь в виду, что каждый часть программного обеспечения может быть взломана, если потрудиться кому-то достаточно талантливому.
Другой подход заключается в рассмотрении модели ценообразования для вашего программного обеспечения.Если вы берете 1000 долларов за копию, то у кого-то появляется большой стимул попробовать взломать ее.Если вы берете всего 5 долларов, то зачем кому-то утруждать себя его взломом?
Итак, что необходимо, так это баланс.Даже самая элементарная защита не позволит обычным людям делать случайные копии.Помимо этого, простые методы (обфускация и лицензионные коды) и разумная ценовая стратегия удержат большинство потенциальных взломщиков в страхе, поскольку не стоит беспокоиться о взломе.После этого вы начинаете осваивать все более изощренные методы (для запуска программного обеспечения необходимы ключи / компакт-диски, запустить программное обеспечение можно только после входа в систему онлайн-лицензирования), внедрение которых требует больших усилий / затрат и значительно увеличивает риск раздражения настоящих клиентов (помните, как все разозлились, когда купили half life, но она не позволила им поиграть в игру?) - если только у вас нет популярного массового продукта (т. Е.огромный поток доходов для защиты), вероятно, нет особого смысла прилагать столько усилий.
Сделайте это веб-приложением.
Как правило, он не будет хорошо защищен, если только нет внешней службы, выполняющей проверку, которую вы контролируете, - и эта служба все еще может быть подделана теми, кто действительно хочет ее "взломать".Вместо этого доверяйте клиенту и предоставляйте лишь минимальную защиту авторских прав.Я уверен, что где-то была статья или подкаст Джоэла Спольски об этом...вот еще один связанный С ЭТИМ вопрос SO.
Я понятия не имею, поможет ли это, но Windows предоставляет (с 2000 года) механизм для извлечения и хранения зашифрованной информации, и вы также можете использовать это хранилище для каждого приложения, если это необходимо:API для защиты данных (DPAPI)
Это на уровне компьютера или пользователя, но хранить сериалы и, возможно, некоторые ключи, использующие их, может быть лучше, чем скрывать их в приложении?
О какой безопасности вы говорите?Безопасно с точки зрения того, что вы хорошо защищаете данные своих пользователей?Если это так, изучите немного реальной криптографии и используйте Существующий библиотеки для шифрования ваших данных.win32 API довольно хорош для этого.
Но если вы говорите о том, чтобы помешать взломщику украсть ваше приложение?Есть много методов, но просто откажитесь.Они замедляют процесс приготовления крекеров, но не останавливают их.
Посмотрите на Как скрыть строку в двоичном коде? вопрос
Сначала вы должны определить, от чего должен быть защищен ваш код, поскольку безопасность как таковая бессмысленна.
Похоже, вы беспокоитесь о реверс-инжиниринге и пользователях, генерирующих лицензионные коды без оплаты, хотя и не говорите об этом.Чтобы усложнить задачу, вы можете запутать свой код и ключевую информацию различными способами.Существуют также методы, позволяющие усложнить использование отладчиков, чтобы не дать реверс-инженеру пройтись по коду и увидеть информацию в ясном виде.Но это только несколько усложняет реверс-инжиниринг, но не делает его невозможным
Другой распространенной угрозой безопасности является выполнение нежелательного кода, например, из-за переполнения буфера.
Простой способ сделать это - выполнить xor поверх всего вашего кода и xor обратно, когда вам это нужно...но для этого нужны врожденные знания в области сборки...Я не уверен, но вы могли бы попробовать это:
void (*encryptionFunctn)(void);
void hideEncryptnFunctn(void)
{
volatile char * i;
while(*i!=0xC0) // 0xC0 is the opcode for ret
{
*i++^=0x45; // or any other code
}
}
Чтобы предотвратить просмотр вашего кода хакерами, вам следует использовать обфускатор.Обфускатор будет использовать различные методы, которые чрезвычайно затрудняют понимание запутанного кода.Некоторые используемые методы включают шифрование строк, переименование символов, обфускацию потока управления и т.д.Проверьте Крипто-Обфускатор который дополнительно также имеет скрытие вызова внешнего метода, защиту от отражения, Защиту от отладки и т. Д
Цель состоит в том, чтобы воздвигнуть как можно больше препятствий на пути потенциального хакера.