function SoloNumeros (cadena:string):boolean; {verifica si el string posee solo numeros}
var x,numeros:integer;
begin
numeros:=0; {Inicializo}
SoloNumeros:=false; {Inicializo}
for x:=1to length(cadena)do{Leo toda la cadena}
begin
if(cadena[x]>='0')and(cadena[x]<='9')then{veo la cantidad de numeros que hay en la cadena}
begin
numeros:=numeros+1;
end;
end;
if numeros=length(cadena)then{Si la cantidad de numeros es igual a la cantidad de caracteres}
begin
SoloNumeros:=true;
end;
end;
procedure CapturarAtributos (KeyLog:string; var Atributos:TAtributos); {Separar atributos del comando introducido por el usuario}
var
y:integer;
aux:string;
begin
y:=1;
while pos(' ',KeyLog)<>0do
begin
if pos(' ',KeyLog)<>0then{Si hay un espacio}
begin
aux:=copy(KeyLog,1,(pos(' ',KeyLog)-1)); {Copio la primera palabra}
Atributos[y]:=aux;
KeyLog:=copy(KeyLog,(pos(' ',KeyLog)+1),length(KeyLog)); {Copio desde el primer lugar que sigue del espacio hasta el final de la cadena}
if aux<>''then
begin
y:=y+1;
end;
end;
end;
Atributos[y]:=KeyLog; {Guardo la ultima palabra}
end;
procedure DesplazarComentario (Cadenas:TCadenas); {Escribe la cadena letra por letra como si se tratase de una animación}
var
x:integer;
begin
x:=1; {asigno}
repeat
write(Cadenas.Cadena[x]); {Imprimo la letra}
delay(200); {Retraso medio segundo la ejecucion del programa}
x:=x+1; {Paso a la siguiente letra}
until x= Cadenas.Marca; {Hasta que haya vacio (marca real)}
end;
procedure Explicacion; {Pequeña explicacion del reto}
Const
Bienvenido:TCadenas =(Cadena:'¡Bienvenido al reto!'; Marca:22);
Simulacion:TCadenas =(Cadena:'Este programa simula que estás trabajando en una terminal. Puedes introducir los comandos que desees siempre y cuando estos estén habilitados y tengas los permisos para ello. Para ver la lista de comandos disponibles puedes utilizar el comando help.'; Marca:252);
Objetivo:TCadenas =(Cadena:'Para completar el reto debes obtener la clave WEP de la red llamada TP_Link utilizando la suit aircrack-ng de auditoria wirless.';Marca:129);
Importante:TCadenas =(Cadena:'Importante! La contraseña del usuario de ID 0 es "www.hackxcrack.es" (sin comillas)';Marca:84);
Ahora:TCadenas =(Cadena:'Ahora... A trabajar! :D'; Marca:23);
ComandoHelp:TCadenas =(Cadena:'Puedes introducir el comando help para ver una lista de comandos disponibles';Marca:77);
var
x:integer;
begin
ClrScr;
x:=1;
repeat
case x of{Lo hago así para que si el usuario presiona una tecla salga del programa al terminar el case actual}
for i:=0to CantMaxMon do{Leer todos los mon activos}
begin
if mono[i]=truethen{Muestra por cada mono activo}
begin
writeLn('mon',i,' Link encap:UNSPEC HWaddr E0-',DireccionMac,'-00-00-00-00-00-00-00-00-00-00');{Separo en 2 por que la cadena es muy larga y no compila}
writeLn(' UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1');
if copy(Atributos[PosInt],1,3)='mon'then{Si empieza con mon}
begin
aux:= copy(Atributos[PosInt],4,(pos(' ',KeyLog)-1)); {Desde la primera letra despues de mon hasta el final de la primera palabra}
val(aux,NumMon,incorrecto); {Almaceno la cadena como integer en NumMon. Si habian letras en la cadena y por lo tanto da error, en incorrecto se almacena la posicion de la letra}
if(incorrecto=0)and(mono[NumMon]=true)then
Correcto:=true;
end;
if Atributos[PosInt]='wlan0'then
Correcto:=true;
end;
procedure airmonStart (Atributos:TAtributos; var mono:Tmono);
function UltimoAtrib (Atributos:TAtributos):integer; {Ultimo atributo ingresado (contando interface como uno)}
var x:integer;
begin
x:=1;
while x <= CantAtribPerm do{Recorro los atributos}
begin
if Atributos[x]=''then{Cuando encuentre el primer vacio}
begin
UltimoAtrib:=x-1; {La posicion anterior es la ultima}
x:=CantAtribPerm; {Salgo del bucle}
end;
x:=x+1
end;
end;
function BuscarAtributo(Atributos:TAtributos;Cadena:string):boolean; {Le paso como parametro el atributo que va a buscar en la cadena}
var
x:integer;
begin
BuscarAtributo:=false; {Inicializo}
if(Cadena='-w')or(Cadena='--write')then{si busco el write write}
begin
for x:=1to UltimoAtrib(Atributos)do
begin
if(Atributos[x]=Cadena)and(x < UltimoAtrib(Atributos)-1)and(Atributos[x-1]<>'-c')and(Atributos[x-1]<>'-channel')then{Antes no puede estar el channel Despues de -w debe estar el nombre del archivo y despues de este la interface}
BuscarAtributo:=true; {encontró el atributo que buscaba y también tenia el nombre con que se iba a guardar}
end;
end;
if(Cadena='-c')or(Cadena='--channel')then{Si busco el channel}
begin
for x:=1to UltimoAtrib(Atributos)do
begin
if(Atributos[x]=Cadena)and(Atributos[x-1]<>'-w')and(Atributos[x-1]<>'-write')and(x < UltimoAtrib(Atributos)-2)then{Antes no puede estar el write y reviso que despues de -w debe estar el nombre del archivo y despues de este la interface}
BuscarAtributo:=true;
end;
end;
if(Cadena='--bssid')then{Si busco el bssid}
begin
for x:=1to UltimoAtrib(Atributos)do
begin
if(Atributos[x]=Cadena)and(Atributos[x-1]<>'-w')and(Atributos[x-1]<>'-write')and(Atributos[x-1]<>'-c')and(Atributos[x-1]<>'-channel')then{Si lo que le sigue es una mac y antes no tiene al write (ya que lo tomaria como el nombre del archivo a guardar)}
BuscarAtributo:=true;
end;
end;
end;
function AtributosCorrectos(Atributos:TAtributos; AtributosAirodump:TAtributosAirodump):boolean; {Solo sirve para el coamando airodump, lo que hace es revisar que todos los atributos ingresados sean correctos}
var x,y:integer;
begin
x:=2;
y:=1;
AtributosCorrectos:=true; {Inicializo}
while(x <= UltimoAtrib(Atributos)-1)and(AtributosCorrectos=true)do{Si encuentra un atributo falso sale sin revisar los que siguen}
begin
AtributosCorrectos:=false; {Inicializo por cada vez que se repite el bucle}
y:=1;
while y<=CantAtribAirod do
begin
if Atributos[x]=AtributosAirodump[y]then{Si no encuentra un atributo verdadero se va a quedar en false y va a salir del bucle}
begin
{Me fijo que no sea anulado por un comando anterior}
writeLn('Ha habido un problema durante la ejecucion del programa, porfavor pongase en contaco con el servicio tecnico (osea yo XD) (osea Facu de Hackxcrack) jaja');
end;
procedure airodump (Atributos:TAtributos;var Beacons:integer;var Data:integer; E925,E935,E1112:boolean; var archivoEscritura:string);
var
NumMon:integer;
MonCorrecto:boolean;
escritura,canal,bssid:boolean;
begin
escritura:=false; {Inicializo}
canal:=false;
bssid:=false;
InterfaceCorrecto(Atributos,UltimoAtrib(Atributos),mono,NumMon,MonCorrecto); {Lo busco en el ultimo atributo}
if AtributosCorrectos(Atributos,AtributosAirodump)=truethen{Atributos correctos}