2010-08-14 4 views
5

Мой клиент попросил меня написать собственный зашифрованный исполняемый файл, чтобы предотвратить легкое взлома системы лицензирования. Теперь я понимаю, что это ложное чувство безопасности, но, несмотря на это, он настаивал на этом.Выполнить данные как код?

Итак, я откопал свои знания портативных исполняемых файлов и придумал эту идею:

  • шифруют исполняемые
  • палочка этого к концу загрузчика исполняемого файла вместе с его размером
  • The загрузчик расшифровывает данные
  • Он копирует код на страницу, выделенную VirtualAlloc, которая имеет права доступа к исполнению
  • Он находит точку входа приложения
  • Прыжки там, и мы все настроены.

У меня проблема с прыжком с места. Как я могу это сделать? Если бы мне нужно было установить указатель на функцию, какова будет подпись? Подпись функции main() загруженного исполняемого файла? Или мне нужно прибегнуть к сборке?

Я понимаю, что может потребоваться исправление абсолютных адресов после загрузки кода. Как я могу проверить, нужно ли мне и как это сделать?

Редактировать: Работа над окнами и компиляция с помощью GCC. При необходимости я могу переключить компилятор Microsoft.

Редактировать 2: Уточнить: Я ЗНАЮ, что это в основном бессмысленно. Я считаю, что это означает любой тип DRM. Это зависит от моего клиента, и он все еще хочет его, несмотря на то, что я предупреждаю его об этом.

Заранее благодарен.

+0

Ваше типизированное решение в моей точке зрения мало багги, что это ваши функции делают прыжки на другие функции? Они фиксируют другие адреса, и я вижу много проблем с этим решением, например, где находятся статические связанные библиотеки? кто использует encypted code? – Svisstack

+0

Я бы сказал - если вы действительно хотите DRM. Купите его. Зачем? Даже если вы получите «что-то» и работаете. Что вы делаете через полгода, когда его взломали? Продолжение работы с крекеры - это полная работа. –

+0

Это зависит от моего клиента. Мне все равно, если он принимает плохие решения. Я честно предупредил его, и он все еще хочет этого. –

ответ

4

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

Возьмите свой вход EXE; найти его код и инициализированные данные (включая постоянные). Переименуйте эти разделы и преобразуйте их все в разделы инициализированных данных чтения-записи; зашифровать содержимое. Теперь добавьте новый сегмент кода, содержащий ваш дешифрование дешифрования, и измените там точку входа. Этот заглушка должен расшифровать сегменты на месте, затем изменить их защиту на все, что подходит для их типа, и перейти к исходной точке входа.

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

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

+0

Это имеет смысл. Поэтому, если я вставляю новый раздел в exe и обновляю таблицы разделов и точку входа, я могу просто перейти к расшифрованному коду, потому что загрузчик ОС позаботился об импорте и перемещении (при необходимости)? –

+1

В принципе, да - за исключением перемещений _won't_, если они находятся в соответствующем разделе. Поэтому убедитесь, что это неперемещаемый EXE. Импорт имеет отдельный раздел заглушек в файлах PE, я считаю ... (не уверен, вы должны, вероятно, проверить это :) – bdonlan

+0

+1 атака дампа памяти;) –

0

Вы должны быть в состоянии с-стиль отдать свой адрес в указатель на функцию, и вызвать его:

typedef void (*MyPtr)(); 

MyPtr p = (MyPtr)1234; 
p(); 
11

К сожалению, переход к точке входа кода является наименее вашего беспокойства. Файл Portable Executable (PE) (который является файловым форматом, используемым для файлов EXE и DLL в Windows) - это не то, что вы можете просто загрузить в один блок памяти, а затем запустить. Ваш заказ PE погрузчик придется позаботиться о следующих заданий:

  • Загрузите различные части кода и данных в файле PE в отдельные блоки памяти.

  • Устранение зависимостей из таблицы импорта для загрузки DLL, от которых зависит ваш EXE.

  • Выполнение переездов.

Получение всех подробных сведений, вероятно, будет довольно привлекательной работой. Я бы предположил, что вы ищете инструмент, который вы можете купить, который делает такое шифрование EXE.

Edit: Быстрый Google предлагает вам, возможно, захотите взглянуть на следующее:

  • EXECryptor (патентованный)

  • RLPack (патентованный)

  • UPX (GPL) Насколько мне известно, это только сжатие, но вы можете использовать источник для добавления шифрования (если GPL совместим с вашими потребностями).

Обязательные инструменты, подобные этим, - это результат быстрого поиска.

Другой редактировать:

журнала MSDN была опубликована статья Мэтта Pietrek под названием "In-Depth Посмотрите в Win32 Portable Executable File Format" (Part 1, Part 2). Он содержит много информации о формате файла PE, который должен быть вам полезен. Одна интересная информация: недавние версии компоновщика Microsoft, по-видимому, по умолчанию оставляют базовые перемещения для EXE. Вероятно, вы захотите проинструктировать компоновщика, чтобы вернуть их обратно, потому что, скорее всего, ваш EXE-обертка уже загружен на ваш предпочтительный адрес загрузки полезной нагрузки EXE. Кроме того, вы можете попробовать и предоставить вашему обертке EXE экзотический предпочтительный адрес загрузки, где он, надеюсь, не будет вмешиваться в полезную нагрузку EXE.

Я также нашел page that discusses a rudimentary PE file compressor. Он, похоже, не является полностью общим, хотя, возможно, потребуется дополнительная работа, прежде чем вы сможете его использовать.

+0

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

+0

@sztomi: Я добавил несколько ссылок на дополнительную информацию. Подробнее о перемещении см. В части 2 статьи Мэтта Пьетрека. –

+0

@sztime: проект «WINE» (http://www.winehq.org/) реализовал загрузчик PE для Linux, поэтому вы, вероятно, могли бы изучить источник по крайней мере. MPlayer (http://www.mplayerhq.hu/design7/news.html) использовал какой-то код (возможно, из вина) для загрузки окон dll на платформе linux.В любом случае, это можно сделать, но если это «защита защиты от копирования», она может быть взломана, и она будет взломана, если продукт будет достаточно хорошим. Любой, у кого есть доступ к вашему exe, может (попытаться) взломать его, обойдя защиту или распакуя его. – SigTerm

4

В дополнение ко всем проблемам и правильной загрузке PE-изображения вам также нужно будет беспокоиться о Data Execution Protection, который предназначен для предотвращения этого.

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

+6

Защита исполнения данных применяется только к страницам данных; если вы выберете страницу с помощью VirtualAllocEx() с одним из флагов PAGE_EXECUTE_ *, вы сможете выполнить код из нее. –

+2

Чтобы расширить это: DEP не предназначен для предотвращения преднамеренной загрузки и выполнения кода; он предназначен для предотвращения случайного (или, скорее, злонамеренного) выполнения кода со страниц данных - например, атака переполнения буфера, которая выполняет код из стека. Создание и выполнение собственного кода «на лету» - это законное поведение. Ярким примером являются JIT-компиляторы. –

+0

Вы правы, Мартин, я посмотрел документацию DEP перед вопросом. –

1

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

Я думаю, что вы можете сделать что-то вроде:

  1. Перевозить Шифрованные длл файл с секретной сборки
  2. Зашифровать ее в каталоге TMP
  3. сделать LoadLibrary на этом
  4. Unlock DLL файл и удалить из системы?
+1

Да, вот как я это видел. Зашифрованная DLL может храниться в ваших основных ресурсах .exe. Возможно, вы также захотите помешать извлеченной DLL работать независимо, запустив ее в функции в вашем основном .exe через таблицу переходов, переданную для выполнения большинства операций. Но вы, вероятно, лучше покупаете такие вещи. – Rup

-3

Вы не можете выполнять такие данные, как код в большинстве операционных систем, благодаря gdt, глобальной таблице дескрипторов, которая делит данные с кода. Если вы пытаетесь выполнить данные, то процессор обрабатывает исключение.

+0

До недавнего времени разрешение на чтение и разрешение было одинаковым на x86. –

+0

Только потому, что операционная система не использовала GDT, поскольку это не означает, что они там, где одно и то же. Пожалуйста, проверьте себя на википедию или на спецификации Intel – Charlie

+0

GDT не может использоваться для этой цели в модели с плоской памятью (используется всеми распространенными операционными системами x86), потому что есть только один сегмент, который содержит все плоское адресное пространство. Бит NX (http://en.wikipedia.org/wiki/NX_bit) выполняет ту же задачу на уровне таблицы страниц, но был введен только с серией Prescott 5x0J (http://en.wikipedia.org/wiki/ Pentium_4) в 2004 году. –

1

Загрузчик расшифровывает данные

Это говорит, что все это на самом деле.

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

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

Возможно, это то, что вы подразумеваете под «ложным чувством безопасности»?

Как ваш клиент кажется либо упрямым, либо просто невежественным, почему бы не построить простую небольшую дешифровку, которая четко показывает недостатки в их мышлении?

+0

Код obfuscation * does * "work", хотя, предполагая, что предотвращение * некоторых * взломов заставляет некоторых людей покупать полное приложение - это вопрос угадывания, как выглядит кривая, и прикладывает соответствующие усилия. –