Security Teams



:::
  Ответ в темуСоздание новой темыСоздание опроса

> Криптование бинарников
Nickolas
Дата 31.05.2006 - 12:30
Цитировать сообщение
Offline



Specialist
****

Профиль
Группа: -users-
Сообщений: 467
Пользователь №: 2842
Регистрация: 16.02.2006



Рейтинг:
(0%) -----


Народ, кто-нть занимался сабжем?
Интересует порядок не сколько криптования, а декриптования и исполнения программ. Каким образом сие лучше реализовать?

Есть вариант следующий: в бинарнике или где-нть находится прелоадер, который декриптует зашифрованый кусок и передаёт нему управление. Но тут есть следующие нюансы:
1. Анитвирус может "поймать" приложение на этапе перед выполнееием закриптованного кода (в случае, если незакриптованный бинарник воспринимается как вирус);
2. Полностю декриптованный код может быть "сдамплен" и дизассемблирован (в случае, когда бинарник криптуется для того, чтобы защитить программу)

Какие ещё есть варианты или как можно обойти вышеописанные проблемы?


--------------------
И придут демоны, и будет имя им BSD
PM
Top
sqee
Дата 1.06.2006 - 15:56
Цитировать сообщение
Offline



Fanat
***

Профиль
Группа: -vip-
Сообщений: 399
Пользователь №: 661
Регистрация: 31.05.2005



Рейтинг:
(20%) X----


Nickolas
На счёт первой проблеммы. Твой прелоадер наверняка будет определятся как вирус ибо техника его инкапсуляции в бинарник и начальные этапы работы от оных отличатся не будут абсолютно. Выход: придумать алгоритм инкапсуляции постороннего кода в бинарник ещё не известный писателям антивирей wink.gif megalol0.gif

Полностью решенить вторую проблемму фактически невозможно, но можно оч-чень усложнить жизнь тому кто будет ломать твою прогу cheezy.gif

ЗЫ Необходимо уточнение условия задачи: криптованный бинарник должен запускаться на любой не подготовленной заранее машине?


--------------------
Объективная реальность есть бред вызванный недостатком алкоголя в крови.
PMПисьмо на e-mail пользователюICQ
Top
Nickolas
Дата 1.06.2006 - 19:25
Цитировать сообщение
Offline



Specialist
****

Профиль
Группа: -users-
Сообщений: 467
Пользователь №: 2842
Регистрация: 16.02.2006



Рейтинг:
(0%) -----


1. На данный момент у меня есть несколько вариантов написания прелоадеров wink.gif Меня интересует на сам прелоадер, а вероятность обнаружения антивирусами декриптованного кода.

2. Проблемма "дампа процесса" также решается, вопрос в том, как это лучше реализовать. Тут всё намного проще: если программу проще купить чем взломать, то зачем платить больше?! megalol0.gif

3. Что ты имеешь ввиду под "не подготовленной заранее"


Меня интересует какие варианты существуют на данный момент. Возможно кто-то уже занимался этим вопросом и может ответить на мои вопросы


--------------------
И придут демоны, и будет имя им BSD
PM
Top
drmist
Дата 1.06.2006 - 21:41
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Цитата
Возможно кто-то уже занимался

Ну в таком случае я попытаюсь дать наиболее развернутый ответ на твой вопрос.

Классическое шифрование бинарника заключается в слудующем - зашифровать код и данные, добавить декриптор (в конце существующей секции, в PE-Header'е или создать новую секцию и поместить декодер туда), изменить точку входа на декодер.
В результате при запуске программы управление передается декодеру, он расшифровывает код и данные и передает управление в старую точку входа.

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

Решаются проблемы следующим образом:
1) Добавляются противодебагерные приемы
С лету я могу вспомнить следующие приемы
а) антитрассировка
Трассировкой называется отладка программы, когда выполнение программы прирывается после выполнения каждой ассемблерной команды.
Как правило, реверс инженеру неудобно входить внутрь подпрограмм, то есть когда встречается команда call перед ним встает выдор - перейти по соответствующему адресу, или поставить брекпоинт вслед за call'ом и дождаться завершения функции. Как правило, исследователь выбирает второе, ибо в программе может быть десяток вложенных call'ов и входить внутрь каждой процедуры - удовольствие ниже среднего. Воспользоваться этим можно следующим образом. Рассмотрим код

push param1
push param2
..
push paramn
call function
nop
nop
.............
function:
pop eax ; адрес возврата
pop eax ; paramn
....
pop eax ; param1

jmp point_that_we_nead
............
point_that_we_nead:
..........

Когда отладчик дойдет до команды call, пользователь предпочтет поставить бряк вслед за ней, однако функция извелчет из стека параметры и адрес возврата и продолжет нормальное выполнение программы, в результате бряк никогда не сработает.
2) SEH
SEH - это встроенная система контроля ошибок во время выполнения программ в операционной системе Windows. Суть в том, что если в программе происходит ошибка (деление на 0, обращение к недоступной памяти), программа не вылетит, а передаст управление в предварительно указанною точку.

[добавляем процедуру обработки ошибок в цепочку SEH]
[всякий мусор]
[вызываем ошибку]
[мусор]
[процедура обработки ошибок, продолжаем работать как ни в чем не бывало]

Это не самый хороший способ защиты, но начинающие крякеры не способны с ним справится. Кроме того, наложение такой защиты в три слоя может вызвать некоторые проблемы.
3) Замерение времени.
При выполнении в дебагере программа работает значительно медленней, чем в обычных условиях. Периодически замеряя текущее время с помощью команды rdtsc или API-функции GetTickCount, что позволяет определить присутствие отладчика. Как только он обнаружен, можно незаметно перейти на левую процедуру и заставить реверс инженера разрывать тонны SEH. Реализвать на практике сабж не просто, зато если удастся, то такая защита может оказаться очень эффективной.

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

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

Также можно делать такие гадости, как херить PE-Header и таблицу импорта в памяти, но это не очень эффективно.

В случае защиты ПО есть еще один интересный прием.
С его помощью для того, чтобы закейгенить или пропатчить программу НЕОБХОДИМО иметь хотябы один валидный серийник (также следует обойти привязку к железу, если токавая имеет место быть).
Это реализуется так: пусть вся программа зашифрованна ключем K.
Тогда серийник для пользователя U на машине M будет Hash(U+M) ^ K, где символ ^ обозночает жегалкинское сложение (также эта операция известна под названием xor). Тогда если пользователь вводит правильное сочитание имени и серийника, то мы автоматом получаем K=Hash(U=M) ^ S и расшифровываем программу, в противном случае это сделать невозможно.

Взгляните на начало поста. Это мы разобрали только классическое шифрование. Более продвинутое заключается в следующем.
Возьмем exe-шник. Похерим таблицу импорта и PE-заголовок, упакуем и зашифруем его, как обычный бинарный файл. А затем создадим программу со значительно отличающимся Image Base(*). Она должна
1) Выделить память по Image Base зашифрованного файла, образы программы и лоадера в памяти не должны пересекаться, для этого необходимо условие (*).
2) Расшифровать, распаковать программу
3) Настроить таблицу импорта (и релоки, если есть)
4) Передать управление в Entry Point программы.

Такая защита использовалась в моем crackme для нубов, настоятельно рекомендую прогнать в дебагере, завораживающее зрелище )) К сожалению, упаковщик был безвозвратно утерян....

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

Говорить на эту тему можно бесконечно (ёпаресете, на статью потянет....).
Настоятельно рекомендую почитать статьи с wasm.ru. Могу без преувеличения сказать, что 90% своих знаний по этому вопросу я вынес оттуда.


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
Nickolas
Дата 2.06.2006 - 11:49
Цитировать сообщение
Offline



Specialist
****

Профиль
Группа: -users-
Сообщений: 467
Пользователь №: 2842
Регистрация: 16.02.2006



Рейтинг:
(0%) -----


drmist
Сенкс огромный!

С меня пиво =))


--------------------
И придут демоны, и будет имя им BSD
PM
Top
biatuib
Дата 6.04.2010 - 15:06
Цитировать сообщение




Unregistered












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

Опции темы Ответ в темуСоздание новой темыСоздание опроса