Advertisement
Doddy

[C#] Creacion de un IRC Bot

Oct 3rd, 2014
468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.17 KB | None | 0 0
  1. [Titulo] : Creacion de un IRC Bot
  2. [Lenguaje] : C#
  3. [Autor] : Doddy Hackman
  4.  
  5. [Temario]
  6.  
  7. -- =================--------
  8.  
  9. 0x01 : Introduccion
  10. 0x02 : Conectando con el servidor
  11. 0x03 : Listando usuarios
  12. 0x04 : Mandar mensajes
  13. 0x05 : Recibir privados
  14. 0x06 : Reconocer comandos
  15. 0x07 : Testeando
  16.  
  17. -- =================--------
  18.  
  19. 0x01 : Introduccion
  20.  
  21. 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.
  22. 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
  23. para hacking tools.
  24.  
  25. Comencemos ...
  26.  
  27. 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 :
  28.  
  29. [img]http://doddyhackman.webcindario.com/images/makeconsoleirc.jpg[/img]
  30.  
  31. Con el proyecto ya creado pasemos al siguiente punto.
  32.  
  33. 0x02 : Conectando con el servidor
  34.  
  35. Para poder realizar la conexion vamos a necesitar los siguientes namespaces de esta forma :
  36.  
  37. [code]
  38. using System.Net; // Lo usamos para realizar la conexion
  39. using System.Net.Sockets; // Lo mismo que la anterior
  40. using System.IO; // Lo usamos para el manejo con los streams
  41. using System.Text.RegularExpressions; // No es vital pero me encantan el uso de las expresiones regulares
  42. [/code]
  43.  
  44. Para poder realizar la conexion usamos los sockets de la siguiente forma :
  45.  
  46. [code]
  47. NetworkStream conexion; // Establecemos la variable conexion como NetworkStream
  48. TcpClient irc; // Establecemos la variable irc como TcpClient
  49. StreamReader leer_datos; // Establecemos la variable leer_datos como StreamReader
  50. StreamWriter mandar_datos; // Establecemos la variable mandar_datos como SteamWriter
  51.  
  52. string host = "localhost"; // Establecemos la variable string host para tener el host del canal IRC
  53. string nickname = "ClapTrap"; // Establecemos la variable nickname con el nick del bot
  54. string canal = "#locos"; // Establecemos la variable canal con el nombre del canal
  55. string code = ""; // Creamos la variable string que vamos a usar para leer los sockets
  56.  
  57. irc = new TcpClient(host, 6667); // Realizamos la conexion con el canal usando el host y el puerto 6667
  58. conexion = irc.GetStream(); // Cargamos la conexion para poder leer los datos
  59. leer_datos = new StreamReader(conexion); // Lo necesario para leer los datos de la conexion
  60. mandar_datos = new StreamWriter(conexion); // Lo necesario para mandar comandos al canal IRC
  61.  
  62. mandar_datos.WriteLine("NICK " + nickname); // Usamos el comando NICK para entrar al canal usando el nick antes declarado
  63. mandar_datos.Flush(); // Actualizamos la conexion
  64.  
  65. mandar_datos.WriteLine("USER " + nickname + " 1 1 1 1"); // Usamos el comando USER para confirmar el nickname
  66. mandar_datos.Flush(); // ..
  67.  
  68. mandar_datos.WriteLine("JOIN " + canal); // Usamos el comando JOIN para entrar al canal
  69. mandar_datos.Flush(); // ..
  70. [/code]
  71.  
  72. Si quieren probar en otro servidor IRC pueden cambiar los datos de las variables host,nickname,canal para poder acceder a su canal.
  73.  
  74. 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 :
  75.  
  76. [code]
  77. while (true) // Mi bucle eterno
  78. {
  79. while ((code = leer_datos.ReadLine()) != null) // Leemos la conexion con la variable code
  80. {
  81. Console.WriteLine("Code : " + code); // No es necesario pero es para ver las respuestas del servidor
  82.  
  83. Match regex = Regex.Match(code, "PING(.*)", RegexOptions.IgnoreCase); // Detectamos el clasico PING para el PING PONG
  84. // que nos hara el servidor IRC para verificar que estemos ahi y entrar al canal , aunque lo sigo haciendo despues
  85. // para ver que no estemos muerto o algo asi xD
  86. if (regex.Success) // Si se encontro algo
  87. {
  88. string te_doy_pong = "PONG " + regex.Groups[1].Value; // Capturamos lo que esta despues del ping y le damos al pong con los datos
  89. mandar_datos.WriteLine(te_doy_pong); // Mandamos el comando de la variable anterior
  90. mandar_datos.Flush(); // ..
  91. }
  92. }
  93. }
  94. [/code]
  95.  
  96. Con esto ya estamos conectados.
  97.  
  98. 0x03 : Listando usuarios
  99.  
  100. Para poder listar los usuarios agregamos la variabe global "usuarios" al inicio del codigo de la siguiente forma :
  101.  
  102. [code]
  103. static string[] usuarios; // Creamos el string[] usuarios para tener todos los nicks que estan en el canal
  104. [/code]
  105.  
  106. Entonces volvemos al bucle eterno que hicimos con while y agregamos despues del ping pong el siguiente codigo :
  107.  
  108. [code]
  109. regex = Regex.Match(code,":(.*) 353 (.*) = (.*) :(.*)", RegexOptions.IgnoreCase); // Capturamos los usuarios de todo el canal
  110. // con el poder de las expresiones regulares
  111. if (regex.Success) // Si los encontraron
  112. {
  113. string usuarios_lista = regex.Groups[4].Value; // Tenemos la variable con todos los nicks
  114. usuarios = usuarios_lista.Split(' '); // Para mayor comodidad usamos un split para separar todos los espacios vacios que estan entre
  115. // cada nick del canal para despues hacer una lista , que es la primera que declare en el codigo
  116. foreach (string usuario in usuarios) // Usamos un for each para leer la lista usuarios y mostrar cada nick en la variable usuario
  117. {
  118. Console.WriteLine("[+] User : "+usuario); // Mostramos cada user
  119. }
  120. }
  121. [/code]
  122.  
  123. 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.
  124.  
  125. 0x04 : Mandar mensajes
  126.  
  127. Esta es una parte corta , para mandar un mensaje al canal de forma publica tenemos que usar el siguiente comando :
  128.  
  129. [code]
  130. PRIVMSG #locos Mensaje
  131. [/code]
  132.  
  133. Un ejemplo usando C# al cual deben agregar obviamente despues del blucle while() :
  134.  
  135. [code]
  136. mandar_datos.WriteLine("PRIVMSG" + " " + canal + " " + "Hi World"); // Mandamos un mensaje al canal
  137. mandar_datos.Flush(); // ..
  138. [/code]
  139.  
  140. 0x05 : Recibir privados
  141.  
  142. 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() :
  143.  
  144. [code]
  145. regex = Regex.Match(code, ":(.*)!(.*) PRIVMSG (.*) :(.*)", RegexOptions.IgnoreCase); // Lo usamos para detectar los mensajes privados y publicos
  146. if (regex.Success) // Si se encontro algo
  147. {
  148.  
  149. mandar_datos.WriteLine("PRIVMSG" + " " + canal + " " + "Hi World"); // Mandamos un mensaje al canal
  150. mandar_datos.Flush(); // ..
  151.  
  152. string dedonde = regex.Groups[1].Value; // Se detecta la procedencia del mensaje
  153. string mensaje = regex.Groups[4].Value; // El mensaje en si
  154. if (dedonde != canal) // Si la procedencia del mensaje no es el canal en si activamos esta condicion , cabe aclarar que si es el canal
  155. // el que nos mando el mensaje es un mensaje PUBLICO , caso contrario es PRIVADO
  156. {
  157. Console.WriteLine("[+] "+dedonde+" dice : "+mensaje); // Mostramos el dueño del mensaje y el mensaje
  158. }
  159. }
  160. [/code]
  161.  
  162. 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.
  163.  
  164. 0x06 : Reconocer comandos
  165.  
  166. 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 :
  167.  
  168. [code]
  169. regex = Regex.Match(code, ":(.*)!(.*) PRIVMSG (.*) :(.*)", RegexOptions.IgnoreCase); // Lo usamos para detectar los mensajes privados y publicos
  170. if (regex.Success) // Si se encontro algo
  171. {
  172. string dedonde = regex.Groups[1].Value; // Se detecta la procedencia del mensaje
  173. string mensaje = regex.Groups[4].Value; // El mensaje en si
  174. if (dedonde != canal) // Si la procedencia del mensaje no es el canal en si activamos esta condicion , cabe aclarar que si es el canal
  175. // el que nos mando el mensaje es un mensaje PUBLICO , caso contrario es PRIVADO
  176. {
  177. Match regex_ordenes = Regex.Match(mensaje, "!spam (.*) (.*)", RegexOptions.IgnoreCase); // Esta es la orden !spam con los (.*)
  178. // detectamos los dos comandos que son <nick> <mensaje>
  179. if (regex_ordenes.Success) // Si se encontro algo
  180. {
  181. mandar_datos.WriteLine("PRIVMSG" + " " + dedonde + " " + "[+] Sure"); // Le decimos al nick dueño del bot que si
  182. mandar_datos.Flush(); // ..
  183. System.Threading.Thread.Sleep(5000); // Usamos Thread.Sleep para esperar 5 segundos y fingir que hacemos algo interesante xD
  184. mandar_datos.WriteLine("PRIVMSG" + " " + regex_ordenes.Groups[1].Value + " " + regex_ordenes.Groups[2].Value); // Mandamos
  185. // un mensaje al usuario especificado con el mensaje que pedimos
  186. mandar_datos.Flush(); // ..
  187. mandar_datos.WriteLine("PRIVMSG" + " " + dedonde + " " + "[+] Finished"); // Le decimos al dueño del bot que terminamos
  188. mandar_datos.Flush(); // ..
  189. }
  190. }
  191. }
  192. [/code]
  193.  
  194. 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.
  195.  
  196. 0x07 : Testeando
  197.  
  198. Hemos llegado al final de este corto manual , les deberia haber quedado el codigo de esta forma :
  199.  
  200. [code]
  201. // Ejemplo de IRC Bot
  202. // Written By Doddy Hackman in the year 2014
  203.  
  204. using System;
  205. using System.Collections.Generic;
  206. using System.Text;
  207.  
  208. using System.Net; // Lo usamos para realizar la conexion
  209. using System.Net.Sockets; // Lo mismo que la anterior
  210. using System.IO; // Lo usamos para el manejo con los streams
  211. using System.Text.RegularExpressions; // No es vital pero me encantan el uso de las expresiones regulares
  212.  
  213. namespace irc
  214. {
  215. class Program
  216. {
  217. static string[] usuarios; // Creamos el string[] usuarios para tener todos los nicks que estan en el canal
  218.  
  219. static void Main(string[] args)
  220. {
  221. NetworkStream conexion; // Establecemos la variable conexion como NetworkStream
  222. TcpClient irc; // Establecemos la variable irc como TcpClient
  223. StreamReader leer_datos; // Establecemos la variable leer_datos como StreamReader
  224. StreamWriter mandar_datos; // Establecemos la variable mandar_datos como SteamWriter
  225.  
  226. string host = "localhost"; // Establecemos la variable string host para tener el host del canal IRC
  227. string nickname = "ClapTrap"; // Establecemos la variable nickname con el nick del bot
  228. string canal = "#locos"; // Establecemos la variable canal con el nombre del canal
  229. string code = ""; // Creamos la variable string que vamos a usar para leer los sockets
  230.  
  231. irc = new TcpClient(host, 6667); // Realizamos la conexion con el canal usando el host y el puerto 6667
  232. conexion = irc.GetStream(); // Cargamos la conexion para poder leer los datos
  233. leer_datos = new StreamReader(conexion); // Lo necesario para leer los datos de la conexion
  234. mandar_datos = new StreamWriter(conexion); // Lo necesario para mandar comandos al canal IRC
  235.  
  236. mandar_datos.WriteLine("NICK " + nickname); // Usamos el comando NICK para entrar al canal usando el nick antes declarado
  237. mandar_datos.Flush(); // Actualizamos la conexion
  238.  
  239. mandar_datos.WriteLine("USER " + nickname + " 1 1 1 1"); // Usamos el comando USER para confirmar el nickname
  240. mandar_datos.Flush(); // ..
  241.  
  242. mandar_datos.WriteLine("JOIN " + canal); // Usamos el comando JOIN para entrar al canal
  243. mandar_datos.Flush(); // ..
  244.  
  245. while (true) // Mi bucle enterno
  246. {
  247. while ((code = leer_datos.ReadLine()) != null) // Leemos la conexion con la variable code
  248. {
  249. Console.WriteLine("Code : " + code); // No es necesario pero es para ver las respuestas del servidor
  250.  
  251. Match regex = Regex.Match(code, "PING(.*)", RegexOptions.IgnoreCase); // Detectamos el clasico PING para el PING PONG
  252. // que nos hara el servidor IRC para verificar que estemos ahi y entrar al canal , aunque lo sigo haciendo despues
  253. // para ver que no estemos muerto o algo asi xD
  254. if (regex.Success) // Si se encontro algo
  255. {
  256. string te_doy_pong = "PONG " + regex.Groups[1].Value; // Capturamos lo que esta despues del ping y le damos al pong con los datos
  257. mandar_datos.WriteLine(te_doy_pong); // Mandamos el comando de la variable anterior
  258. mandar_datos.Flush(); // ..
  259. }
  260.  
  261. regex = Regex.Match(code,":(.*) 353 (.*) = (.*) :(.*)", RegexOptions.IgnoreCase); // Capturamos los usuarios de todo el canal
  262. // con el poder de las expresiones regulares
  263. if (regex.Success) // Si los encontraron
  264. {
  265. string usuarios_lista = regex.Groups[4].Value; // Tenemos la variable con todos los nicks
  266. usuarios = usuarios_lista.Split(' '); // Para mayor comodidad usamos un split para separar todos los espacios vacios que estan entre
  267. // cada nick del canal para despues hacer una lista , que es la primera que declare en el codigo
  268. foreach (string usuario in usuarios) // Usamos un for each para leer la lista usuarios y mostrar cada nick en la variable usuario
  269. {
  270. Console.WriteLine("[+] User : "+usuario); // Mostramos cada user
  271. }
  272. }
  273.  
  274. regex = Regex.Match(code, ":(.*)!(.*) PRIVMSG (.*) :(.*)", RegexOptions.IgnoreCase); // Lo usamos para detectar los mensajes privados y publicos
  275. if (regex.Success) // Si se encontro algo
  276. {
  277.  
  278. mandar_datos.WriteLine("PRIVMSG" + " " + canal + " " + "Hi World"); // Mandamos un mensaje al canal
  279. mandar_datos.Flush(); // ..
  280.  
  281. string dedonde = regex.Groups[1].Value; // Se detecta la procedencia del mensaje
  282. string mensaje = regex.Groups[4].Value; // El mensaje en si
  283. if (dedonde != canal) // Si la procedencia del mensaje no es el canal en si activamos esta condicion , cabe aclarar que si es el canal
  284. // el que nos mando el mensaje es un mensaje PUBLICO , caso contrario es PRIVADO
  285. {
  286. Console.WriteLine("[+] "+dedonde+" dice : "+mensaje); // Mostramos el dueño del mensaje y el mensaje
  287. Match regex_ordenes = Regex.Match(mensaje, "!spam (.*) (.*)", RegexOptions.IgnoreCase); // Esta es la orden !spam con los (.*)
  288. // detectamos los dos comandos que son <nick> <mensaje>
  289. if (regex_ordenes.Success) // Si se encontro algo
  290. {
  291. mandar_datos.WriteLine("PRIVMSG" + " " + regex_ordenes.Groups[1].Value + " " + regex_ordenes.Groups[2].Value); // Mandamos
  292. // un mensaje al usuario especificado con el mensaje que pedimos
  293. mandar_datos.Flush(); // ..
  294. }
  295. }
  296. }
  297. }
  298. }
  299. }
  300. }
  301. }
  302.  
  303. // The End ?
  304. [/code]
  305.  
  306. Unas imagenes :
  307.  
  308. [img]http://doddyhackman.webcindario.com/images/ircbotcsharp1.jpg[/img]
  309.  
  310. [img]http://doddyhackman.webcindario.com/images/ircbotcsharp2.jpg[/img]
  311.  
  312. [img]http://doddyhackman.webcindario.com/images/ircbotcsharp3.jpg[/img]
  313.  
  314. --========--
  315. The End ?
  316. --========--
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement