Рассмотренные выше приемы противодействия отладке и дизассемблированию имеют один серьезный недостаток – они привязываются либо к особенностям процессора, либо к особенностям отладчиков (дизассемблеров). Квалифицированные злоумышленники рано или поздно их обойдут.
Наиболее предпочтительным способом защиты ПО от отладки и дизассемблирования является способ, основанный на шифровании кода программы на некотором секретном ключе. При этом предъявляется требование того, чтобы секретность ключа не могла быть нарушена путем исследования кода программы и дискового пространства ПК. Таким образом, ключ не должен фигурировать ни в коде программы, а также не должен храниться ни в файле, ни в реестре, где он может быть обнаружен путем исследования работы программы различными средствами мониторинга.
Допустим, например, что секретный ключ расшифровывает рабочий код программы, а берется, из электронного ключа, либо представляет собой вводимую пользователем последовательность. В данном случае взлом становится очень трудоемким, а иногда и невозможным в приемлемые сроки. Затягивание времени взлома позволит все это время поддерживать объемы продаж.
Просто о двоичной системе счисления и двоичном коде. #1
Выделяют два способа шифрования кода программы – статическое и динамическое.
В первом случае модуль дешифровки отрабатывает только один раз, после чего исходный код будет полностью восстановлен. Такой подход имеет простую реализацию, но крайне неэффективен. Злоумышленник может снять дамб памяти в момент окончания работы модуля дешифровки. Это трудно сделать при динамической дешифровке, когда ни в какой момент времени код не будет расшифрован полностью. При вызове процедуры он расшифровывается, а при выходе – зашифровывается вновь.
Реализация простейшей процедуры шифрования / дешифрования кода программы может выглядеть следующим образом:
начало зашифрованного блока
Источник: studfile.net
Безопасность: Защита исполняемого кода шифрованием
В данной статье будет приведён пример защиты исполняемого кода от различных анализаторов и прочей бяки. Данный способ может использоваться как для защиты кода от крякеров, так и для написания зловредного ПО (чего вам крайне не рекомендую), которое делает неизвестно что… код то зашифрован. Исходники на C++.
Итак, для начала делаем заготовку для нашей программы. Выглядеть это будет примерно так:
#include «stdafx.h»
using namespace std ;
int main ( int argc , char * argv [ ] )
cout << «Encrypted mega-code ;-)» ;
В общем то эта вся основная «функциональная» часть нашей программы. Не много, но для того чтобы понять логику достаточно. Далее нам потребуется как-то найти в скомпилированном коде ту часть, которую требуется зашифровать/расшифровать. Для этого неплохо было бы пометить её. Вставим перед выводом сообщения и после него метки:
[ code lang = «cpp» ] __asm
Как защитить программу от Взлома на C#
Ассемблерные вставки при дизасcемблировании не изменятся, поэтому их будет достаточно легко найти. Чтобы наша программа в своём конечном виде работала неплохо было бы расшифровать её код при записи. Сделаем заготовку определим пустую (пока что) функцию decrypt() типа void и вставим её вызов в самое начало нашего приложения.
Теперь скомпилируем всё это дело. Теперь открываем OllyDbg или любой другой debugger, запускаем в нём наше приложение в пошаговом режиме и ищем нужный код между нашими NOP’ами. Запоминаем виртуальные адреса в памяти и сколько байт кода между метками надо зашифровать. У меня начало искомого диапазона равно 0x00411648 (в Вашем приложение значение будет отличаться), конец — 0x0041165b.
Пришло время дописать функцию расшифровки. Будет использовано три API-функции — ReadProcessMemory() и WriteProcessMemory(), их смысл, думаю, понятен, и функция OpenProcess() для доступа к виртуальной памяти процесса. Для шифрования выбран единственный шифр, для которого доказана абсолютная криптографическая стойкость — шифр Вернама.
Если кто-то не понял, то шифровать будем с помощью XOR’а (операция «исключающего или», или, побитовое сложение по модулю 2). Ключ, правда, в этом примере будет примитивным — каждый байт будем XOR’ить с единичкой. Итак, наша функция должна считать нужную область памяти (19 байт), расшифровать код в ней и записать обратно. Вот как это выглядит:
Источник: zetblog.ru
Обфускация как метод защиты программного обеспечения

Или то, почему вы не можете издать свою улучшенную версию Counter Strike и уехать жить на Гавайи.
О чём речь?
Обфуска́ция (от английского obfuscate — делать неочевидным, запутанным, сбивать с толку) в широком смысле — приведение исходного текста или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.

Далее в программе
- Зачем это нужно?
- Как это должно работать?
- Как это работает?
- Методы
- Состояние дел сейчас
Зачем это нужно?
Как известно, одним из основных методов взлома программного обеспечения является исследование кода, полученного в результате работы дизассемблера на предмет уязвимостей. На основе такого когда нетрудно, например, составить программу генерации ключей активации коммерческого программного обеспечения или, наоборот, внести в исполняемый файл изменение — патч, позволяющий злоумышленникам отключить «нежелательные» модули исходной программы.
Всему вышеперечисленному как раз и может противодействовать специальная программа — обфускатор.
Так же, алгоритмы обфускации активно используются не только для затруднения анализа кода, но и для уменьшения размера программного кода, что, в свою очередь, активно используется при разработке различных веб-сервисов и баз данных.
Как это должно работать?
Как понятно из вышесказанного, методы обфускации должны усложнить код, преобразовав его таким образом, чтобы скрыть от третьих лиц логику его работы.
В идеале хотелось бы, чтобы программа, прошедшая обфускацию, давала бы не больше информации нежели чёрный ящик, имитирующий поведение исходной программы. Гипотетический алгоритм, реализующий такое преобразование называется «Обфускация чёрного ящика». Декомпиляция зашифрованной таким образом программы дала бы злоумышленникам не больше информации, чем декомпиляция клиента мессенджера, представляющего собой лишь обёртку над апи «настоящего» приложения, что бы полностью решило поставленную в предыдущем блоке проблему. Однако показано [3] , что реализация такого алгоритма для произвольной программы невозможна.
Как это работает
Большинство методов обфускации преобразуют следующие аспектов кода:
• Данные: делают элементы кода похожими на то, чем они не являются
• Поток кода: выставляют исполняемую логику программы абсурдной или даже недетерминированной
• Структура формата: применяют различное форматирование данных, переименование идентификаторов, удаление комментариев кода и т.д.
Инструменты обфускации могут работать как с source или байт кодом, так и с бинарным, однако обфускация двоичных файлов сложнее, и должна варьироваться в зависимости от архитектуры системы.
При обфускации кода, важно правильно оценить, какие части когда можно эффективно запутать. Следует избегать обфускации кода, критичного относительно производительности.
Методы

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