Forum » Programska oprema » Keylogger
Keylogger
Blisk ::
A obstaja kak program, ki bi mi ob pritisku na katerokoli tipko naredil en TXT fajl.
Ne rabim vedeti katera tipka je bila pritisnjena, ne stavkov, nič, samo da se naredi naprimer datoteka keyboard.txt.
Imam sicer tole skripto ki sem jo predelal iz powershell ampak jo antivirus zazna kot keylogger in je ne pusti izvajati.
Dal sem jo tudi v izjemo ampak ne pomaga.
Torej rabim preprosto skripto ali program, ki mi ob pritisku katerekoli tipke na tipkovnici oz. vsaj črke in številke naredi txt fajl. Če bi zadeva zaznala še premikanje miške bi bilo odlično!
Ne rabim vedeti katera tipka je bila pritisnjena, ne stavkov, nič, samo da se naredi naprimer datoteka keyboard.txt.
Imam sicer tole skripto ki sem jo predelal iz powershell ampak jo antivirus zazna kot keylogger in je ne pusti izvajati.
Dal sem jo tudi v izjemo ampak ne pomaga.
Torej rabim preprosto skripto ali program, ki mi ob pritisku katerekoli tipke na tipkovnici oz. vsaj črke in številke naredi txt fajl. Če bi zadeva zaznala še premikanje miške bi bilo odlično!
function Test($logPath="D:\test\keyboard.txt") { # API declaration $APIsignatures = @' [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); '@ $API = Add-Type -MemberDefinition $APIsignatures -Name 'Win32' -Namespace API -PassThru # output file while ($true) { Start-Sleep -Milliseconds 40 for ($ascii = 9; $ascii -le 254; $ascii++) { # get key state $keystate = $API::GetAsyncKeyState($ascii) # if key pressed if ($keystate -eq -32767) { $null = [console]::CapsLock # translate code $virtualKey = $API::MapVirtualKey($ascii, 3) # get keyboard state and create stringbuilder $kbstate = New-Object Byte[] 256 $checkkbstate = $API::GetKeyboardState($kbstate) $loggedchar = New-Object -TypeName System.Text.StringBuilder # translate virtual key if ($API::ToUnicode($ascii, $virtualKey, $kbstate, $loggedchar, $loggedchar.Capacity, 0)) { #if success, add key to logger file [System.IO.File]::($no_output = New-Item -Path $logPath -ItemType File -Force) } } } } } test exit
- predlagalo izbris: zee ()
Blisk ::
LilStalker je izjavil:
Kaj pa imaš to za ene poredne načrte?
Nobenih porednih načrtov, pač pa ko je računalnik v uporabi se ne sme pognati program za backup, ker sicer ga full upočasni.
Zato pa ne rabim vedet kaj se tipka in počne, ampak samo če so tipke v uporabi in miška oz. če nekdo dela na računalniku.
Task Scheduler ne pride v poštev.
Kolk denarja da mi tole nekdo sprogramira?
Zgodovina sprememb…
- spremenil: Blisk ()
Gagatronix ::
Kaksnega calla za idle time pa ni ? Recimo nekaj takega, ki preverja ce se lahko sprozi screensaver. Ker to bi ti konkretno olajsalo zadeve.
OrkAA ::
Premisli, ce ti bo to res resilo problem. Ko bos enkrat zaznal, da je racunalnik idle, se bos moral odlocit kako hitro se backup lahko zacne. Po 5 minutah? eni uri? Kaj se zgodi, ko prides nazaj do racunalnika in backup program dela? Ga bos lahko dal na pavzo?
Jaz bi najprej pogledal, ce lahko programu omejis I/O priority. Torej, das mu najnizjo mozno prioriteto, kar pomeni, da bodo tvoje akcije vedno imele prednost pri uporabi diska/cpuja.
Druga moznost je, da uporabis program, ki ima take funkcije ze vgrajene - https://support.code42.com/Administrato...
Jaz bi najprej pogledal, ce lahko programu omejis I/O priority. Torej, das mu najnizjo mozno prioriteto, kar pomeni, da bodo tvoje akcije vedno imele prednost pri uporabi diska/cpuja.
Druga moznost je, da uporabis program, ki ima take funkcije ze vgrajene - https://support.code42.com/Administrato...
Blisk ::
kar rabim je en exe fajl, ki ga poženem, kakorkoli že in dela kot proces v ozadju in preverja, če je kakšna tipka pritisnjena ali če se miška premika, ko zazna karkoli od tega naredi en txt fajl, ko naprimer 30 min. ni več aktivnosti, pobriše ta txt fajl.
to je vse, pa exe fajl bi moral prebrati nastavitve.cfg kjer bi določil kam se naj shrani ta txt fajl (pot) in koliko časa obstaja ta txt fajl ko ni več aktivnosti (ko je fajl star 30 min naprimer).
Pa še ena stvar je, če tale exe laufa in bi hotel še 1x zagnati ta exe se ne bi zagnal, se pravi dela samo 1 proces v ozadju. In delati mora na win7
to je vse.
vse to smo že probal pa ne gre, ne morem uporabljati drugih zadev ker je to ena specifična zadeva in sem omejen s tem kar imam.
Ko prideš nazaj pa če se backup dela mašine ne moreš uporabljati, ker ne gre, prekinit backup pa ne moreš.
tako da dejansko rabim en exe ki bo deloval kot process v ozadju ko ga poženem.
to je vse, pa exe fajl bi moral prebrati nastavitve.cfg kjer bi določil kam se naj shrani ta txt fajl (pot) in koliko časa obstaja ta txt fajl ko ni več aktivnosti (ko je fajl star 30 min naprimer).
Pa še ena stvar je, če tale exe laufa in bi hotel še 1x zagnati ta exe se ne bi zagnal, se pravi dela samo 1 proces v ozadju. In delati mora na win7
to je vse.
Premisli, ce ti bo to res resilo problem. Ko bos enkrat zaznal, da je racunalnik idle, se bos moral odlocit kako hitro se backup lahko zacne. Po 5 minutah? eni uri? Kaj se zgodi, ko prides nazaj do racunalnika in backup program dela? Ga bos lahko dal na pavzo?
Jaz bi najprej pogledal, ce lahko programu omejis I/O priority. Torej, das mu najnizjo mozno prioriteto, kar pomeni, da bodo tvoje akcije vedno imele prednost pri uporabi diska/cpuja.
Druga moznost je, da uporabis program, ki ima take funkcije ze vgrajene - https://support.code42.com/Administrato...
vse to smo že probal pa ne gre, ne morem uporabljati drugih zadev ker je to ena specifična zadeva in sem omejen s tem kar imam.
Ko prideš nazaj pa če se backup dela mašine ne moreš uporabljati, ker ne gre, prekinit backup pa ne moreš.
tako da dejansko rabim en exe ki bo deloval kot process v ozadju ko ga poženem.
Zgodovina sprememb…
- spremenil: Blisk ()
darkolord ::
Čisto na hitro, najbolj basic varianta, zaznava premikanje miške ali tipkovnice (no, ne premikanje tipkovnice, ampak tipkanje po njej):
Prva vrstica v nastavitve.cfg je ime fajla, ki naj se kreira; druga vrstica je idle čas v sekundah, po katerem se ta fajl izbriše.
using System.Runtime.InteropServices; using System.Threading.Tasks;
[DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); [MarshalAs(UnmanagedType.U4)] public UInt32 cbSize; [MarshalAs(UnmanagedType.U4)] public UInt32 dwTime; } static uint GetLastInputTime() { uint idleTime = 0; LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo); lastInputInfo.dwTime = 0; uint envTicks = (uint)Environment.TickCount; if (GetLastInputInfo(ref lastInputInfo)) { uint lastInputTick = lastInputInfo.dwTime; idleTime = envTicks - lastInputTick; } return ((idleTime > 0) ? (idleTime / 1000) : 0); } private uint _lastInputTime; private bool _idle = false; private string _fileName; private int _idleTime = 1800; void Main() { var cfg = File.ReadAllLines("nastavitve.cfg"); _fileName = cfg[0]; int.TryParse(cfg[1], out _idleTime); _lastInputTime = GetLastInputTime(); while (true) { var inputTime = GetLastInputTime(); if (_idle && inputTime - _lastInputTime < 1) { _idle = false; File.Create(_fileName).Close(); } if (!_idle && inputTime - _lastInputTime > 5) { _idle = true; if (File.Exists(_fileName)) File.Delete(_fileName); } Thread.Sleep(1000); } }
Prva vrstica v nastavitve.cfg je ime fajla, ki naj se kreira; druga vrstica je idle čas v sekundah, po katerem se ta fajl izbriše.
Zgodovina sprememb…
- spremenilo: darkolord ()
Blisk ::
hvala za tole, predvidevam da je powershell skripta.
samo pri meni ne deluje, zaradi nekih napak
datoteka nastavitve.cfg
E:\A\test.txt
50000
samo pri meni ne deluje, zaradi nekih napak
datoteka nastavitve.cfg
E:\A\test.txt
50000
At E:\mouse_key_move.ps1:1 char:6 + using System.Runtime.InteropServices; + ~ Missing using directive At E:\mouse_key_move.ps1:2 char:6 + using System.Threading.Tasks; + ~ Missing using directive At E:\mouse_key_move.ps1:2 char:1 + using System.Threading.Tasks; + ~~~~~ A 'using' statement must appear before any other statements in a script. At E:\mouse_key_move.ps1:3 char:1 + [DllImport("user32.dll")] + ~~~~~~~~~~~~~~~~~~~~~~~~~ Unexpected attribute 'DllImport'. At E:\mouse_key_move.ps1:4 char:1 + static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + ~~~~~~ Unexpected token 'static' in expression or statement. At E:\mouse_key_move.ps1:6 char:15 + [StructLayout(LayoutKind.Sequential)] + ~ Missing closing ')' in expression. At E:\mouse_key_move.ps1:6 char:1 + [StructLayout(LayoutKind.Sequential)] + ~~~~~~~~~~~~~~ Unexpected attribute 'StructLayout'. At E:\mouse_key_move.ps1:6 char:25 + [StructLayout(LayoutKind.Sequential)] + ~~~~~~~~~~~ Unexpected token '.Sequential' in expression or statement. At E:\mouse_key_move.ps1:6 char:36 + [StructLayout(LayoutKind.Sequential)] + ~ Unexpected token ')' in expression or statement. At E:\mouse_key_move.ps1:11 char:13 + [MarshalAs(UnmanagedType.U4)] + ~ Missing closing ')' in expression. Not all parse errors were reported. Correct the reported errors and try again. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingUsingStatementDirective
Zgodovina sprememb…
- spremenil: Blisk ()
darkolord ::
Ajej, C# je tole. Če bi rad .exe, je tole najhitrejš. Imaš VS Code ali VS?
Lahko ti skompajlam tudi jaz, samo mi boš pač moral zaupat, da ti pošiljam to isto zadevo ..
Lahko ti skompajlam tudi jaz, samo mi boš pač moral zaupat, da ti pošiljam to isto zadevo ..
win64 ::
Se backup zaganja preko task scheduler-ja?
Tam imaš opcijo, da se task zažene samo, če je računalnik idle. Lahko celo nastaviš koliko časa mora biti računalnik idle.
Pozabi, sem prehitro prebral.
Tam imaš opcijo, da se task zažene samo, če je računalnik idle. Lahko celo nastaviš koliko časa mora biti računalnik idle.
Pozabi, sem prehitro prebral.
Zgodovina sprememb…
- spremenil: win64 ()
Blisk ::
Ajej, C# je tole. Če bi rad .exe, je tole najhitrejš. Imaš VS Code ali VS?
Lahko ti skompajlam tudi jaz, samo mi boš pač moral zaupat, da ti pošiljam to isto zadevo ..
sem si naložil VS samo moram še naštudirat kako to spravim v exe.
Lahko poveš zakaj je tole posebej?
ne spada zraven kode?
using System.Runtime.InteropServices; using System.Threading.Tasks;
Zgodovina sprememb…
- spremenil: Blisk ()
darkolord ::
Posebej je, ker je okoli še nekaj malenkosti, odvisno od tega, kakšen app narediš.
V tvojem primeru v VS narediš nov "C# Console App (.NET Framework)", potem pa vsebino fajla Program.cs zamenjaš s temle spodaj. Ko daš Build se ti bo v mapi bin\Debug ali bin\Release naredil .exe
V tvojem primeru v VS narediš nov "C# Console App (.NET Framework)", potem pa vsebino fajla Program.cs zamenjaš s temle spodaj. Ko daš Build se ti bo v mapi bin\Debug ali bin\Release naredil .exe
using System; using System.IO; using System.Runtime.InteropServices; using System.Threading; namespace ConsoleApp1 { class Program { [DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { private static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); [MarshalAs(UnmanagedType.U4)] public uint cbSize; [MarshalAs(UnmanagedType.U4)] public uint dwTime; } static uint GetLastInputTime() { uint idleTime = 0; LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo); lastInputInfo.dwTime = 0; uint envTicks = (uint)Environment.TickCount; if (GetLastInputInfo(ref lastInputInfo)) { uint lastInputTick = lastInputInfo.dwTime; idleTime = envTicks - lastInputTick; } return ((idleTime > 0) ? (idleTime / 1000) : 0); } private static uint _lastInputTime; private static bool _idle = false; private static string _fileName; private static int _idleTime = 1800; static void Main() { var cfg = File.ReadAllLines("nastavitve.cfg"); _fileName = cfg[0]; int.TryParse(cfg[1], out _idleTime); _lastInputTime = GetLastInputTime(); while (true) { var inputTime = GetLastInputTime(); if (_idle && inputTime - _lastInputTime < 1) { _idle = false; File.Create(_fileName).Close(); } if (!_idle && inputTime - _lastInputTime > _idleTime) { _idle = true; if (File.Exists(_fileName)) File.Delete(_fileName); } Thread.Sleep(1000); } } } }
Blisk ::
Sem naredil fajl je 156kb velik exe fajl, ko ga poženem se za trenutek pokaže neko okno in izgine, ampak potem ga ni v task managerju prav tako ne dela.
Verjetno sem kaj narobe naredil.
Verjetno sem kaj narobe naredil.
darkolord ::
156 kB je malo velik - moj je 6 KB.
Si pognal ConsoleApp1.exe ali mu je ime kako drugače?
Če ga poženeš v cmdju, kaj ti napiše?
Si pognal ConsoleApp1.exe ali mu je ime kako drugače?
Če ga poženeš v cmdju, kaj ti napiše?
Zgodovina sprememb…
- spremenilo: darkolord ()
WhiteAngel ::
Mislim, da preveč kompliciraš. Arhiviraš, ko pač arhiviraš, ampak program za arhivirat poženeš z nice/ionice oz. ekvivalent na windowsih. Ko bodo prišli zraven pomembnejši procesi, bodo imeli ti višjo prioriteto in se bo arhiviranje ustavilo v tistem kratkem trenutku.
bluefish ::
darkolord ::
Ko si naredil nov projekt, si izbral "Console App (.NET Core)", moral bi pa izbrati "Console App (.NET Framework)"
Blisk ::
Ko si naredil nov projekt, si izbral "Console App (.NET Core)", moral bi pa izbrati "Console App (.NET Framework)"
ja res je, te opcije sploh nisem imel sem jo moral namestiti, zdaj je res 6Kb.
ampak ko zaženem se ne zgodi nič, kurzor utripa na mestu. datoteke ni, ko tipkam ali premikam miš
https://mab.to/qgcRLXBjU
Je komu ratalo tole skompajlat in program dela?
Zgodovina sprememb…
- spremenil: Blisk ()
Blisk ::
WhiteAngel je izjavil:
Ali najde nastavitve.cfg? Si poskusil zagnati iz cmd, da vidiš, če kaj izpiše?
vse sem probal pa se ne zgodi nič, program se zažene, najde cfg ampak se ne zgodi nič.
Pognal sem tudi direktno v VB pa isto nič.
Razen če bi moral dati kaj extra v cfg fajl?
darkolord ::
Očitno sem nekaj zaj... ko sem sestavljal, probaj še takole:
using System; using System.IO; using System.Runtime.InteropServices; using System.Threading; namespace ConsoleApp1 { class Program { [DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { private static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); [MarshalAs(UnmanagedType.U4)] public uint cbSize; [MarshalAs(UnmanagedType.U4)] public uint dwTime; } static uint GetLastInputTime() { uint idleTime = 0; LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo); lastInputInfo.dwTime = 0; uint envTicks = (uint)Environment.TickCount; if (GetLastInputInfo(ref lastInputInfo)) { uint lastInputTick = lastInputInfo.dwTime; idleTime = envTicks - lastInputTick; } return ((idleTime > 0) ? (idleTime / 1000) : 0); } private static bool _idle = false; private static string _fileName; private static int _idleTime = 1800; static void Main() { var cfg = File.ReadAllLines("nastavitve.cfg"); _fileName = cfg[0]; int.TryParse(cfg[1], out _idleTime); while (true) { var inputTime = GetLastInputTime(); if (_idle && inputTime < 1) { _idle = false; File.Create(_fileName).Close(); } if (!_idle && inputTime > _idleTime) { _idle = true; if (File.Exists(_fileName)) File.Delete(_fileName); } Thread.Sleep(1000); } } } }
Blisk ::
Hvala, ampak tudi pri tem je isto, se ne zgodi nič, sem testiral v VB in z fajlom.
vse skupaj je v priponki.
https://mab.to/8mCldLGeI
vse skupaj je v priponki.
https://mab.to/8mCldLGeI
darkolord ::
Prvo periodo počaka, da ti ne naredi fajla čisto takoj, ko ga poženeš. Če iz tvojega zipa v nastavitve.cfg napišem 10 namesto 40000 in počakam 10 sekund, potem od takrat deluje kot pričakovano.
Če hočeš, da ti že takoj naredi fajl, spremeni private static bool _idle = false; v true namesto false.
Če hočeš, da ti že takoj naredi fajl, spremeni private static bool _idle = false; v true namesto false.
Zgodovina sprememb…
- spremenilo: darkolord ()
Blisk ::
Prvo periodo počaka, da ti ne naredi fajla čisto takoj, ko ga poženeš. Če iz tvojega zipa v nastavitve.cfg napišem 10 namesto 40000 in počakam 10 sekund, potem od takrat deluje kot pričakovano.
Če hočeš, da ti že takoj naredi fajl, spremeni private static bool _idle = false; v true namesto false.
hvala. Zdaj dejansko dela.
Edino ima eno pomanjkljivost, če jaz izbrišem ta kontrolni txt fajl, potem program čaka pol ure, da naredi novega, če tudi jaz tipkam ali premikam miš.
Dejansko mora takoj narediti nov kontrolni txt fajl, če zazna gibanje miške ali tipkanje po tipkovnici, se pravi da ga nonstop prepisuje. Ko se gibanje miške ali tipkanje po tipkovnici ustavi potem ga izbriše po pol ure, ko se aktivnost spet začne, ga spet naredi.
sem mislil da je tisti čas v milisekundah zato sem dal 40000.
Blisk ::
darkolord ::
Meni Project -> ConsoleApp1 (oz. ime projekta) Properties -> Output type zamenjaš iz Console Application v Windows Applications
To bi moralo biti to. Ugasniti ga moraš pa s task managerjem ...
To bi moralo biti to. Ugasniti ga moraš pa s task managerjem ...
Blisk ::
Blisk ::
Probal sem še fizično dodati pot do nastavitve.cfg ker če ni v isti mapi kot je exe fajl potem ne dela.
Pa ko spremenim pot, VB napiše da je napaka, očitno nisem prav naredil.
var cfg = File.ReadAllLines("C:\podatki\nastavitve.cfg");
sem že našel na google
var cfg = File.ReadAllLines(@"C:\podatki\nastavitve.cfg");
Pa ko spremenim pot, VB napiše da je napaka, očitno nisem prav naredil.
var cfg = File.ReadAllLines("C:\podatki\nastavitve.cfg");
sem že našel na google
var cfg = File.ReadAllLines(@"C:\podatki\nastavitve.cfg");
Zgodovina sprememb…
- spremenil: Blisk ()
Blisk ::
Še eno splošno vprašanje.
Ko sem nastavil v task scheduler, da se tole požene ob 15h, karkoli nastavim se program ne zažene, ali pa se zažene, ker lahko ubijem process ampak fajla mi pa ne naredi.
Kakšna ideja zakaj?
Ko sem nastavil v task scheduler, da se tole požene ob 15h, karkoli nastavim se program ne zažene, ali pa se zažene, ker lahko ubijem process ampak fajla mi pa ne naredi.
Kakšna ideja zakaj?
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Funkcija GetAsyncKeyStateOddelek: Programiranje | 1632 (1335) | Looooooka |
» | kako narediti program ki bere drugi programOddelek: Programiranje | 5772 (4085) | imagodei |
» | uporaba C++ unmanaged kode v C#.NET projektuOddelek: Programiranje | 1907 (1630) | krho |
» | [c#] naloga za maturo...rabim majhno pomocOddelek: Programiranje | 2342 (1679) | ql000 |
» | [C#] unmanaged->managed codeOddelek: Programiranje | 2143 (2018) | Zzzzzzz |