elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [C#] Creacion de un IRC Bot
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C#] Creacion de un IRC Bot  (Leído 2,195 veces)
BigBear


Desconectado Desconectado

Mensajes: 545



Ver Perfil
[C#] Creacion de un IRC Bot
« en: 3 Octubre 2014, 18:07 pm »

[Titulo] : Creacion de un IRC Bot
[Lenguaje] : C#
[Autor] : Doddy Hackman

[Temario]

-- =================--------

0x01 : Introduccion
0x02 : Conectando con el servidor
0x03 : Listando usuarios
0x04 : Mandar mensajes
0x05 : Recibir privados
0x06 : Reconocer comandos
0x07 : Testeando

-- =================--------

0x01 : Introduccion

Para comenzar esta breve manual sobre como hacer un IRC Bot en C# les aclaro que eh probado todo esto en Visual Studio 2010 usando como servidor IRC mi propia computadora usando IRC Plus para ello , lo pueden conseguir facilmente en internet y al parecer es compatible con Seven.
Los IRC Bot usados normalmente como spam tambien son usados para irc botnet o incluso como hacking tools , en este manual les enseñare a hacer spam y reconocer comandos
para hacking tools.

Comencemos ...

Primero tenemos que crear un proyecto de tipo "Aplicacion de Consola" pongan el NET Framework a 2.0 y pongan de nombre de proyecto "irc" como en la siguiente imagen :



Con el proyecto ya creado pasemos al siguiente punto.

0x02 : Conectando con el servidor

Para poder realizar la conexion vamos a necesitar los siguientes namespaces de esta forma :

Código
  1. using System.Net; // Lo usamos para realizar la conexion
  2. using System.Net.Sockets; // Lo mismo que la anterior
  3. using System.IO; // Lo usamos para el manejo con los streams
  4. using System.Text.RegularExpressions; // No es vital pero me encantan el uso de las expresiones regulares
  5.  

Para poder realizar la conexion usamos los sockets de la siguiente forma :

Código
  1. NetworkStream conexion; // Establecemos la variable conexion como NetworkStream
  2. TcpClient irc; // Establecemos la variable irc como TcpClient
  3. StreamReader leer_datos; // Establecemos la variable leer_datos como StreamReader
  4. StreamWriter mandar_datos; // Establecemos la variable mandar_datos como SteamWriter
  5.  
  6. string host = "localhost"; // Establecemos la variable string host para tener el host del canal IRC
  7. string nickname = "ClapTrap"; // Establecemos la variable nickname con el nick del bot
  8. string canal = "#locos"; // Establecemos la variable canal con el nombre del canal
  9. string code = ""; // Creamos la variable string que vamos a usar para leer los sockets
  10.  
  11. irc = new TcpClient(host, 6667); // Realizamos la conexion con el canal usando el host y el puerto 6667
  12. conexion = irc.GetStream(); // Cargamos la conexion para poder leer los datos
  13. leer_datos = new StreamReader(conexion); // Lo necesario para leer los datos de la conexion
  14. mandar_datos = new StreamWriter(conexion); // Lo necesario para mandar comandos al canal IRC
  15.  
  16. mandar_datos.WriteLine("NICK " + nickname); // Usamos el comando NICK para entrar al canal usando el nick antes declarado
  17. mandar_datos.Flush(); // Actualizamos la conexion
  18.  
  19. mandar_datos.WriteLine("USER " + nickname + " 1 1 1 1"); // Usamos el comando USER para confirmar el nickname
  20. mandar_datos.Flush(); // ..
  21.  
  22. mandar_datos.WriteLine("JOIN " + canal); // Usamos el comando JOIN para entrar al canal
  23. mandar_datos.Flush(); // ..
  24.  

Si quieren probar en otro servidor IRC pueden cambiar los datos de las variables host,nickname,canal para poder acceder a su canal.

Una vez conectados creamos un blucle enterno para capturar los datos y terminar de realizar la conexion con el famoso ping pong el cual nos hace el  servidor para poder terminar de conectarnos , resolvemos este tema de la siguiente forma :

Código
  1. while (true) // Mi bucle eterno
  2. {
  3. while ((code = leer_datos.ReadLine()) != null) // Leemos la conexion con la variable code
  4. {
  5. Console.WriteLine("Code : " + code); // No es necesario pero es para ver las respuestas del servidor
  6.  
  7. Match regex = Regex.Match(code, "PING(.*)", RegexOptions.IgnoreCase); // Detectamos el clasico PING para el PING PONG
  8. // que nos hara el servidor IRC para verificar que estemos ahi y entrar al canal , aunque lo sigo haciendo despues
  9. // para ver que no estemos muerto o algo asi xD
  10. if (regex.Success) // Si se encontro algo
  11. {
  12. string te_doy_pong = "PONG " + regex.Groups[1].Value; // Capturamos lo que esta despues del ping y le damos al pong con los datos
  13. mandar_datos.WriteLine(te_doy_pong); // Mandamos el comando de la variable anterior
  14. mandar_datos.Flush(); // ..
  15. }
  16. }
  17. }
  18.  

Con esto ya estamos conectados.

0x03 : Listando usuarios

Para poder listar los usuarios agregamos la variabe global "usuarios" al inicio del codigo de la siguiente forma :

Código
  1. static string[] usuarios; // Creamos el string[] usuarios para tener todos los nicks que estan en el canal
  2.  

Entonces volvemos al bucle eterno que hicimos con while y agregamos despues del ping pong el siguiente codigo :

Código
  1. regex = Regex.Match(code,":(.*) 353 (.*) = (.*) :(.*)", RegexOptions.IgnoreCase); // Capturamos los usuarios de todo el canal
  2. // con el poder de las expresiones regulares
  3. if (regex.Success) // Si los encontraron
  4. {
  5. string usuarios_lista = regex.Groups[4].Value; // Tenemos la variable con todos los nicks
  6. usuarios = usuarios_lista.Split(' '); // Para mayor comodidad usamos un split para separar todos los espacios vacios que estan entre
  7. // cada nick del canal para despues hacer una lista , que es la primera que declare en el codigo
  8. foreach (string usuario in usuarios) // Usamos un for each para leer la lista usuarios y mostrar cada nick en la variable usuario
  9. {
  10. Console.WriteLine("[+] User : "+usuario); // Mostramos cada user
  11. }
  12. }
  13.  

Como ven usamos las expresion regulares para buscar en el stream que nos manda la conexion con el servidor irc para despues seperar con split el resultado obtenido por espacios en blanco ' ' , despues usamos foreach para listar todos los usuarios en la consola.

0x04 : Mandar mensajes

Esta es una parte corta , para mandar un mensaje al canal de forma publica tenemos que usar el siguiente comando :

Código
  1. PRIVMSG #locos Mensaje
  2.  

Un ejemplo usando C# al cual deben agregar obviamente despues del blucle while() :

Código
  1. mandar_datos.WriteLine("PRIVMSG" + " " + canal + " " + "Hi World"); // Mandamos un mensaje al canal
  2. mandar_datos.Flush(); // ..
  3.  

0x05 : Recibir privados

Bueno esta parte es un poco mas complicada , para poder detectar los mensajes privados que nos mandan tenemos que leer el stream que nos manda el canal y ver el comando PRIVMSG , en el comando PRIVMSG le seguira la procedencia , si es el canal sera un mensaje publico pero si no es el canal es un mensaje privado , eso lo podemos detectar con el siguiente codigo al cual vamos agregar despues del bucle while() : 

Código
  1. regex = Regex.Match(code, ":(.*)!(.*) PRIVMSG (.*) :(.*)", RegexOptions.IgnoreCase); // Lo usamos para detectar los mensajes privados y publicos
  2. if (regex.Success) // Si se encontro algo
  3. {
  4.  
  5. mandar_datos.WriteLine("PRIVMSG" + " " + canal + " " + "Hi World"); // Mandamos un mensaje al canal
  6. mandar_datos.Flush(); // ..
  7.  
  8. string dedonde = regex.Groups[1].Value; // Se detecta la procedencia del mensaje
  9. string mensaje = regex.Groups[4].Value; // El mensaje en si
  10. if (dedonde != canal) // Si la procedencia del mensaje no es el canal en si activamos esta condicion , cabe aclarar que si es el canal
  11. // el que nos mando el mensaje es un mensaje PUBLICO , caso contrario es PRIVADO
  12. {
  13. Console.WriteLine("[+] "+dedonde+" dice : "+mensaje); // Mostramos el dueño del mensaje y el mensaje
  14. }
  15. }
  16.  
             

Como ven detectamos los mensajes privados y los mostramos en la consola como lo hace mirc , mostrando el nick que nos esta hablando y despues el mensaje.

0x06 : Reconocer comandos

Para poder reconocer comandos para HackingTools lo vamos hacer con mensajes privados , el administrador del bot le habla al mismo a traves de mensajes privados con los comandos , despues el bot le responde con la respuesta del comando que le dijimos , un ejemplo de eso es este codigo el cual deben agregar despues del bucle :

Código
  1. regex = Regex.Match(code, ":(.*)!(.*) PRIVMSG (.*) :(.*)", RegexOptions.IgnoreCase); // Lo usamos para detectar los mensajes privados y publicos
  2. if (regex.Success) // Si se encontro algo
  3. {
  4. string dedonde = regex.Groups[1].Value; // Se detecta la procedencia del mensaje
  5. string mensaje = regex.Groups[4].Value; // El mensaje en si
  6. if (dedonde != canal) // Si la procedencia del mensaje no es el canal en si activamos esta condicion , cabe aclarar que si es el canal
  7. // el que nos mando el mensaje es un mensaje PUBLICO , caso contrario es PRIVADO
  8. {
  9. Match regex_ordenes = Regex.Match(mensaje, "!spam (.*) (.*)", RegexOptions.IgnoreCase); // Esta es la orden !spam con los (.*)
  10. // detectamos los dos comandos que son <nick> <mensaje>
  11. if (regex_ordenes.Success) // Si se encontro algo
  12. {
  13. mandar_datos.WriteLine("PRIVMSG" + " " + dedonde + " " + "[+] Sure"); // Le decimos al nick dueño del bot que si
  14. mandar_datos.Flush(); // ..
  15. System.Threading.Thread.Sleep(5000); // Usamos Thread.Sleep para esperar 5 segundos y fingir que hacemos algo interesante xD
  16. mandar_datos.WriteLine("PRIVMSG" + " " + regex_ordenes.Groups[1].Value + " " + regex_ordenes.Groups[2].Value); // Mandamos
  17. // un mensaje al usuario especificado con el mensaje que pedimos
  18. mandar_datos.Flush(); // ..
  19. mandar_datos.WriteLine("PRIVMSG" + " " + dedonde + " " + "[+] Finished"); // Le decimos al dueño del bot que terminamos
  20. mandar_datos.Flush(); // ..
  21. }
  22. }
  23. }
  24.  

Como ven nuestro comando es !spam , simplemente usa esta formato "!spam <nick> <texto>" y el bot le hablara a la persona del canal que quieran con el mensaje que quieran.

0x07 : Testeando

Hemos llegado al final de este corto manual , les deberia haber quedado el codigo de esta forma :

Código
  1. // Ejemplo de IRC Bot
  2. // Written By Doddy Hackman in the year 2014
  3.  
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7.  
  8. using System.Net; // Lo usamos para realizar la conexion
  9. using System.Net.Sockets; // Lo mismo que la anterior
  10. using System.IO; // Lo usamos para el manejo con los streams
  11. using System.Text.RegularExpressions; // No es vital pero me encantan el uso de las expresiones regulares
  12.  
  13. namespace irc
  14. {
  15.    class Program
  16.    {
  17.        static string[] usuarios; // Creamos el string[] usuarios para tener todos los nicks que estan en el canal
  18.  
  19.        static void Main(string[] args)
  20.        {
  21.            NetworkStream conexion; // Establecemos la variable conexion como NetworkStream
  22.            TcpClient irc; // Establecemos la variable irc como TcpClient
  23.            StreamReader leer_datos; // Establecemos la variable leer_datos como StreamReader
  24.            StreamWriter mandar_datos; // Establecemos la variable mandar_datos como SteamWriter
  25.  
  26.            string host = "localhost"; // Establecemos la variable string host para tener el host del canal IRC
  27.            string nickname = "ClapTrap"; // Establecemos la variable nickname con el nick del bot
  28.            string canal = "#locos"; // Establecemos la variable canal con el nombre del canal
  29.            string code = ""; // Creamos la variable string que vamos a usar para leer los sockets
  30.  
  31.            irc = new TcpClient(host, 6667); // Realizamos la conexion con el canal usando el host y el puerto 6667
  32.            conexion = irc.GetStream(); // Cargamos la conexion para poder leer los datos
  33.            leer_datos = new StreamReader(conexion); // Lo necesario para leer los datos de la conexion
  34.            mandar_datos = new StreamWriter(conexion); // Lo necesario para mandar comandos al canal IRC
  35.  
  36.            mandar_datos.WriteLine("NICK " + nickname); // Usamos el comando NICK para entrar al canal usando el nick antes declarado
  37.            mandar_datos.Flush(); // Actualizamos la conexion
  38.  
  39.            mandar_datos.WriteLine("USER " + nickname + " 1 1 1 1"); // Usamos el comando USER para confirmar el nickname
  40.            mandar_datos.Flush(); // ..
  41.  
  42.            mandar_datos.WriteLine("JOIN " + canal); // Usamos el comando JOIN para entrar al canal
  43.            mandar_datos.Flush(); // ..
  44.  
  45.            while (true) // Mi bucle enterno
  46.            {
  47.                while ((code = leer_datos.ReadLine()) != null) // Leemos la conexion con la variable code
  48.                {
  49.                    Console.WriteLine("Code : " + code); // No es necesario pero es para ver las respuestas del servidor
  50.  
  51.                    Match regex = Regex.Match(code, "PING(.*)", RegexOptions.IgnoreCase); // Detectamos el clasico PING para el PING PONG
  52.                    // que nos hara el servidor IRC para verificar que estemos ahi y entrar al canal , aunque lo sigo haciendo despues
  53.                    // para ver que no estemos muerto o algo asi xD
  54.                    if (regex.Success) // Si se encontro algo
  55.                    {
  56.                        string te_doy_pong = "PONG " + regex.Groups[1].Value; // Capturamos lo que esta despues del ping y le damos al pong con los datos
  57.                        mandar_datos.WriteLine(te_doy_pong); // Mandamos el comando de la variable anterior
  58.                        mandar_datos.Flush(); // ..
  59.                    }
  60.  
  61.                    regex = Regex.Match(code,":(.*) 353 (.*) = (.*) :(.*)", RegexOptions.IgnoreCase); // Capturamos los usuarios de todo el canal
  62.                    // con el poder de las expresiones regulares
  63.                    if (regex.Success) // Si los encontraron
  64.                    {
  65.                        string usuarios_lista = regex.Groups[4].Value; // Tenemos la variable con todos los nicks
  66.                        usuarios = usuarios_lista.Split(' '); // Para mayor comodidad usamos un split para separar todos los espacios vacios que estan entre
  67.                        // cada nick del canal para despues hacer una lista , que es la primera que declare en el codigo
  68.                        foreach (string usuario in usuarios) // Usamos un for each para leer la lista usuarios y mostrar cada nick en la variable usuario
  69.                        {
  70.                            Console.WriteLine("[+] User : "+usuario); // Mostramos cada user
  71.                        }
  72.                    }
  73.  
  74.                    regex = Regex.Match(code, ":(.*)!(.*) PRIVMSG (.*) :(.*)", RegexOptions.IgnoreCase); // Lo usamos para detectar los mensajes privados y publicos
  75.                    if (regex.Success) // Si se encontro algo
  76.                    {
  77.  
  78.                        mandar_datos.WriteLine("PRIVMSG" + " " + canal + " " + "Hi World"); // Mandamos un mensaje al canal
  79.                        mandar_datos.Flush(); // ..
  80.  
  81.                        string dedonde = regex.Groups[1].Value; // Se detecta la procedencia del mensaje
  82.                        string mensaje = regex.Groups[4].Value; // El mensaje en si
  83.                        if (dedonde != canal) // Si la procedencia del mensaje no es el canal en si activamos esta condicion , cabe aclarar que si es el canal
  84.                        // el que nos mando el mensaje es un mensaje PUBLICO , caso contrario es PRIVADO
  85.                        {
  86.                            Console.WriteLine("[+] "+dedonde+" dice : "+mensaje); // Mostramos el dueño del mensaje y el mensaje
  87.                            Match regex_ordenes = Regex.Match(mensaje, "!spam (.*) (.*)", RegexOptions.IgnoreCase); // Esta es la orden !spam con los (.*)
  88.                            // detectamos los dos comandos que son <nick> <mensaje>
  89.                            if (regex_ordenes.Success) // Si se encontro algo
  90.                            {
  91.                                mandar_datos.WriteLine("PRIVMSG" + " " + regex_ordenes.Groups[1].Value + " " + regex_ordenes.Groups[2].Value); // Mandamos
  92.                                // un mensaje al usuario especificado con el mensaje que pedimos
  93.                                mandar_datos.Flush(); // ..
  94.                            }
  95.                        }
  96.                    }
  97.                }
  98.            }
  99.        }
  100.    }
  101. }
  102.  
  103. // The End ?
  104.  

Unas imagenes :







--========--
  The End ?
--========--

Version PDF.

Version VideoTutorial



Eso es todo.


En línea

XresH


Desconectado Desconectado

Mensajes: 384



Ver Perfil WWW
Re: [C#] Creacion de un IRC Bot
« Respuesta #1 en: 3 Octubre 2014, 18:25 pm »

Muy bien aporte Doddy, analize el code y se ve bien.
Sin compicaciones, eficaz y sencillo.

Saludos.


En línea

[ - Si eres programador y quieres que tus proyectos esten en mi blog(con o sin source), consúltame! - ]
Entra A Mi Blog De Programación | | Dudas en este post :| | >>Clic para ir al Post<<
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Creacion de DVD
Multimedia
dorsan 1 1,923 Último mensaje 19 Julio 2007, 11:56 am
por Songoku
Creación de DVD
Multimedia
cronquillo 7 4,078 Último mensaje 29 Octubre 2009, 18:57 pm
por cronquillo
Creacion de BOt
Juegos y Consolas
Vradamanthys 0 4,778 Último mensaje 29 Abril 2020, 05:11 am
por Vradamanthys
Creacion de BOt
Programación General
Vradamanthys 5 3,668 Último mensaje 3 Mayo 2020, 17:31 pm
por BloodSharp
Creación de un vidiojuego en pytho
Scripting
assw1208 1 2,095 Último mensaje 1 Mayo 2020, 23:32 pm
por tincopasan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines