Как убедиться, что ваш код в безопасности?
Я программист. У меня около 5 лет опыта программирования на разных языках. Я беспокоился о моей скорости кода, об оптимизации памяти, которая использует мой код, о хорошем стиле кодирования и так далее. Но никогда не думал, насколько безопасен мой код. Поэтому я разобрал свой код, чтобы посмотреть, на что способен хакер. Будет ли легко взломать мой код? И я увидел, что это так! Это очень легко, потому что я хранил
- серийный номер в виде строки
- а также коды шифрования-дешифрования
Так что, если кто-то обладает минимальным знанием ассемблера, он / она может просто разобраться, и после 10-20 минут отладки мой код взломан!!! Даже это можно сделать, открыв exe с помощью блокнота, я думаю!:-)
Итак, я спрашиваю следующее:
- Где мне хранить такую безопасную информацию?
- Каковы общие стратегии доставки безопасного кода?
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 и т. Д.
Цель состоит в том, чтобы установить как можно больше препятствий на пути потенциального хакера.