Сейчас на форуме: zds, UniSoft, ManHunter, rmn (+5 невидимых)

 eXeL@B —› Программирование —› Многослойное динамическое шифрование (пример полиморфного кода на C/C++)
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 16 января 2012 18:55
· Личное сообщение · #1

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

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

В идеале хотелось бы пример, который можно было
бы скопировать в файл a.cpp и запустить

c:\> g++ a.cpp && a.exe

PS. я на этом форуме новенький, мне хочется попросить
администрацию добавить к кнопкам style="cursor:pointer"
куда с этим вопросом обращаться?




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 18 января 2012 10:56
· Личное сообщение · #2

wowfactor пишет:
задача моей защиты страшно рявкнуть

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

-----
Everything is relative...




Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 18 января 2012 12:28 · Поправил: wowfactor
· Личное сообщение · #3

2 HandMill
> Надеюсь смешать код на си и ассемблере
> для вас проблем не составит

составит

я не системщик, асма не знаю и опыта
смешивания си и асма у меня пока не было

скоро мне предстоит процедура, которую
я очень боюсь - научиться выдирать код
апишных функций и инлайнить их в код своих
программ с нарушением структуры инъекции,
мешающей поиску по паттерну, но с полным
сохранением функциональности вставки

мне насколько страшна сама эта мысль,
что я даже пока думать о ней не хочу


> http://indy-vx.narod.ru/Bin/GCBE.zip

я там ничего не понял
и вообще я там ни одного сишного файла
не нашел


2 Dart Sergius
> ну или что-то типо такого мутить

а где здесь способ определения длины процедуры?
и как в этом способе зашифровать например
три функции сразу?

Code:
  1. void state() { state1(); }
  2. void state1() { state2(); }
  3. void state2() { state3(); }


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

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

2 mak
> cам не знаешь, что тебе конкретно нужно

нужно самый простой пример на си многослойного
шифрования исполняемого кода в рантайме

> даже не посмотрел похоже

я открыл статью, что такое Triple Des,
там написано - это такой шифр, я закрыл
статью и написал, что шифры не в этой
теме. что не так?

> определись с терминами

какой именно использованный мной термин
или фраза вызывает у вас многозначное
толкование?

эта тема не о стойкости криптоалгоритмов,
а о многослойности шифрования исполняемого кода

> в многослойном шифровании может использоваться
> один и тот же криптоалгоритм, а может
> и разные

для упрощения понимания многослойности
было принято решение использовать только ксор

> сюда же входит тема о комбинации криптоалгоритмов

нет, не входит
конкретно в этой отельной теме - только ксор

> Какие примеры конкретно ты хочешь увидеть? С ксором?

Code:
  1. void exeblock(void *p) { asm volatile ("call *%0"::"r"(p)); }
  2. void crypt(char*& buf)
  3. {
  4.     int count = strlen(buf);
  5.     buf[0] ^= 0x79;
  6.     for (int i = 1; i < count; i++) buf[i] ^= buf[i-1];
  7. }
  8. void decrypt(char*& buf)
  9. {
  10.     int count = strlen(buf);
  11.     for(int i = count-1; i > 0 ; i--) buf[i] ^= buf[i-1];
  12.     buf[0] ^= 0x79;
  13. }
  14.  
  15. void* pFrom; void* pTo;
  16.  
  17. void state() { state_(); }
  18. void state_()::flag--; }


я хочу чтобы кто-нибудь добавил в этом
примере строчки, которые позволят:

1. скопировать блок из двух функций
state() и state_() в кучу
и сохранить адрес в pFrom

2. там его зашифровать через crypt()
и скопировать полученную шифрованную
строку в новое место в куче и адрес
сохранить в pTo

3. потом расшифровать из pTo с помощью
decrypt() и выполнить этот блок из двух
фукнций через exeblock()



> тебе таким образом сколько примеров
> не показывай, мало будет.

одного примера вполне хватит

если вы под примером понимаете какой-нибудь
проект на 80000 LOC в котором где-то на 32500 строке
содержится пример горячего дешифрования
куска кода с последующим шифрованием,
то я не этот пример имел ввиду, когда
просил пример

мне кажется, что пример, который я прошу,
должен как-то уместиться в 20-25 строчек,
то есть что-то такое, что профессионал
может написать по памяти прямо на ходу

> c простым ксором многослойное шифрование
> можно найти в крипторах, там и будет
> нужный полиморф по условию темы

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



Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 18 января 2012 12:31
· Личное сообщение · #4

2 Vamit
> распаковывается и активируется вирус

я был на открытом семинаре отдела К
и там нам рассказывали, что создание вирусов -
это УК риски, поэтому так лучше не делать никогда



Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 18 января 2012 12:44
· Личное сообщение · #5

wowfactor пишет:
я был на открытом семинаре отдела К

Это было еще до отдела "К" и не факт, что в России.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 18 января 2012 13:54
· Личное сообщение · #6

wowfactor я б для начала тебе посоветовал, прежде чем лезьт в такие дебри почитать о способах создания само модифицируемого кода. я сделал, правда на Делфе движочек. Правда недоделал обработку некоторых комманд. Так вот этот движок, берет код, по 1ой комманде уносит его в спец. отведенную область и там ее выполняет, а а движок контролирует выполнение этой комманды (типа что на входе что на выходе). Своеобразная виртуальная машина. Не статическая не димначеская, а чтото среднее. Я это к чему веду. Я написал его на делфе. с 1ой лиш вставкой асма. Типа реально все, ток высокоуровневые языки от таких эксперементов с ума сходят.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 392.8 (мудрец), 108thx
Активность: 0.260.01
Статус: Участник
REVENGE сила, БеХоЦе могила

Создано: 18 января 2012 13:59
· Личное сообщение · #7

>научиться выдирать код апишных функций и инлайнить их в код своих программ
> с нарушением структуры инъекции, мешающей поиску по паттерну, но с полным
> сохранением функциональности вставки

Эх, опять фигней страдаете. Такого добра в современных протекторах полным полно. И обходится так же элементарно. Как правило каждая АПИ вызвает еще АПИ, которые в свое время все равно могут быть переловлены. К примеру если вы полностью выдерите апи функцию CreateFileA и сделаете ее невидимой для взломщика, то ему не составит труда переловить ZwCreateFile, которая вызывается из CreateFileA и которую уже никак не проэмулируешь, потому что это низкоуровненвая процедура, не используемая в языках высокого уровня.

-----
StarForce и Themida ацтой!


| Сообщение посчитали полезным: vden


Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 18 января 2012 14:12 · Поправил: OKOB
· Личное сообщение · #8

wowfactor пишет:
я хочу чтобы кто-нибудь добавил в этомпримере строчки, которые позволят


strlen работать не будет, т.к. в коде как криптованом так и нет могут быть нули (признак конца С строки)

430a_18.01.2012_EXELAB.rU.tgz - zzz.RAR

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: wowfactor


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 18 января 2012 14:17
· Личное сообщение · #9

wowfactor пишет:
мне кажется, что пример, который я прошу,
должен как-то уместиться в 20-25 строчек,
то есть что-то такое, что профессионал
может написать по памяти прямо на ходу

Нужно размапить PE файл, а это не 25 строчек, говорю же основ не знаешь. Скачай с офсайта ASProtect, у него прямо с EP начинается многослойное дешифрование загрузчика, слоев 6-8. Если не понимаешь в дизасме и отладке машинных команд, то пример на Си тоже тебе ничего не даст, т.к. результаты можно будет увидеть только в дизасме/отладчике.

-----
Yann Tiersen best and do not fuck


| Сообщение посчитали полезным: ClockMan

Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 18 января 2012 14:18
· Личное сообщение · #10

wowfactor пишет:
1. скопировать блок из двух функций
state() и state_() в кучу
и сохранить адрес в pFrom


ну бери и копируй, в чём сложность?

Code:
  1. _asm mov eax, offset state


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

wowfactor пишет:
2. там его зашифровать через crypt()
и скопировать полученную шифрованную
строку в новое место в куче и адрес
сохранить в pTo

тоже самое, копируешь, я бы выделил память VirtualAlloc (либо malloc) и копировал уже туда.
С расшифровкой тоже самое.

Может я чёт не так понял, но причём тут шифрование я хз, закриптовать ты и сам знаешь как...асм учи.



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 18 января 2012 14:49 · Поправил: vden
· Личное сообщение · #11

wowfactor пишет:
чувак, я ни хрена не понял, что ты сказал,


ну подразумевалось закинуть exe в IDA и потрейсить с адреса 510754.
имхо, если проблемы с асмом и дизасмом, то пока рановато защиты делать.

все же если интересно, то вот мой примитивный сорс (на Delphi)
7c31_18.01.2012_EXELAB.rU.tgz - example.dpr




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 18 января 2012 14:49 · Поправил: OKOB
· Личное сообщение · #12

CodeBreakers Magazine Vol.1, No 2, 2006,
автор Giovanni Tropeano
статья Self Modifying Code

http://www.scribd.com/doc/47681501/65-276-1-PB

или

книга C/C++ Secure Programming
автор Gene Spafford
глава 12. Anti-Tampering
раздел 12.17 Using Self-Modifying Code

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: VodoleY

Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 18 января 2012 17:14
· Личное сообщение · #13

2 VodoleY
> почитать о способах создания само модифицируемого кода

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

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

> я сделал, правда на Делфе движочек

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

2 Maximus
> все равно могут быть переловлены

1. я осознаю риски о которых вы пишите

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

плюс задача-то у меня простая: поставить
защиту, которую нельзя снять с помощью
туториала, а можно снять только с помощью
своей головы

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

я не собирался фейковать createfile,
потому что этот вызов отлично смешивается
с "нормальными" созданиями файлов,
а вот getfiletime - это слишком
явный редкий вызов, который хотелось бы
свести к набору каких-нибудь других вызовов,
которых в обычной программе дофига

getsystemtime всем хорош, но он отлючается
слишком уж просто: достаточно часы отмотать

> никак не проэмулируешь, потому что это
> низкоуровненвая процедура, не используемая
> в языках высокого уровня

я не знаю пока как решается эта задача

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

я в эту тему пока даже не вникаю -
это надо отдельное время и отдельные
нервы

2 OKOB
> 430a_18.01.2012_EXELAB.rU.tgz - zzz.RAR

Аллилуя, господи!!! Аллилуя!!!

не понятно только зачем двойную память
выделяем, а так - Аллилуя!!!

> если не понимаешь в дизасме и отладке
> машинных команд, то пример на Си тоже
> тебе ничего не даст, т.к. результаты можно
> будет увидеть только в дизасме/отладчике.

ну отчего же? я же смог понять пример OKOB'а
оказалось, что кастинг сигнатуры функции
дает адрес начала блока, а для вызова любого
raw-куска достаточно скастить void* указатель
к указателю на функцию - вот и вся кухня
с полиморфным шифрованием в рантайме

> _asm mov eax, offset state

зачем? оказалось все проще (int*)state

> я чёт не так понял, но причём тут шифрование

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

2 vden
> вот мой примитивный сорс (на Delphi)

спасибо, но я на нем не шарю
как-то не сложилось у меня с ним

2 OKOB
> http://www.scribd.com/doc/47681501/65-276-1-PB

the length of the body of a function is equal
to thedifference between the pointer to the function
and thepointer to the function following it. Easy!

ну почему такие статьи хрен найдешь
через гугл, а только через общение, блин!

====


короче, какие у меня были вопросы о принципе
многослойности шифрования я их получил
через пример OKOB'а и статью этого Джованни

спасибо всем, кто помогал мне при записи
этого альбома



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 18 января 2012 19:03 · Поправил: VodoleY
· Личное сообщение · #14

wowfactor На самом деле все просто. код можно сделать модифицируемым не так многими спосабами.
1. выполнять в стеке (там секция с досупом на чтения и запись)
2. выделять область памяти и VirtualProtectom изменять доступ
3. с помью MapedFile (им я и пользуюсь обычно)
И ПРОЧИТАЙ ТО ЧТО ТЕБЕ ОКОВ подогнал.
З.Ы. есть еще более извращенные способы. но и этого с головой
З.Ы.Ы, про 7ку точно не знаю, в ней вроде запретили код в стеке выполнять.
про модификацию кода у Касперского Криса пару неплохих и легеньких статей.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 10.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 19 января 2012 00:58
· Личное сообщение · #15

2 VodoleY

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

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

не знаю кому как, а мне маллока хватит
с головой

спасибо ОКОВу ещё раз



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 19 января 2012 01:49
· Личное сообщение · #16

wowfactor пишет:
задача текущей темы не peloader'ы изучать,а многослойность, то есть не сложностьстроковых декрипторов, а полифорфизмисполняемого кода в рантайме средствами си


То есть какой-то сферический конь в вакууме. Реальную проблему удержания кода в рабочем виде - кому оно надо

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 19 января 2012 06:00
· Личное сообщение · #17

wowfactor пишет:
так, блин, в этом-то и вопрос!
где можно прочитать про самомодифицирующийся
исполняемый код с изложением на си (а не на дельфи)
начиная с самых-самых простых примеров

ехх
нет у вас полёта мысли

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



Ранг: 5.0 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 19 января 2012 10:12
· Личное сообщение · #18

Забавный тред. Знаний у ТС ноль в нужном направлении, платить кому то - не хочется, а самому разбираться и писать - лениво. И активное обсуждение при этом.

| Сообщение посчитали полезным: HandMill


Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 19 января 2012 10:39
· Личное сообщение · #19

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

| Сообщение посчитали полезным: Maximus, [-alex-], DimitarSerg, SReg, HandMill, _ruzmaz_, Dart Sergius, hlmadip
<< . 1 . 2 .
 eXeL@B —› Программирование —› Многослойное динамическое шифрование (пример полиморфного кода на C/C++)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати