Как убедиться, что ваш код в безопасности?

Я программист. У меня около 5 лет опыта программирования на разных языках. Я беспокоился о моей скорости кода, об оптимизации памяти, которая использует мой код, о хорошем стиле кодирования и так далее. Но никогда не думал, насколько безопасен мой код. Поэтому я разобрал свой код, чтобы посмотреть, на что способен хакер. Будет ли легко взломать мой код? И я увидел, что это так! Это очень легко, потому что я хранил

  1. серийный номер в виде строки
  2. а также коды шифрования-дешифрования

Так что, если кто-то обладает минимальным знанием ассемблера, он / она может просто разобраться, и после 10-20 минут отладки мой код взломан!!! Даже это можно сделать, открыв exe с помощью блокнота, я думаю!:-)

Итак, я спрашиваю следующее:

  1. Где мне хранить такую ​​безопасную информацию?
  2. Каковы общие стратегии доставки безопасного кода?

9 ответов

Решение

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

С этим из пути, вы, конечно, можете сделать это еще труднее для нарушителя, чтобы сломать вашу защиту. Запутывание - своего рода первый шаг в достижении этого. У меня нет опыта использования обфускаторов, но я уверен, что вы можете найти некоторые предложения для некоторых на SO. Также, если вы используете язык более низкого уровня, такой как C/C++, простая компиляция кода с полной оптимизацией и удаление всех символов отладки дает вам приличное количество запутывания.

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

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

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

Если вы беспокоитесь о пиратстве, то есть много способов, которыми вы можете воспользоваться. Обеспечение более надежной защиты кода (обфускация, лицензионные коды, привязка программного обеспечения к конкретному ПК, защита аппаратного обеспечения / защитного ключа и т. Д.) - это одно, но стоит помнить, что любой фрагмент программного обеспечения может быть взломан, если кто-то достаточно талантливый может быть обеспокоен,

Другой подход заключается в рассмотрении модели ценообразования для вашего программного обеспечения. Если вы берете 1000 долларов за копию, у кого-то есть большой стимул взломать ее. Если вы берете только 5 долларов, то зачем кому-то пытаться взломать его?

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

Сделайте это веб-приложением.

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

Я понятия не имею, поможет ли это, но Windows предоставляет (с 2000 года) механизм для извлечения и хранения зашифрованной информации, и вы также можете при необходимости использовать это хранилище для каждого приложения: API защиты данных ( DPAPI)

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

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

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

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

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

void (*encryptionFunctn)(void);
void hideEncryptnFunctn(void)
{
    volatile char * i;
    while(*i!=0xC0) // 0xC0 is the opcode for ret
    {
        *i++^=0x45; // or any other code
    }
}

Чтобы предотвратить хакеры, просматривающие ваш код, вы должны использовать обфускатор. Обфускатор будет использовать различные методы, которые чрезвычайно затрудняют понимание запутанного кода. Некоторые используемые методы: шифрование строк, переименование символов, запутывание потока управления и т. Д. Ознакомьтесь с Crypto Obfuscator, который также имеет скрытие вызовов внешних методов, Anti-Reflector, Anti-Debugging и т. Д.

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

Другие вопросы по тегам