comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[C / C#] IRC a machetazos

  • 0 Respuestas
  • 793 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado s0d0ma

  • *
  • Underc0der
  • Mensajes: 1
  • Actividad:
    0%
  • Reputación 0
  • Don't give a fuck about yesterday or give a fuck a
    • Ver Perfil
    • Dev Weird
« en: Abril 01, 2018, 09:39:52 pm »
Hola  He decidido solucionar algunos wargames para salir de la monotonia de la facultad, pero no simplemente hacerlo si no tratarme de empaparme lo que mas pueda para poder resolverlo (como realizar un "estado del arte" preliminar antes de sentarme a codear para resolver estos retos).

PostData[0] = No diré de donde saque los retos para no dañarle la experiencia a las demás personas que quieran realizarlos.

PostData[1] = Publicare el código del reto pero intentare hacer un énfasis "investigativo" y tratar de exponer un poco lo que aprendí y no solo subir la solución del reto.

PostData[2] = Cambiare algunos valores del planteamiento del reto para que no lleguen a este post si están buscando una solución de este reto.

Planteamiento del reto

El reto encontrado nos planteaba la siguiente situación, debíamos conectarnos a un servidor IRC (irc.server.com) con un puerto definido donde se estaba ejecutando el servicio IRC (6667), despues de esto debíamos enviar un mensaje privado a un bot que llamado Pepegrillo diciéndole !problema1. El bot nos contestara el mensaje con el siguiente formato.

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
[numero_1] / [numero_2]
El siguiente procedimiento se debe realizar las siguientes operaciones con los números dados por el bot

1) calcular la raíz del numero_1
2) multiplicar el resultado anterior por el numero_2

Se debe enviar el bot Pepegrillo el resultado de la ultima operación redondeándolo a 2 cifras significativas para esto se tiene un tiempo de 2 segundos. Si el bot no responde es por que esta baneado el usuario y se debe esperar unos minutos antes de enviar una nueva respuesta.

Conocimientos necesarios
Protocolo IRC
  • Introducción al protocolo
  • Aspectos del RFC
  • Análisis de cliente
  • Opiniones personales del irc a la fecha (2018)
Sockets Linux
  • Introducción a sockets
  • Estructuras]
  • Uso del socket (Cliente)
Planteamiento del codigo
  • Descripción de pasos genéricos
  • Código (C && C#)


Protocolo IRC

  • Introducción al protocolo

    IRC (Internet Relay Chat) es un protocolo de comunicacion basado en texto para el intercambio de mensajes en tiempo real, incluyendo la tranferencia de archivos, mensajes privados entre usuarios que están en una misma sala de chat o en un mismo servidor.

    El modelo de conexion de software es CLIENTE-SERVIDOR, donde el servidor es donde se estará ejecutando el demonio que recibirá las conexiones de los clientes concurrentes (que se conectan por medio de un programa llamado CLIENTE IRC para consumir los recursos ofrecidos por el servidor).
     
    Para poder tener un servidor irc se debe tener instalado un demonio que nos deje operar nuestro servidor IRC. Existen varias alternativas de demonios para poder tener nuestro servidor IRC propio entre esos estan ircd-seven, InspIRCd, UnrealIRCd.

    (imagen: Banner Bahamut Deamon)

    (imagen: Banner UnrealIRCd)

    Existen varios clientes de irc, uno de los mas usados es el irssi. Ya que IRC esta basado en texto y como dicen en el propio RFC "siendo el cliente mas simple un programa capaz de conectarse a un servidor por medio de un socket" irssi es un cliente que permite conectarse por medio de un socket y poder interactuar con el servicio de IRC ( mas se realizara un análisis del protocolo con ngrep y irssi ).


  • Aspectos del RFC

    RFC: Es un escrito realizado por una o varias personas y contiene una propuesta para una nueva tecnología, donde se especifica la información técnica del uso. Las RFC en resumen es la documentación de protocolos y tecnologías de internet, son mantenidas y aprobadas por el IETF (No tienes permisos para ver links. Registrate o Entra con tu cuenta).

    Invitacion: Existen muchos RFC sin traducir al español aqui No tienes permisos para ver links. Registrate o Entra con tu cuenta podrán ser parte del grupo de traducción de las RFC. (Es bueno a veces encontrar un RFC en español), debo pulir mi ingles intentar ser parte del grupo de traducción.

    El RFC del protocolo IRC se puede encontrar aquí en español No tienes permisos para ver links. Registrate o Entra con tu cuenta y la versión mas actualizada No tienes permisos para ver links. Registrate o Entra con tu cuenta contiene todas las especificaciones tecnicas del protocolo. Solo comentare las que mas me llamaron la atencion :

    [-]IRC se ha desarrollado para trabajar sobre TCP/IP pero eso no implica que sea la unica forma que funcione.
    [-]Los servidores son la espina dorsal de la arquitectura para un servicio IRC, ya que un servidor puede estar a otros servidores irc para retro alimentar a un servidor principal.


    (imagen: arquitectura irc)


    (imagen: red pequeña de irc)

    [-]El final de un mensaje se toma por CRLF o "\r\n" o "\x0d\x0a"
    [-]El servidor envia el comando PING para verificar si un cliente sigue conectado, para que el cliente diga que esta vivo tiene que responder PONG
    [-]Commandos de uso basico terminados por CRLF

    Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
    CONNECT <target server> <port> [<remote server>]
    INFO [<target>]
    JOIN <channels> [<keys>]
    LIST [<channels> [<server>]]
    USER <username> * * :<username>
    PRIVMSG <user> :<message>
    QUIT : <message>

  • Analisis del cliente

    El plan aquí es literamente ver como se comporta el protocolo en caliente, ver como se inicia las comunicaciones y cual es el orden de esos comandos para poder ingresar a un server IRC. para ello se utilizara ngrep (full amor para esa herramienta) esta herramienta es un sniffer que puede matchear resultados por medio de "expresiones regulares".

    Iniciamos el ngrep con los siguentes parametros -x para visualizar el content del paquete en hexadecimal, -d para definir la interface de red que queremos monitorear, port definimos el puerto en el que se ejecuta el server irc y a despues de esto iniciar nuestra conexion con un servidor irc por medio del irssi (/connect irc.server.com).


    El inicio de la comunicacion empezar seteando el NICK del cliente, luego sigue definirle al servidor el usuario con el que nos conectaremos, y luego viene 2 repuestas del server, podremos ver que cada mensaje termina con un "\r\n".


    Despues de esto vendran mas respuestas por parte del servidor con el banner de inicio y luego el mecanismo para mantener live la conexion entre el cliente y el servidor (PING).


    (imagen de conexion al server)


    (imagen mecanismo de verificacion de "live")

    Con esto ya se "toca madera" sentando un poco de lo antes leido en el RFC y con ello confirmamos que podemos interactuar mediante sockets con un server IRC (claro... para la interaccion cifrada de SSL cambia todo el asunto pero por ahora solo me preucupare por el text-plain... I need more skills dude).

  • Opiniones personales del irc a la fecha (2018).

     IRC estuvo muy movido una epoca, donde medio internet estaba por las redes de IRC, se usaba mucho para juegos, soporte, grupos de desarrolladores (aunque en esta fecha aun existen varios proyectos que intentan mantener live IRC como por ejemplo el grupo de telegram de radare, hicieron una integracion que los mensajes escritos en el irc se vean reflejados en el chat de telegram y asi mismo lo que se escriba en telegram se ve reflejado en el canal de IRC). Aun se veían botnets C&C administradas desde IRC... es una buena opcion pero hace poco tambien hicieron la implementacion de un RAT administrado por Telegram. 

    Montar un servidor IRC propio es bueno por que tu eres el que lo administra,  porque tu le configuras el tipo de cifrado vas a manejar por SSL, los clientes o las IP que vas a dejar conectarse al servidor , etc (O sea hardenning del hardcore y del pesado).

    IRC a la fecha sigue siendo una buena alternativa para la comunicacion de mensajes en tiempo real aunque existan muchas otras alternativas "mas seguras" que simplifican el uso y que traen ciertas opciones interesantes.

    "IRC no ha muerto...".



    Sockets Linux

  • Introducción sockets

     Los sockets son un abstraccion de software que permiten la intercomunicacion de datos y de informacion entre dos (o uno llegado el caso) por medio de la API del sistema operativo que se encargara de hacer interface con los protocolos de internet y de TPC/IP (o para intercomunicacion de procesos del sistema operativo).

    Para el uso de sockets se deberan tener en cuenta estas librerias del sistema.


  • Estructuras.

    Las estructura mostradas en esta seccion son muy importantes para trabajar con punteros, son estrucutras ya definidas dentro del archivo sys/socket.h. Estas estructuras se deberan llenarse adecuadamente por que luego se utilizaran por las funciones de sockets (creacion del handler y otros) y tiene informacion del socket.

    • hostent : informacion del host
    • sockaddr : sockaddr_in minimizada
    • in_addr : Contiene la ip del host
    • sockaddr_in : informaccion del socket


  • Uso de sockets (Cliente).
    Se puede resumir el uso de un socket a nivel de cliente en los siguentes pasos (a nivel de codigo).

    • Setear valores del socket (estructura sockaddr_in).
    • Creacion del handle del socket
    • Verificacion del handle
    • Conexion
    • Verificar conexion
    • Envio/recibo
    • Cerrar socket


    Dos cosas que se deben tener en cuenta: 1) si estamos programando un servidor o un cliente con multiples peticiones lo mejor es crear procesos para manejar cada caso de ejecucion 2) ya que la filosofia de linux es que todo es un archivo (hasta el mismo socket) en cierta manera lo que obtenemos de crear el handle del socket es un handle de un archivo asi que podremos usar ciertas funciones con las que se pueden interactuar con archivos "real" y usarlas con el handle del socket. En resumidas cuentas seria algo asi hasta el paso 5. (en la funcion socket, se le envia el tipo de familia del protocolo AF_INET (conexiones a red, si fuera AF_UNIX seria para intercomunicarse entre procesos internos de la maquina) , SOCK_STREAM (TCP o UDP), 0 = PROTOCOLO = TCP ).

    (en la funcion connect se le pasa por parametros, el handle del socket creado por la funcion socket, luego la estructura sockaddr_in con un cast necesario y por ultimo la cantidad de bytes)



  • Descripcion de programa

    Utilizare un diagrama de secuencia para describir la comunicacion entre el cliente y el servidor irc para la solucion del reto planteado (lo deje simple para solo enfocarme en comunicacion realizada, si encuentran algun error o alguna recomendacion la pueden escribir aqui. Gracias)

    Pasos:
    • Realizar conexion por sockets al servidor
    • Enviar comando "NICK s0d0ma\r\n"
    • Respuesta por parte del servidor "\x00\x00\x00\x00\x00\x00"
    • Enviar comando "USER s0d0ma * *:s0d0ma\r\n"
    • Respuesta del servidor (banner 1, banner 2, banner 3)
    • Enviar comando "PRIVMSG Pepegrillo:!problema1\r\n"
    • Respuesta del servidor "numero2 / numero2\r\n"
    • (procesar) Enviar respuesta "PRIVMSG Pepegrillo:!problema1 -rep%0.2f\r\n"
    • Respuesta del servidor con la flag
    • Cerrar conexion


  • Codigo

    C (GNU GCC)

    En la implementacion realizada en C se define antes de todo 1) un offset para encontrar la flag en el mensaje de respuesta 2) El puerto irc, se define una nueva estructura para almacenar los datos del servidor. y en el prototipo de funciones se encuentran nuestras  3 funciones a usar.



  • Recibir()

    Retornara un buffer donde esta almacenada la respuesta por parte del servidor y se debe pasar como parametro el handle del socket, crea un nuevo buffer de memoria de 2000 bytes. recibe información por medio de la función recv y queda almacenada en el buffer recién creado y al final se retorna el buffer.


  • Enviar()

    No retorna algún valor, solo se encargara de enviar datos por medio del socket, se tendrá que pasar como parámetro el handle del puntero, y el buffer de datos que se quiere enviar. Se crea primeramente un buffer de memoria del tamaño de la longitud del commando ingresado y se le suman 3 espacios mas para almacenar "\r\n". Luego envía la información por medio de la función send() y se libera el buffer temporal que habíamos creado para el comando+"\r\n".


  • Procesar()

    Retornara la respuesta al reto que es de tipo float, se tendrá que pasar como parametros le buffer donde se encuentran los números a operar y la longitud del username. Primeramente se define el buffer inicial donde estará la flag. en el primer ciclo se concatenaran todos los números de numero1 y en el segundo ciclo almacenamos todos los digitos del numero2, realizamos luego un atoi a ambos strings y los convertimos a int. Se realiza las operaciones indicadas y se retorna el float. (Nota mental : printf("%0.2f",float_mio);


    Dentro de la función main donde se puede visualizar los pasos efectuados para realizar este reto, se debe tener en cuenta que a la hora de generar los strings de los comandos se tenia que realizar una construcion de strings dinámico por medio de sprintf() que permite enviar un string dinámico a un buffer de memoria.  Se deben ir eliminando cada no de los buffers (entrada y de salida de datos) antes de usarlos para hacer un manejo de memoria adecuado.


    Codigo completo

    Código: C
    1. // Librerias basicas para
    2.  
    3. #include <stdio.h>                      //      I/O
    4. #include <stdlib.h>                     //      Libreria standar para manejo de memoria, conversion numerica, etc
    5. #include <string.h>                     //      manejo de strings (char * terminados en \0)
    6. #include <unistd.h>                     //      Libreria que provee acceso a POSIX (api del sistema operativo)
    7. #include <math.h>                       //      funciones matematicas
    8.  
    9. // Librerias para sockets
    10.  
    11. #include <sys/socket.h>         //      Provee funciones, estructuras usadas por el SOCKET API
    12. #include <arpa/inet.h>          //      Definiciones para operaciones de internet (htons, inet_addr,...)
    13. #include <netinet/in.h>         //      internet domain address estructuras y funciones
    14. #include <netdb.h>              //      dominio/DNS usada para el hostname lookup
    15.  
    16. #define OFFSET_FLAG 32
    17. #define PUERTO 6667
    18.  
    19. struct server_irc
    20. {
    21.         const char * username;
    22.         const char * canal;
    23.         const char * IP;
    24.         const int puerto;
    25.         const char * botname;
    26. };
    27.  
    28.  
    29. char * recibir( int );
    30. void enviar( int , char * );
    31. float procesar( char * , int );
    32.  
    33. int main()
    34. {
    35.         // declaraciones
    36.         struct server_irc server = {"s0d0maN", "", "211.88.163.14", 6667, "botco"};
    37.         struct sockaddr_in irc_cliente;
    38.         char * buffer;
    39.         char * Commd;
    40.         int handleSocket;
    41.         float result;
    42.  
    43.         // Seteando valores del socket
    44.         irc_cliente.sin_family          = AF_INET;                      // Protocolo
    45.         irc_cliente.sin_port            = htons(server.puerto);         // Puerto
    46.         irc_cliente.sin_addr.s_addr     = inet_addr(server.IP);         // IP
    47.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(irc_cliente.sin_zero,0,8);                               //rellenado de 0
    48.  
    49.         // iniciar socket
    50.         handleSocket = socket(irc_cliente.sin_family, SOCK_STREAM, 0);
    51.  
    52.         // verificar el handle
    53.         if(handleSocket == -1)
    54.         {
    55.                 No tienes permisos para ver links. Registrate o Entra con tu cuenta(stderr, "[ERROR] socket no creado\n");
    56.                 No tienes permisos para ver links. Registrate o Entra con tu cuenta(-1);
    57.         }
    58.  
    59.         // realizar conexion de socket
    60.         if(connect(handleSocket, (struct sockaddr *) & irc_cliente, sizeof(irc_cliente)) == -1)
    61.         {
    62.                 No tienes permisos para ver links. Registrate o Entra con tu cuenta(stderr, "[ERROR] No conectado\n");
    63.                 No tienes permisos para ver links. Registrate o Entra con tu cuenta(-1);
    64.         }
    65.  
    66.         // recibir banner de conexion
    67.         buffer  = recibir(handleSocket);
    68.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    69.         buffer  = recibir(handleSocket);
    70.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    71.  
    72.         // enviar Nick y User
    73.         Commd = ( char * ) No tienes permisos para ver links. Registrate o Entra con tu cuenta(No tienes permisos para ver links. Registrate o Entra con tu cuenta(server.username) + 6, sizeof(char));
    74.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd, "NICK %s", server.username);
    75.         enviar(handleSocket, Commd);
    76.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd);
    77.         Commd = ( char * ) No tienes permisos para ver links. Registrate o Entra con tu cuenta(No tienes permisos para ver links. Registrate o Entra con tu cuenta(server.username)*2 + 13, sizeof(char));
    78.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd, "USER %s * * :%s", server.username, server.username);
    79.         enviar(handleSocket, Commd);
    80.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd);
    81.  
    82.         // recibir banner del inicio del servidor
    83.         buffer  = recibir(handleSocket);
    84.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    85.         buffer  = recibir(handleSocket);
    86.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    87.         buffer  = recibir(handleSocket);
    88.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    89.  
    90.         // enviar mensaje privado al bot
    91.         Commd = ( char * ) No tienes permisos para ver links. Registrate o Entra con tu cuenta(No tienes permisos para ver links. Registrate o Entra con tu cuenta(server.botname) + 14, sizeof(char));
    92.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd, "PRIVMSG %s :!problema1", server.botname);
    93.         enviar(handleSocket, Commd);
    94.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd);
    95.  
    96.         // recibir contenido del mensaje
    97.         buffer  = recibir(handleSocket);
    98.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    99.         result = procesar(buffer, No tienes permisos para ver links. Registrate o Entra con tu cuenta(server.username));
    100.        
    101.  
    102.         // enviar respuesta
    103.         Commd = ( char * ) No tienes permisos para ver links. Registrate o Entra con tu cuenta(No tienes permisos para ver links. Registrate o Entra con tu cuenta(server.botname) + 40, sizeof(char));
    104.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd, "PRIVMSG %s :!problema1 -rep %0.2f", server.botname,result);
    105.         enviar(handleSocket, Commd);
    106.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(Commd);   
    107.  
    108.         // recibir flag
    109.         buffer  = recibir(handleSocket);
    110.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    111.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(buffer);
    112.  
    113.         // cerrar sesion
    114.         enviar(handleSocket, "QUIT :IRC Cool");
    115.  
    116.         // cerrar socket
    117.         close(handleSocket);
    118.  
    119.         return 0;
    120. }
    121.  
    122.  
    123. char * recibir(int handlesock)
    124. {
    125.         char * bufferOut = (char *) No tienes permisos para ver links. Registrate o Entra con tu cuenta(2000, sizeof(char));
    126.         recv(handlesock, bufferOut, 2000,0);
    127.         return bufferOut;
    128. }
    129.  
    130. void enviar(int handlesock,char * command)
    131. {
    132.         char * tempCommand = (char *) No tienes permisos para ver links. Registrate o Entra con tu cuenta(No tienes permisos para ver links. Registrate o Entra con tu cuenta(command)+3, sizeof(char));
    133.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(tempCommand,"%s\r\n",command);
    134.         send(handlesock, tempCommand, No tienes permisos para ver links. Registrate o Entra con tu cuenta(tempCommand),0);
    135.         No tienes permisos para ver links. Registrate o Entra con tu cuenta(tempCommand);
    136. }
    137.  
    138. float procesar(char * buffer , int len_username)
    139. {
    140.         int i = OFFSET_FLAG + len_username + 3;
    141.         int k = 0;
    142.         int numero_1 = 0, numero_2 = 0;
    143.         char numero1[10], numero2[10];
    144.  
    145.         while( buffer[i] != ' ')
    146.         {
    147.                 numero1[k] = buffer[i];
    148.                 k++;
    149.                 i++;
    150.  
    151.         }
    152.  
    153.         i = i + 2;
    154.         k = 0;
    155.  
    156.         while( buffer[i] != '\r')
    157.         {
    158.                 numero2[k] = buffer[i];
    159.                 k++;
    160.                 i++;
    161.  
    162.         }
    163.  
    164.         numero_1 = No tienes permisos para ver links. Registrate o Entra con tu cuenta(numero1);
    165.         numero_2 = No tienes permisos para ver links. Registrate o Entra con tu cuenta(numero2);
    166.  
    167.  
    168.         No tienes permisos para ver links. Registrate o Entra con tu cuenta("\nnumero1 = %i\t", numero_1 );
    169.         No tienes permisos para ver links. Registrate o Entra con tu cuenta("numero2 = %i\t", numero_2 );
    170.         No tienes permisos para ver links. Registrate o Entra con tu cuenta("resultado = %0.2f\n\n", No tienes permisos para ver links. Registrate o Entra con tu cuenta(numero_1) * (float) numero_2);
    171.  
    172.         return No tienes permisos para ver links. Registrate o Entra con tu cuenta(numero_1) * (float) numero_2;
    173. }
    174.  

    EJECUCION


    C# (Visual Studio 2017)

    La clase ClienteIrc se creara y utilizara en el código realizado en C#  para facilitarnos el manejo del protocolo IRC desde el código. Contiene los atributos :

    • dirección = se almacenara la ip del servidor irc donde nos vamos a conectar.
    • puerto = se almacenara el puerto (puerto de uso de irc 6667).
    • SockIrc = es nuestro objeto Socket en cual nos permitira hacer uso del api de red para realizar nuestro socket (System.Net.Socket y System.Net).
    • username = Se almacenara el Nick para el ingreso de IRC
    • recvString = Se almacena el ultimo mensaje recibido por parte del servidor en un string.


    Contiene los metodos:

  • (constructor) ClienteIrc :

    Este método inicializa los atributos de la clase. recibe como parametros la ip, el puerto y el username.


    Se instancia el objeto socket, el constructor recibe los parametros de configuracion del socket, el parametro AddressFamaly es el valor de una enumeración que contiene como valores los esquemas de direcciones que puede usar la clase socket, en este caso se Usara el valor InterNetwork que especifica que es una dirección IP versión 4. Existen otros esquemas de direcciones.


    El parámetro SocketType, recibe el parámetro para el tipo de socket (en este caso STREAM), y el ultimo parámetro recibe el tipo de protocolo a usar (en este caso TCP). Luego se crea un objeto de tipo IPEndPoint el cual nos parseara la ip y el puerto del servidor para podérselo pasar al método de conexion, el constructor de este objeto recibe una una IP la cual se deberá parsear y el puerto. Por ultimo se inicia la conexion Con el método Connect() del socket. Si hay un error en la conexion el try-catch lo recibe.

  • Recibir :

    Este método recibirá los mensajes por parte del servidor. Primeramente de instancia un array de tipo byte (unsigned char) donde se almacenara la información que vamos a enviar por el socket.


    Luego se recibe la respuesta y se almacena la cantidad de bytes leídos, luego de esto debemos convertir el array de byte a un string, para esto se debe tomar el array de byte y Encodearlo (a ASCII) se le envía los parametros 1) array de respuesta byte, 2) el índice de de donde empezara a encodear y 3) es la cantidad de bytes seleccionados (como un offset final).

  • Command :

    Este método sera el encargado de enviar los datos por el socket. recibe como parámetro un string con los "comandos" que se le envia al servidor IRC. Se concatena un "\r\n" ya que en el RFC decía que los finales de un mensaje están marcados por "\r\n".


    Luego se hace lo mismo en el método recibir pero encodeando un string a un array de bytes (recordar ASCII) y se envía el array de bytes por el socket.

  • Close:

    Esta función, libera y setea los recursos del objeto para poder ser utilizado posteriormente. Se envía el comando al IRC para salir de nuestra sesión, se cierra el Socket y se setean los valores "by default"


    Aqui esta la implementacion de la clase y el codigo que soluciona el reto escrito en C#.

    Código: C#
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Net;
    7. using System.Net.Sockets;
    8.  
    9. namespace ircCtf
    10. {
    11.     class Program
    12.     {
    13.         static void Main(string[] args)
    14.         {
    15.             string botInServer = "PepeGrillo";
    16.             ClienteIrc ircclient = No tienes permisos para ver links. Registrate o Entra con tu cuenta ClienteIrc("213.56.152.135",6667,"s0d0maP");
    17.  
    18.             if(ircclient.SockIrc.Connected == true)
    19.             {
    20.                 Console.WriteLine(
    21.                     "\nConectado {0} : {1} : {2}\n",
    22.                     ircclient.direccion,  
    23.                     ircclient.puerto,
    24.                     ircclient.username
    25.                 );
    26.  
    27.                 ircclient.Command(String.Format("NICK {0}",ircclient.username));
    28.                 ircclient.Command(String.Format("USER {0} * * :{0}", ircclient.username));
    29.  
    30.                 for( int i = 0; i<5; i++)
    31.                 {
    32.                     ircclient.Recibir();
    33.                 }
    34.  
    35.                 ircclient.Command(String.Format("PRIVMSG {0} :!ep1", botInServer));
    36.                 ircclient.Recibir();
    37.                 Console.Write("{0}",ircclient.recvString);
    38.  
    39.                 string[] segmentos = ircclient.recvString.Split(':');
    40.                 string[] segmentos2 = segmentos[2].Split(':');
    41.                 string[] tempNum = segmentos2[0].Split('/');
    42.  
    43.                 int num1 = int.Parse(tempNum[0]);
    44.                 int num2 = int.Parse(tempNum[1]);
    45.                 double result = Math.Sqrt(num1) * num2;
    46.  
    47.                 Console.WriteLine(String.Format("PRIVMSG {0} :!problema1 -rep {1}", botInServer, result.ToString("F").Replace(',', '.')));
    48.                 ircclient.Command(String.Format("PRIVMSG {0} :!problema1 -rep {1}", botInServer, result.ToString("F").Replace(',', '.')));
    49.                 ircclient.Recibir();
    50.                 Console.Write("{0}", ircclient.recvString);
    51.  
    52.                 ircclient.SockIrc.Close();
    53.  
    54.                 Console.Read();
    55.             }
    56.  
    57.         }
    58.     }
    59.  
    60.     // clase ClienteIrc
    61.     class ClienteIrc
    62.     {
    63.         public string direccion;
    64.         public Int32 puerto;
    65.         public Socket SockIrc;
    66.         public string username;
    67.         public string recvString;
    68.         public string bot;
    69.  
    70.         public ClienteIrc(string ip, Int32 puerto, string username)
    71.         {
    72.             // inicializar datos
    73.             this.direccion  = ip;
    74.             this.puerto = puerto;
    75.             this.username = username;
    76.  
    77.             try
    78.             {
    79.                 // inicializar socket
    80.                 this.SockIrc = No tienes permisos para ver links. Registrate o Entra con tu cuenta Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    81.                 IPEndPoint dire_socket = No tienes permisos para ver links. Registrate o Entra con tu cuenta IPEndPoint(IPAddress.Parse(this.direccion), this.puerto);
    82.  
    83.                 // realizar conexion
    84.                 this.SockIrc.Connect(dire_socket);
    85.             }
    86.             catch
    87.             {
    88.                 Console.WriteLine("ERROR de conexion");
    89.             }
    90.         }
    91.  
    92.         public void Recibir()
    93.         {
    94.             byte[] respuesta = No tienes permisos para ver links. Registrate o Entra con tu cuenta byte[2000];
    95.             int ret = this.SockIrc.Receive(respuesta);
    96.  
    97.             this.recvString = Encoding.ASCII.GetString(respuesta,0,ret);
    98.         }
    99.  
    100.         public void Command(string command)
    101.         {
    102.             command += "\r\n";
    103.             byte[] datasend = Encoding.ASCII.GetBytes(command);
    104.             this.SockIrc.Send(datasend);
    105.         }
    106.  
    107.         public void Cerrar()
    108.         {
    109.             this.Command("QUIT : IRC Rulez");
    110.             this.recvString = "";
    111.             this.puerto = 0;
    112.             this.username = "";
    113.             this.direccion = "";
    114.             this.SockIrc.Close();
    115.         }
    116.     }
    117. }
    118.  

    Mucha gracias por tomarse el tiempo para leer esto.

    Saludos.

    REFERENCIAS:

    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
    No tienes permisos para ver links. Registrate o Entra con tu cuenta

    FUENTE:
    No tienes permisos para ver links. Registrate o Entra con tu cuenta
« Última modificación: Abril 01, 2018, 09:44:57 pm por s0d0ma »
No tienes permisos para ver links. Registrate o Entra con tu cuenta

 

¿Te gustó el post? COMPARTILO!