» »

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!

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 ()

LilStalker ::

Kaj pa imaš to za ene poredne načrte?

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...

darkolord ::

Sicer pa je za to GetLastInputInfo API funkcija.

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.

OrkAA je izjavil:

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):

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

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 ..

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.

Zgodovina sprememb…

  • spremenil: win64 ()

Blisk ::

darkolord je izjavil:

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

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.

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?

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 je izjavil:

156 kB je malo velik - moj je 6 KB.
Verjetno je kompajlal Debug verzijo. Izbrati mora Release.

Blisk ::

no tole sem naredil pa fajl noče bit manjši od 156 Kb.



pa neke fajle še zahteva

Zgodovina sprememb…

  • spremenil: Blisk ()

Blisk ::

Sem še enkrat skompajlal release verzijo pa je isto manjka mu hostpolicy.dll

darkolord ::

Ko si naredil nov projekt, si izbral "Console App (.NET Core)", moral bi pa izbrati "Console App (.NET Framework)"

Blisk ::

darkolord je izjavil:

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 ::

Res ni nobenga junaka, ki bi men tole pomagal spravit v pogon? :'(

WhiteAngel ::

Ali najde nastavitve.cfg? Si poskusil zagnati iz cmd, da vidiš, če kaj izpiše?

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

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.

Zgodovina sprememb…

  • spremenilo: darkolord ()

Blisk ::

darkolord je izjavil:

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 ::

oz. naredi/popravi fajl na vsake par sekund da ne bo preveč potraten z resursi!

darkolord ::

if (_idle && inputTime < 1)

spremeni v

if (inputTime < 1)

Blisk ::

darkolord je izjavil:

if (_idle && inputTime < 1)

spremeni v

if (inputTime < 1)



Super, hvala, zdaj dela točno tako kot mora.
Kako te lahko častim pivo???

Blisk ::

P.S. ali se da, da se tisto črno okno ne pojavi oz. da ga ni, ko se program zažene?

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 ...

Blisk ::

darkolord je izjavil:

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 ...

Odlično.
Hvala

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");

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?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Funkcija GetAsyncKeyState

Oddelek: Programiranje
61534 (1237) Looooooka
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465356 (3669) imagodei
»

uporaba C++ unmanaged kode v C#.NET projektu

Oddelek: Programiranje
111821 (1544) krho
»

[c#] naloga za maturo...rabim majhno pomoc

Oddelek: Programiranje
192254 (1591) ql000
»

[C#] unmanaged->managed code

Oddelek: Programiranje
112047 (1922) Zzzzzzz

Več podobnih tem