Сейчас на форуме: 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"
куда с этим вопросом обращаться?




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

Создано: 16 января 2012 19:32 · Поправил: Maximus
· Личное сообщение · #2

Многослойное шифрование есть почти в любом коммерческом протекторе (кроме пожалуй говновмпротекта). Вряд ли есть пример кода на паблике. Обходится крякерами элементарно и не оправдывает затраченного времени на программирование. Как пример могу привести обход двухслойного шифрования у темиды:
http://www.exelab.ru/f/action=vthread&forum=13&topic=19415
(раздел InLine Themida)

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

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




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

Создано: 16 января 2012 21:58
· Личное сообщение · #3

> раздел InLine Themida

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

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

Code:
  1. int flag = 2;
  2. void enok() { ::flag--; }
  3. void exam() { int die[1]; int p = die[::flag]; }


как на этом простом примере средствами си
можно продемонстрировать минимальное
двойное шифрование кода (например, ксором)

то есть хочется увидеть не как многослой
выглядит в дебаггере, а как он выглядит
на си

> когда программа сама себя полностью расшифрует.

что я понял из мануалов:

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

2. в любой момент времени программу важно
экпонировать в память лишь частично актуальной

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

> просто перехватят ваш первый вызов API

3. самое уязвимое место крякера - это
тоже самое, что и самое уязвимое место
обычного разработчика - тесты, т.е. приемка
изделия заказчиком

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

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

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

идеальаня защита - это когда крякнутая
программа работает в 90% случаев

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

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

имхо, конечно




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

Создано: 16 января 2012 22:15
· Личное сообщение · #4

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

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

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




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 17 января 2012 01:41
· Личное сообщение · #5

Полнейший наглый оффтоп. Пламенный привет Арчеру...
wowfactor
Так сойдет:

<img src="./img/button_url.gif" width="23" height="23" border="0" alt="Вставить ссылку" style="cursor: pointer; cursor: hand;" onmouseover="window.status='Вставить ссылку'; return true" onmouseout="window.status=''; return true" onclick="JavaScript:di('[url=',']--> Link <--[/url]');" />

?

P.S. Сдул концепт у Лебедева.



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

Создано: 17 января 2012 03:16 · Поправил: wowfactor
· Личное сообщение · #6

> человек достаточно отдаленный от крекинга

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

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

вы как бы исходите из предположения, что типа
я утверждаю обратное. вы думаете, что я типа
не в курсе, что в принципе лечится все

так вот: я в курсе

> при должном опыте крякера лифт приезжает
> на 12 этаж в 100 случая из ста

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

сознательно
пишешь
баг


лично мне эта концепция взрывает мозг

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

это высшая планка

$500 за работу
$1 - за удар молотка
$499 - за знание куда и как ударить

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

> самых мощных на сегодняший день протекторов

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

> при должной популярности программы (готов
> побиться на 1000 рублей)

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

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

2 int
> Так сойдет?

конечно! супер!

странно, что на кнопках редактора их сделали,
а на самой нажимаемой кнопке "Отправить сообщение"
не сделали. даже на кнопке SSL сделали ...

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

вот ещё до кучи
долго объяснять - проще было сразу накатать

Code:
  1. function wikinice($out)
  2. {
  3.     // .whoseQuote, .quote { width: 60%; margin: 0; padding: 5px; }
  4.     // .whoseQuote {  background:#BFC3C6; font-weight:bold; }
  5.     // .quote { background:#CFD3D6; font-size: small }
  6.     
  7.     $out = preg_replace("/^2 (.+)$/im", "<div class='whoseQuote'>$1</div>", $out);
  8.     $out = preg_replace("/^> ?(.*)$/im", "<div class='quote'>$1</div>", $out);
  9.     return $out;
  10. }



> P.S. Сдул концепт у Лебедева.

я не знал, что это его идея

у нас в екате другую его идею обожают:
при наведении на ссылку она становится красной



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 17 января 2012 03:29
· Личное сообщение · #7

wowfactor пишет:
я не знал, что это его идея

Ну не то чтобы его идея, просто нашел хорошее объяснение целесообразности такого приема (вот линк, кстати статья не самого Лебедева, а человека из его команды).

wowfactor пишет:
странно, что на кнопках редактора их сделали,
а на самой нажимаемой кнопке "Отправить сообщение"
не сделали. даже на кнопке SSL сделали ...

Форум создавался на базе miniBB допиливанием его разными людьми (в итоге от miniBB, кроме внешности, мало что осталось), у которых либо было мало времени, либо мало опыта и у них (у нас ) разные стили HTML-верстки и методов программирования логики. Поэтому, понятное дело, применялась копи-паста, встречается разностильный код, а рефакторинг откладывается каждый раз (только время появится, и тут же как на зло, время забирает что-то другое).

P.S. Беседу по поводу движка лучше перенести в отдельный тред или Личные Сообщения, если будем дальше продолжать.




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

Создано: 17 января 2012 10:00 · Поправил: Maximus
· Личное сообщение · #8

>я не крекрер, я прикладной программист
Не поверишь, я тоже прикладной программист с почти 20 летним стажем

>сознательно пишешь баг
и вот этим я занимаюсь как раз все 20 лет

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

>потому что на каждый протектер уже есть туториал
А вот это правильный совет, все именно так и обстоит

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

Я уже старожил этого форума, я видел тут даже профессионалов, писателей сильных защит, которые сначала тут гнали понты и которых потом тутошние ребята опускали по полной (можешь поискать тут по слову ExeCryptor). Так что совет тебе от старого программиста:
Брось ты это дело и займись написанием и улучшением прикладной программы, а не защиты ее.

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


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

Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 17 января 2012 12:04 · Поправил: SergX
· Личное сообщение · #9

Maximus не одобряет защиты ))

В данном топе Maximus решил показать мастер класс и ломануть софтинку прямо в сознании разраба. Нейролингвистический реверс так сказать )))

| Сообщение посчитали полезным: _ruzmaz_, PE_Kill, daFix

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

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

> Беседу по поводу движка лучше перенести в отдельный
> тред или Личные Сообщения, если будем дальше продолжать.

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

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

а пожелания типа
Code:
  1. $out = preg_replace("/\*\*(.*)\*\*/isU", "<b>$1</b>", $out);

это сликшом индивидуально, поэтому про них
лучше помолчать

> пойми простую вещь

все, что вы написали по этому поводу
правда и я это отлично осознаю

> сначала тут гнали понты

это опять все разновидности веры
в принципиальную возможность реальной
защиты

> есть этот форум, есть рубоард

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

2 SergX
> ломануть софтинку прямо в сознании разраба

я именно это и имел ввиду: написание защиты
в голове туториалного краякера-одногодки

просто кадры типа Maximus'a за 20 лет крякания
забыли что такое страх и думают, что все
такие смелые как они

= = = = = = = = = = = = = = = = = = = = = = = = = = = =

> я буду ковырять ваши слои

мой изначальный вопрос актуален до сих пор

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




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

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

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

Не совсем верно, имхо. Т.к. это например некоторых это только лишь бы подзадорило "довести дело до конца".
Я бывает пишу киген к какой нить никому не нужной проге неделю. т.к. "зацепила" защита. Написал - поклацал - удалил и забыл. Даже бывает расстроился немного, что квест заончился.



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

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

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

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

формулировал ребёнок с отсутствием малейших понятий о машинном коде. wowfactor, в одном лишь си жизни нет, ещё вроде как никто не слепил компилятор си, который бы генерировал базонезависимый код, не говоря уже о с++. Как только такое появится хоть в одном компилере - можно будет подумывать о каком-то там "многослойном шифровании кода", но прямиком из-под компиля такого не видать. Каждый разработчик таких защит клепает свой комбайн самостоятельно: из си и ассемблера. И для многослойной упаковки утилиты разработчиков проходятся по откомпилированному коду не один раз. Прям хлебопечку хочешь - пхай в неё си, а она тебе на выход многослойно упакованный код))) Можно смело закрывать топик, поскольку с тобой никто кодом не поделится ввиду того что кода на одном лишь си нет, и надеюсь ты понял, что быть не может. Могут быть лишь собственные инструменты, пойди на форум Themida'ы или StarForce поклянчи там, может дадут.

-----
все багрепорты - в личные сообщения





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

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

HandMill пишет:
вообще суть вопроса не понятна

Просто ТС не знает основ. Он хочет написать код на Си, чтобы он был многослойно пошифрован, т.е. не прибегая к внешним утилитам, что невозможно. Нужно написать код, проставить маркеры, внешней утилитой найти маркеры и пошифровать, дописать дешифровщики или сразу воткнуть их в код через дефайны. Если линкуется с динамической базой, то еще и релоки учесть. Короче понт это всё, писать довольно трудоемко, а дешифровать в несколько минут.

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





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

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

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




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

Создано: 17 января 2012 15:45 · Поправил: gloomdemon
· Личное сообщение · #15

HandMill пишет:
ещё вроде как никто не слепил компилятор си, который бы генерировал базонезависимый код, не говоря уже о с++. Как только такое появится хоть в одном компилере - можно будет подумывать о каком-то там "многослойном шифровании кода", но прямиком из-под компиля такого не видать.


Упс, а разработчики gcc и binutils наверное с перепоя добавили -fPIC, -fPIE, -pic, -pie, а потом и забыли про него:

root[lib1]# cat exe_pie.c
/*
* exe_pie.c
*/

#include <stdio.h>
#include <stdlib.h>

/*
*
*/
int main(int argc, char** argv)
{
printf("exe_pie\n");

return (EXIT_SUCCESS);
}

компиляем: cc -g -ggdb -Wall -Wl,-rpath,. -pie -fPIE -o exe_pie.ex exe_pie.c
смотрим в иде:

; Attributes: bp-based frame

public main
main proc near
lea ecx, [esp+4]
and esp, 0FFFFFFF0h
push dword ptr [ecx-4]
push ebp
mov ebp, esp
push ebx
push ecx
call $+5
pop ebx
add ebx, 1204h
sub esp, 0Ch
lea eax, (aExe_pie - 16F4h)[ebx] ; "exe_pie"
push eax ; s
call _puts
add esp, 10h
mov eax, 0
lea esp, [ebp-8]
add esp, 0
pop ecx
pop ebx
pop ebp
lea esp, [ecx-4]
retn

Я этого не вставлял: call $+5, pop ebx

Без -pie -fPIE:

; Attributes: bp-based frame

public main
main proc near

var_4= dword ptr -4

lea ecx, [esp+4]
and esp, 0FFFFFFF0h
push dword ptr [ecx-4]
push ebp
mov ebp, esp
push ecx
sub esp, 4
sub esp, 0Ch
push offset s ; "exe_pie"
call _puts
add esp, 10h
mov eax, 0
mov ecx, [ebp+var_4]
leave
lea esp, [ecx-4]
retn

Это пример для x86, с x86-64 еще проще. Собственно все либы, под тот же линукс, давным давно уже компиляются обязательно с -fPIC =) и никаких релоков.

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

Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 17 января 2012 15:59
· Личное сообщение · #16

gloomdemon call _puts уж как-то очень просто, вам не кажется что такое необходимо предусматривать? Из второго листинга что за "var_4= dword ptr -4"? Теперь о _puts ещё чуток: другое дело если бы генерился код который в рантайме искал бы эту функцию и вставлял на место _puts нужный адрес. Необходимо ещё проверить доступен ли этот адрес на запись в памяти. В приведенном коде этого нет. Вывод - код не готов для переноса в другой бинарник.
разработчикам gcc и binutils привет!
gloomdemon пишет:
Собственно все либы, под тот же линукс, давным давно уже компиляются обязательно с -fPIC =) и никаких релоков.

Если всё так просто, почему же вы не помогаете ТС в решении изначально поставленной задачи?

-----
все багрепорты - в личные сообщения




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

Создано: 17 января 2012 16:12 · Поправил: gloomdemon
· Личное сообщение · #17

HandMill пишет:
call _puts уж как-то очень просто, вам не кажется что такое необходимо предусматривать?


Можно конечно потроллить такой вопрос, ведь вы очень невнимательно прочитали что я написал, ведь не просто так написал про то что все либы под линукс, компиляются с -fPIC, т.е. они базо-независимы и можно просто к опциям добавить -static, и libc + libdl будут слинкованы статически, правда в данном примере будет небольшой интересный побочный эфект.

Так же, можно взять libc, взять оттуда код dlopen, dlsym, и самому что надо ручками подгружать:

void (*ctest1)(int *);

lib_handle = lib_open("lib1.so", LIBS_LDEFAULT | LIBS_EPROCESS);

if (!lib_handle)
exit(1);
if (!lib_symbol(lib_handle, "ctest1", LIBS_EPROCESS, (void**)&ctest1))
exit(1);

lib_open обертка над dlopen, lib_symbol - dlsym

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


не вижу смысла генерировать некий код в рантайме если он есть в libc, или тупо можно оттуда взять его сырцы, и этот код за меня все проверяет.

HandMill пишет:
Из второго листинга что за "var_4= dword ptr -4"?


второй листинг для примера, без -fPIE, т.е. без генерации базонезависимого кода, что "var_4= dword ptr -4" не смотрел, как ида сгенерила по умолчанию так и скопипастил

HandMill пишет:
Если всё так просто, почему же вы не помогаете ТС в решении изначально поставленной задачи?


И что ему написать? Посоветовать скомпилить код, который нужно зашифровать, в объектник, потом код в объектнике пошифровать два раза ксором (желательно не одним и тем же числом) и потом прилинковать его к декриптору? Ну так это выше уже посоветовали.

ЗЫ

Решил еще добавить, что бы было понятно почему написал gcc и binutils, т.к. импорт (+секции и т.д.) разруливает линкер, то gcc туда не лезет, и просто компилит код который облегчает линкеру работу, т.е. из примера выше, код в объектнике получается следующий:

.text:08000000 ; Attributes: bp-based frame
.text:08000000
.text:08000000 public main
.text:08000000 main proc near
.text:08000000 lea ecx, [esp+4]
.text:08000004 and esp, 0FFFFFFF0h
.text:08000007 push dword ptr [ecx-4]
.text:0800000A push ebp
.text:0800000B mov ebp, esp
.text:0800000D push ebx
.text:0800000E push ecx
.text:0800000F call $+5
.text:08000014 pop ebx
.text:08000015 nop ; PIC mode
.text:08000016 mov ebx, offset _GLOBAL_OFFSET_TABLE_
.text:0800001B sub esp, 0Ch
.text:0800001E nop ; PIC mode
.text:0800001F mov eax, offset s ; "exe_pie"
.text:08000024 push eax ; s
.text:08000025 call puts ; PIC mode
.text:0800002A add esp, 10h
.text:0800002D mov eax, 0
.text:08000032 lea esp, [ebp-8]
.text:08000035 add esp, 0
.text:08000038 pop ecx
.text:08000039 pop ebx
.text:0800003A pop ebp
.text:0800003B lea esp, [ecx-4]
.text:0800003E retn

.rodata:08000045
.rodata:08000045 ; Segment type: Pure data
.rodata:08000045 ; Segment permissions: Read
.rodata:08000045 _rodata segment byte public 'CONST' use32
.rodata:08000045 assume cs:_rodata
.rodata:08000045 ;org 8000045h
.rodata:08000045 ; char s[]
.rodata:08000045 s db 'exe_pie',0
.rodata:08000045 _rodata ends
.rodata:08000045

extern:08000054
extern:08000054 ; Segment type: Externs
extern:08000054 ; extern
extern:08000054 extrn _GLOBAL_OFFSET_TABLE_
extern:08000058 ; int puts(const char *s)
extern:08000058 extrn puts:near
extern:08000058
extern:08000058
extern:08000058 end

Тут, можно сказать, даже метки уже для криптора и разруливания им импорта есть =)



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

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

2 SReg
> некоторых это только лишь бы подзадорило

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

2 HandMill
> вообще суть вопроса не понятна

в чем отличие трехслойного от пятислойного шифрования?

> но прямиком из-под компиля такого не видать

я не ставил условие прямиком из компиля
меня интересует сама суть слоёв

что такое многослойное?

> клепает свой комбайн самостоятельно: из си и ассемблера

> для многослойной упаковки утилиты разработчиков
> проходятся по откомпилированному коду не один раз

> она тебе на выход многослойно упакованный код)))

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

> ввиду того что кода на одном лишь си нет

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

> могут быть лишь собственные инструменты,
> пойди на форум Themida'ы или StarForce
> поклянчи там, может дадут

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

2 PE_Kill
> он хочет написать код на cи, чтобы он
> был многослойно пошифрован, т.е.
> не прибегая к внешним утилитам

нет, я этого не говорил

я упоминул си лишь потому, что если бы
кто-то стал бы мне объяснять отличие
трех- от пятислойного шифрования например
на дельфи или на питоне, то я бы не понял,
ибо знаю только C/C++, пых и яваскрипт
я даже перл за 10 лет забыл

> 1. написать код
> 2. проставить маркеры
> 3. воткнуть дешифровщики через дефайны
> 4. внешней утилитой найти маркеры
> 5. пошифровать

это один слой или на п.5. образуется
многослойное шифрование?

> короче понт это всё, писать довольно
> трудоемко, а дешифровать в несколько минут

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

хватит крякать мой мосск

2 gloomdemon
> скомпилить код, который нужно зашифровать,
> в объектник, потом код в объектнике
> пошифровать два раза ксором (желательно
> не одним и тем же числом) и потом
> прилинковать его к декриптору

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



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

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

wowfactor пишет:
ага!!! неужели трехслойное шифрование -
это тройной проход ксором, а пятислойное -
это пройти ксором пять раз? и из-за этого
столько вони про многослойность????!!!!
я в шоке!!!


Эм, я даже не знаю что ответить, наверное так http://tinyurl.com/7tj95pm

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

Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

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

Ок, чувак, поясняю что нужно: пишем простой peloader(по запросу в гугле найдёшь массу исходников, в том числе и на с/с++), затем пихаешь в него (бинарно) целевую программу(калькулятор например), компилируешь, получаешь калькулятор внутри лоадера, при запуске должно работать, если не работает - лоадер не годный. Затем перегоняешь полученный ЕХЕ в дамп для с/с++, вставляешь его в код лоадера, компилируешь. Вот тебе уже двойное шифрование. Далее - дело итераций. Какими ключами шифровать - вопрос каждого билда.

-----
все багрепорты - в личные сообщения




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

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

wowfactor
Если попробовать объяснить просто, то несколько слоев распаковки это когда:
один код распаковывает другой, переходит на него, распаковывает третий, переходит на него и т.д.
Чтобы побольше возни реверсеру.

Вот сгенерировал задачку, чтобы наглядно показать.
Code:
  1. .text:00510754 _TForm1_Button1Click proc near          
  2. .text:00510754  call    Layers
  3. .text:00510754 _TForm1_Button1Click endp


Задача получить сообщение You Win.
Слоев 100.

b99e_17.01.2012_EXELAB.rU.tgz - prot1.7z

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

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

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

vden пишет:
Вот сгенерировал задачку, чтобы наглядно показать.

Действительно, очень секретный код

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

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

Создано: 17 января 2012 20:22
· Личное сообщение · #23

> http://tinyurl.com/7tj95pm


ай молодца!

2 HandsMill
> 1. пишем простой peloader

в контексте обсуждаемой темы peloader -
это такая разновидность дешифратора (декриптера)

верно?

> 2. затем пихаешь в него (бинарно) целевую программу

в контексте темы, на си - речь идет о содержимом
exe файла сконвертированного в сишную строку
литеральным хексом

Code:
  1. const char* strexe = "\x4D\x5A ... ";


верно?

> 3. затем перегоняешь полученный ЕХЕ в дамп для с/с++

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

> 4. вставляешь его в код лоадера, компилируешь.

> вот тебе уже двойное шифрование

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

это всё равно что заархивировать бинарник
винраром в sfx, потом полученный архив ещё
раз заархивировать, потом ещё раз

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

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

короче, пример понятен, но по-моему он какой-то
не совсем аутентичный ...

2 vden
> один код распаковывает другой,
> переходит на него,
> распаковывает третий,
> переходит на него и т.д.

вот это уже что-то больше похоже на по теме

осталось только надыбать где-нибудь
пример, как можно например, простейшую
операцию инкремента глобальной переменной

Code:
  1. ::flag--;


трехслойно расшифровать, а потом пятислойно
зашифровать, а при следующем обращении пятислойно
расшифровать, а потом опять однослойно зашифровать

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

Code:
  1.       
  2. // крип
  3. count = strlen(buf);
  4. buf[0] ^= 0x79;
  5. for (int i = 1; i < count; i++) buf[i] ^= buf[i-1];
  6.  
  7. // декрип
  8. len = strlen(buf);
  9. for(int i = count-1; i > 0 ; i--) buf[i] ^= buf[i-1];
  10. buf[0] ^= 0x79;



> Вот сгенерировал задачку, чтобы наглядно показать.

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




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

например, если я хочу, чтобы когда он распакует
второй слой, то смог бы прочитать: "молодец, два
слоя распаковано, осталось ещё три. вперед и с песней!"

где лучше всего эту строку разместить?



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 17 января 2012 20:35
· Личное сообщение · #24

1. Нет, это загрузчик исполняемых файлов формата PE (portable executable)
2. Верно
3. Верно
4. Нет, не совсем таки уж вложенных самораспаковывающихся архивов. Так как всё происходит в контексте одного процесса. Но если рассматривать что процесс - архив, то да. Ярлык и батник - лишние файлы в системе. При работе peloader'а не происходит никаких извлечений файлов на диск, всё в памяти. Только у вас видимо до сих пор ещё голова не хочет работать на то что в процессе распаковки можно как-то модифицировать "распаковываемые файлы"(или до упаковки ещё их модифицировать), так что бы они находясь в таком виде на диске не работали.

Код простенького(не подходящего для демонстрационного примера задачи) лоадера: http://it-talk.org/topic2161.html
Но вы ведь знаете с++? сможете переписать это для примера в котором происходила бы работа с памятью?

Более крутые лоадеры можно найти на этом сайте: http://indy-vx.narod.ru/log.txt

Автор, сперва научись программы ломать, потом уж защиты писать берись

-----
все багрепорты - в личные сообщения




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

Создано: 17 января 2012 21:59 · Поправил: wowfactor
· Личное сообщение · #25

> Нет, это загрузчик исполняемых файлов формата PE (portable executable)
> Ярлык и батник - лишние файлы в системе

HandMill, sfx архив, ярылки и батники -
это всё были метафоры, а вы поняли их буквально.
извините, что ввел вас в заблуждение.

я изучил что такое peloader и пришел к выводу,
что в контексте обсуждаемой темы - это
просто такой навороченный декриптер, который
расшифровывает строку с хексовыми литералами

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

. . . а навороченная версия peloader'а - это уже
. . . получится виртуальная машина)

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

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

а вот расшифровать одну инструкцию, выполнить
её и зашировать опять, причем в зависимости
от динамических параметров - вот о каком примере
я спрашиваю

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

. . . обычный код светлый, разряженный, криптеры
. . . всегда такие навороченные

. . . это правда? действительно они для опытного
. . . глаза в листинге выделяются?

> сперва научись программы ломать,
> потом уж защиты писать берись

нет у меня мотивации крякерство учить,
а на создание защит мотивация есть

я поэтому и тусуюсь в разделе форума
"Программирование", а не "Крякерство"

> сможете переписать это для примера
> в котором происходила бы работа с памятью?

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

Code:
  1. __asm call dword ptr [entry];


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

что я нарыл на данный момент из вашего
примера

Code:
  1. void* pFrom; void* pTo;
  2. void state() { ::flag--; }
  3.  
  4. /** some magic here */
  5.  
  6. void* p = ... ;
  7. asm volatile ("call *%0"::"r"(p)); // у меня mingw


как можно в рантайме взять содержание
функции state(), скопировать в кучу по новому
адресу в заксоренном виде, потом скопировать
адрес pTo = pFrom, расксорить, выполнить, потом
заксорить, скопировать в другое место в куче
и обратно отдать pFrom = pTo

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




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 17 января 2012 23:05
· Личное сообщение · #26

Triple Des ?! Примеры на си есть в сети.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

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

> Triple Des

не, качество шифровки меня не интересует
(в смысле не в этом треде)
в этой ветке речь только о многослойности




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 18 января 2012 00:20 · Поправил: Dart Sergius
· Личное сообщение · #28

если не объявленна переменная state, то
Code:
  1. char* crypt_func=(char*)state

т.к. state - это переменная типа FARPROC(вроде так пишется)
ну или что-то типо такого мутить.
Code:
  1. FARPROC uncrypt(char* Dest, char* Key);
  2.  
  3. //использовать так
  4. uncrypt((char*)state, key)(и  тут параметры для вызова функции);




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

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

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

Конечно же это всё можно реализовать! Для этого есть специальный движок: http://indy-vx.narod.ru/Bin/GCBE.zip он вам поможет построить граф и отморфить код так, как вы посчитаете нужным. Надеюсь смешать код на си и ассемблере для вас проблем не составит. Это пожалуй лучшее решение что я Вам могу порекомендовать. Данный случай (с динамической дешифровкой и шифровкой кода обратно) как раз взывает к использованию таких методик

-----
все багрепорты - в личные сообщения





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 18 января 2012 01:27 · Поправил: mak
· Личное сообщение · #30

wowfactor пишет:
> Triple Des

не, качество шифровки меня не интересует
(в смысле не в этом треде)
в этой ветке речь только о многослойности


Сам не знаешь, что тебе конкретно нужно, даже не посмотрел похоже

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


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

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

П.С. Аес и блоуфисш бери и строй многослойное шифрование, по ходу отписывайся.
Или можно посмотреть ru.wikipedia.org/wiki/Режим_шифрования, например глава Cipher Block Chaining (CBC) он может считаться частным случаем многослойного шифрования, пример с ксором описан. AES-CBC можно глянуть. Генетические алгоритмы тоже идут как дабл лэйеред, вариантов многослойного шифрования очень много. Обычно используют несколько подряд криптоалгоритмов и шифруют по очереди, крипто - декриптор отличный от первого - и опять крипто отличное от первых двух.

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

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube



. 1 . 2 . >>
 eXeL@B —› Программирование —› Многослойное динамическое шифрование (пример полиморфного кода на C/C++)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати