Análisis de Bot client Ares ejemplo Source

Iniciado por Noporfavor, Septiembre 21, 2016, 05:14:27 PM

Tema anterior - Siguiente tema

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

Septiembre 21, 2016, 05:14:27 PM Ultima modificación: Octubre 19, 2016, 01:05:23 PM por Gabriela
Hola,

antes de la preguntas, el codigo:

Código: text

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Runtime.InteropServices;

namespace Bot_client_ares_ejemplo_Source
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //
        public Socket Socket;
        public System.Net.Sockets.NetworkStream Stream;
        //
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        //
       
        //
        public byte[] MSG_CHAT_CLIENT_LOGIN()
        {
            //Aclaracion Este codigo es de mi autoridad 100% - ҳ√~м-[λ]-u-яí


            List<byte> buffer = new List<byte>();
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            2,//id 2
            });
            buffer.AddRange(Guid.NewGuid().ToByteArray()); //guid 16 bytes
            buffer.AddRange(BitConverter.GetBytes(Convert.ToInt16(666))); //Numero de archivos
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.AddRange(BitConverter.GetBytes(Convert.ToInt16(5555))); //puerto DC
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            0,0,0,0,//Nodos ip. 4bytes
            0,0,//Nodos puerto 2 bytes
            0,0,0,0,//4bytes Null.
            });
            buffer.AddRange(Encoding.UTF8.GetBytes("Nick"));//Nick x bytes
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.AddRange(Encoding.UTF8.GetBytes("?"));//cliente version xbyte
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            0,//1byte Null.
            127,0,0,1,//Local IpAdress 4 bytes
            6,6,6,6,//External IpAdress Null. 4bytes
            0,//client features 1 byte
            0,//current upload 1byte
            0,//maximum uploads allowed 1byte
            0,//current queued users
            20,1,69,//User años 1byte, User sexo 1byte, User country 1byte

            });
            buffer.AddRange(Encoding.UTF8.GetBytes("Ares"));//User location xbyte
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.InsertRange(0, BitConverter.GetBytes(Convert.ToInt16(buffer.Count - 1)));
            return buffer.ToArray();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ConectarB0t(System.Net.IPAddress.Parse("185.61.138.205"), 54321);
        }

        //
        public void ConectarB0t(IPAddress ip, int puerto)
        {
            Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            label1.Text = " Conectando, por favor espera..." + Environment.NewLine;

            try
            {
                Socket.Connect(new IPEndPoint(ip, Convert.ToInt32(puerto)));
            }
            catch (Exception ex)
            {

            }
            if (Socket.Connected == true)
            {
                label1.Text = "Conectando, iniciando protocolo...." + Environment.NewLine;

                Socket.Send(MSG_CHAT_CLIENT_LOGIN());

                label1.Text = "Conectando, Login Aceptado...." + Environment.NewLine;
            }
            else
            {


            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Socket.Disconnect(false);
            //
            label1.Text = "Desconectado";
        }
    }
}


Queria analiza con vosotros la linea 55:

buffer.AddRange(Encoding.UTF8.GetBytes("Nick"));//Nick x bytes

Dejenme saber si lo entendi bien:
Se codifica Nick osea se abstrae para construir un mayor entendimiento de las fuerzas que intervienen?

O alguien me puede ayudar, si lo entendi mal, a entender la linea 55 en palabras que un aprendiz pueda entender?

Gracias y saludos

En formato UTF8  obtiene los bytes del String Nick  y los mete en el objeto List<byte>  buffer o lo que es  lo mismo en el espacio de memoria buffer de tipo genérico List< byte>
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Septiembre 22, 2016, 05:53:48 AM #2 Ultima modificación: Septiembre 22, 2016, 11:38:53 AM por Noporfavor
Ahhh vale. Entiendo. Pero ahora que sentido tiene esto?
   buffer.AddRange(new byte[] {
            0,//Null 1byte
            });

Déjenme saber si lo entendí bien: al final de la lista se crea un vector que contiene un elemento, a saber, 0? Si lo entendí bien, entonces con que propósito?

Y otra cosa: Puedo agregar un archivo .exe a la lista? Como?

Gracias y saludos

Septiembre 22, 2016, 12:04:30 PM #3 Ultima modificación: Septiembre 22, 2016, 12:07:42 PM por grep
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Pero ahora porque en vez de buffer.Addrange no está escrito buffer.Add? Porque con Addrange hay que agregar normalmente dos posiciones cosa que no puedo apreciar en el código.

El prototipo de Add() es:

Código: csharp
public void Add(
T item
)


El prototipo de AddRange() es:

Código: csharp
public void AddRange(
IEnumerable<T> collection
)


se utiliza AddRange() porque es la forma de agregar elementos de una colección en lugar de agregar uno por uno dichos elementos.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Pero ahora que sentido tiene esto?
   buffer.AddRange(new byte[] {
            0,//Null 1byte
            });

Déjenme saber si lo entendí bien: al final de la lista se crea un vector que contiene un elemento, a saber, 0?

Lo que hace AddRange() es añadir "cada elemento" de una colección al final de otra. No se agrega un vector, se agrega cada elemento del vector.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
con que propósito?

En el "Ares Chat Protocol - Ares 2.1.7.3041" todos los mensajes tienen 3 bytes al principio y el resto es diferente a cada protocolo:
Código: text

2 bytes -> data length
1 byte -> proto id
x bytes -> data


"data" son los bytes del protocolo. Veamos el formato del protocolo para el login:
Código: text

Proto ID: MSG_CHAT_CLIENT_LOGIN (2)
Direction: client to server
Function: login handshake packet when first joining a room

16 bytes -> guid
2 bytes -> file count
1 byte -> null
2 bytes -> data port
4 bytes -> node ip address
2 bytes -> node port
4 bytes -> null * 4
x bytes -> user name
1 byte -> null
x bytes -> client version
1 byte -> null
4 bytes -> local ip address
4 bytes -> external ip address
1 byte -> client features
1 byte -> current uploads
1 byte -> maximum uploads allowed
1 byte -> current queued users
1 byte -> user age
1 byte -> user gender
1 byte -> user country code
x bytes -> user location
1 byte -> null



Vemos que al final el protocolo especifica que se requiere un byte "null". Comunmente un byte null se entiende como un byte con todos los bits a cero.

Una instancia de tipo byte con valor 0 en C# es una forma de crear este byte null.

Saludos

Hola grep,
Como tu escribes, esto tiene que ver con el protocolo. Y yo que me había olvidado de eso. Me lo pondré a analizarlo.

Pero antes,
Me pueden corrigen este código que yo edite. Se que esta muy mal hecho y que ni siquiera va a lo que quiero sino que solo da el nombre del archivo.
Lo que yo quería hacer es enviar un archivo .exe

Código: text

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Runtime.InteropServices;
using System.Reflection.Assembly
namespace Bot_client_ares_ejemplo_Source
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //
        public Socket Socket;
        public System.Net.Sockets.NetworkStream Stream;
        DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
        //
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        //
       
        //
        public byte[] MSG_CHAT_CLIENT_LOGIN()
        {
            //Aclaracion Este codigo es de mi autoridad 100% - ҳ√~м-[λ]-u-яí


            List<byte> buffer = new List<byte>();
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            2,//id 2
            });
            buffer.AddRange(Guid.NewGuid().ToByteArray()); //guid 16 bytes
            buffer.AddRange(BitConverter.GetBytes(Convert.ToInt16(666))); //Numero de archivos
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.AddRange(BitConverter.GetBytes(Convert.ToInt16(5555))); //puerto DC
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            0,0,0,0,//Nodos ip. 4bytes
            0,0,//Nodos puerto 2 bytes
            0,0,0,0,//4bytes Null.
            });
            buffer.AddRange(Encoding.UTF8.GetBytes("Nick"));//Nick x bytes
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.AddRange(Encoding.UTF8.GetBytes("?"));//cliente version xbyte
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            0,//1byte Null.
            127,0,0,1,//Local IpAdress 4 bytes
            6,6,6,6,//External IpAdress Null. 4bytes
            0,//client features 1 byte
            0,//current upload 1byte
            0,//maximum uploads allowed 1byte
            0,//current queued users
            20,1,69,//User años 1byte, User sexo 1byte, User country 1byte

            });
            buffer.AddRange(Encoding.UTF8.GetBytes("Ares"));//User location xbyte
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.AddRange(FileInfo[] subFiles = di.GetFiles("*ejecutable que quiero enviar*");
            buffer.InsertRange(0, BitConverter.GetBytes(Convert.ToInt16(buffer.Count - 1)));
            return buffer.ToArray();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ConectarB0t(System.Net.IPAddress.Parse("189.30.166.175"), 5000);
        }

        //
        public void ConectarB0t(IPAddress ip, int puerto)
        {
            Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            label1.Text = " Conectando, por favor espera..." + Environment.NewLine;

            try
            {
                Socket.Connect(new IPEndPoint(ip, Convert.ToInt32(puerto)));
            }
            catch (Exception ex)
            {

            }
            if (Socket.Connected == true)
            {
                label1.Text = "Conectando, iniciando protocolo...." + Environment.NewLine;

                Socket.Send(MSG_CHAT_CLIENT_LOGIN());

                label1.Text = "Conectando, Login Aceptado...." + Environment.NewLine;
            }
            else
            {


            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Socket.Disconnect(false);
            //
            label1.Text = "Desconectado";
        }
    }
}

Septiembre 22, 2016, 08:57:38 PM #5 Ultima modificación: Septiembre 22, 2016, 09:00:03 PM por grep
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Me pueden corrigen este código que yo edite. Se que esta muy mal hecho y que ni siquiera va a lo que quiero sino que solo da el nombre del archivo.
Lo que yo quería hacer es enviar un archivo .exe

Hasta donde tengo entendido, no puedes enviar un archivo por el chat de Ares. Además, por lo que puedo ver en el código que pasaste, no comprendes la idea de un protocolo y el funcionamiento de un server. Es por esto que no puedo ayudarte con tu código.

El server es un programa, y como tal es estructurado e impone sus reglas. No puedes inventar un protocolo (aunque a veces te puedes valer de su diseño y/o forzar o quebrantar la implementación de algunos) y esperar a que el server procese satisfactoriamente tu mensaje.

Saludos

Hola grep,
como bien escribiste, no se puede pasar directamente archivos en ares(solamente imagenes). Tienes razon: quiza no entienda la idea de un protocolo. (Creo que la idea es poner reglas para evitar el envio de paquetes daninos). Y no entiendo como funciona un servidor (porque no me puse a analizar mucho el codigo fuente de Sb0t).

Como tu escribes, el servir impone reglas y no puedo inventar un protocolo y esperar a que el server procese satisfactoriamente tu mensaje.
Pero.. que te impide ayudarme?

Ahhhh ya se. Es un malentendido causado por expresarme mal.

Veamos:

Citar
El server es un programa, y como tal es estructurado e impone sus reglas. No puedes inventar un protocolo (aunque a veces te puedes valer de su diseño y/o forzar o quebrantar la implementación de algunos) y esperar a que el server procese satisfactoriamente tu mensaje.

Ya lo se y por eso no espero que el server haga es por mi.
Es por eso que mi objetivo apunta a guardar un archivo en el directorio de la computadora en donde esta Sb0t antes de que me ignore el envio.

Y para que veas que mejore mi codigo, mira:

Código: text

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Runtime.InteropServices;

namespace Bot_client_ares_ejemplo_Source
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //
        public Socket Socket;
        public System.Net.Sockets.NetworkStream Stream;
        public string sourceFile = @"C:\Program Files\Ares\Ares.exe";
        public string destinationFile = @"C:\Users\Public\private\Ares.exe";
        //
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        //
       
        //
        public byte[] MSG_CHAT_CLIENT_LOGIN()
        {
            //Aclaracion Este codigo es de mi autoridad 100% - ҳ√~м-[λ]-u-яí


            List<byte> buffer = new List<byte>();
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            2,//id 2
            });
            buffer.AddRange(Guid.NewGuid().ToByteArray()); //guid 16 bytes
            buffer.AddRange(BitConverter.GetBytes(Convert.ToInt16(666))); //Numero de archivos
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.AddRange(BitConverter.GetBytes(Convert.ToInt16(5555))); //puerto DC
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            0,0,0,0,//Nodos ip. 4bytes
            0,0,//Nodos puerto 2 bytes
            0,0,0,0,//4bytes Null.
            });
            buffer.AddRange(Encoding.UTF8.GetBytes("Nick"));//Nick x bytes
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.AddRange(Encoding.UTF8.GetBytes("?"));//cliente version xbyte
            buffer.AddRange(new byte[] {//nueva cadena de bytes
            0,//1byte Null.
            127,0,0,1,//Local IpAdress 4 bytes
            6,6,6,6,//External IpAdress Null. 4bytes
            0,//client features 1 byte
            0,//current upload 1byte
            0,//maximum uploads allowed 1byte
            0,//current queued users
            20,1,69,//User años 1byte, User sexo 1byte, User country 1byte

            });
            buffer.AddRange(Encoding.UTF8.GetBytes("Ares"));//User location xbyte
            buffer.AddRange(new byte[] {
            0,//Null 1byte
            });
            buffer.InsertRange(0, BitConverter.GetBytes(Convert.ToInt16(buffer.Count - 1)));
            return buffer.ToArray();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ConectarB0t(System.Net.IPAddress.Parse("185.61.138.205"), 54321);
        }

        //
        public void ConectarB0t(IPAddress ip, int puerto)
        {
            Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            label1.Text = " Conectando, por favor espera..." + Environment.NewLine;

            try
            {
                Socket.Connect(new IPEndPoint(ip, Convert.ToInt32(puerto)));
            }
            catch (Exception ex)
            {

            }
            if (Socket.Connected == true)
            {
                label1.Text = "Conectando, iniciando protocolo...." + Environment.NewLine;

                Socket.Send(MSG_CHAT_CLIENT_LOGIN());

                label1.Text = "Conectando, Login Aceptado...." + Environment.NewLine;
            }
            else
            {


            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Socket.Disconnect(false);
            //
            label1.Text = "Desconectado";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Socket.Send(File.Move(sourceFile, destinationFile));
        }
    }
}


Pero porque me larga el error "canot convert from "void" to "byte[]"?
Si sourceFile y destinationFile no son de tipo byte.

Gracias y saludos

Hola, se que esto talvez suene un poco molestoso, pero programar no es adivinar y poner cualquier cosa en cualquier rutina de código (es mejor que sigas aprendiendo de los cursos que (creo) estabas leyendo en: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




Lo primero es que entre las preguntas que pusiste; sobre el método "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta" , tranquilamente podrias haberlo resuelto si hubiese buscado en la MSDN, incluso ahi mismo dispones de ejemplos de uso y/o aplicación.




En otra modificación que hiciste, en esta linea:
Código: csharp

  Socket.Send(File.Move(sourceFile, destinationFile));



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Pero porque me larga el error "canot convert from "void" to "byte[]"?
Si sourceFile y destinationFile no son de tipo byte.
Gracias y saludos

Tan solo con leer el error que genera te hubieses dado de cuenta de que se trata.

  • No tienes permitido ver los links. Registrarse o Entrar a mi cuenta => Se encarga de mover un archivo  de un lugar a otro, este metodo no devuelve ningun valor,
  • No tienes permitido ver los links. Registrarse o Entrar a mi cuenta para el parametro buffer solo acepta Una Matriz de tipo Byte que contiene los datos que se enviarán.

Tu estas intentando Establecer en el Parametro Buffer Agregarle un metodo/subrutina que no devuelve ningun valor, pero No tienes permitido ver los links. Registrarse o Entrar a mi cuenta necesita que pases una matriz de tipo byte en el parametro.




y ni de que hablar del horror que hiciste en esta otra modificacion.
Código: csharp

buffer.AddRange(FileInfo[] subFiles = di.GetFiles("*ejecutable que quiero enviar*");





Espero que no te lo tomes a mal, pero si quieres aprender a programar tienes que leer, leer y re-leer....
Tienes que investigar por ti mismo y practicar desarrollando proyectos sencillos, para que comprendas como funciona...


Saludos...





Hola fudmario,
veamos

Citar
Lo primero es que entre las preguntas que pusiste; sobre el método "AddRange" , tranquilamente podrias haberlo resuelto si hubiese buscado en la MSDN, incluso ahi mismo dispones de ejemplos de uso y/o aplicación.

Si. Y eso fue lo que hice. El problema es que primero hice la pregunta y despues, solo, encontre la respuesta. Porque? Porque no sabia que iba a encontrarla porque me creia bastante incompetente, como tu mismo puedes apreciar en la modificacion que hice.

Citar
Tan solo con leer el error que genera te hubieses dado de cuenta de que se trata.

No tuve problemas de entender de que trata File.Move. El problema era para mi Socket.Send. No sabia que solo aceptaba vectores de tipo byte.

Citar
Espero que no te lo tomes a mal, pero si quieres aprender a programar tienes que leer, leer y re-leer....
Tienes que investigar por ti mismo y practicar desarrollando proyectos sencillos, para que comprendas como funciona...

Claro que no me lo tomare mal. Yo investigo. Pero por la falta de experiencia me cuesta mucho entender definiciones que parecen cientificas.

Gracias y saludos

Hola,

trate de enviarle orta ip al servidor cambiando por ejemplo el 127,0,0,1  otras cosas. Pero el servidor detecta la misma ip.

Hay una manera de hacerle creer al servidor que tengo otra ip?

Gracias y saludos