Tastatur-Hook
von Arkon
Eine DLL ist eine indirekt ausführbare Datei, die nicht über eine message-Schleife zum empfangen von Benutzereingaben. DLLs sind separate Dateien, die Funktionen enthalten, die(nicht nur), die aufgerufen werden können durch Programme und andere DLLs. Um dem Endbenutzer eine DLL ist ein Programm, das nicht ausgeführt werden direkt aus dem Programm-Manager(oder andere Muscheln), aber von der system-Sicht, es gibt zwei Unterschiede zwischen DLLs und Anwendungen: DLLs können nicht mehrere Instanzen laufen in den Speicher geladen. und DLLs Heften sich an die Prozesse, die einzige Anwendung, die Instanzen sind Prozesse. DLL steht für Dynamic Link Library. Dynamic-Link ist ein Mechanismus zur link-Bibliotheken, um Anwendungen zur Laufzeit. Diese libraries(DLLs) sich in Ihren eigenen ausführbaren Dateien(.dll) und werden nicht kopiert und in Anwendungen, die ausführbare Dateien(.exe) als auch mit Static Link libraries. Es ist wichtig zu verstehen, dass ein .DLL geladen wird, in den Adressraum der angegebenen Verknüpfung von Anwendung und nicht in den globalen heap! Die Vorteile der Verwendung von dynamic linking-Methode sind:
Sie können aktualisiert werden, ohne dass die Anwendungen neu kompiliert werden, oder erneut verknüpft.
Wenn mehrere Anwendungen die gleiche .DLL, die .DLL wird nur einmal geladen, für alle Anwendungen(Reduzierung der Speicher-und Festplattenkapazität).
Der Grund brauchen wir eine DLL für einen systemweiten hook ist so, weil wir wollen, dass der Filter-Funktion in jeder Anwendung Adressraum. Also, wenn du den Haken gesetzt message filter-Funktion, die liegt in der .dll Windows ordnet die .dll automatisch in alle Anwendungen " Adressraum. So bekommen Sie Ihre filter-Funktion, die aufgerufen wird für jeden Prozess! Deshalb, wenn wir die dynamische Verknüpfung der Haken, die ist in einem .DLL wird es einen systemweiten hook(natürlich hängt es von der Art der Filter-Funktion auch). Okay, nachdem nun die wichtigsten theoretischen material..
Lassen Sie mit dem Programmieren beginnen die .DLL für die systemweite Tastatur-hook, und dann werde ich erklären, wie die dynamische Verknüpfung der .DLL in die Anwendung.
Bitte laden Sie den Quellcode, um zu sehen, wie es alle geschrieben und getan.
// Dies ist unsere Tastatur-callback-Prozedur:
// _declspec(dllexport) bedeutet, dass wir wollen, dass andere
// Anwendungen/DLLs aufrufen dieser Funktion, in gleichen Fällen, die Sie nicht
// müssen dieses Präfix, aber zur Sicherheit werden wir es verwenden.
_declspec(dllexport) LRESULT CALLBACK KBHookProc(int Code,
WPARAM wParam, LPARAM lParam)
{
// Wenn der code weniger als 0 bezeichnen wir den nächsten Haken,
// dies ist, wie Haken funktionieren, nichts besonderes
if (Code < 0) return(CallNextHookEx(hhook, Code, wParam, lParam));
// Info über das, was passiert mit der Tastatur
if (lParam & (1 << 31)) // Bit 31 bestimmt, ob eine Taste gedrückt
// Aufruf der nächste Haken.
return(CallNextHookEx(hhook, Code, wParam, lParam));
}
// Dies ist die gleiche wie WinMain/Main, aber für die DLLs
// erhalten Sie die DLL-Instanz, die Vernunft, wie Ihr .DLL aufgerufen wird, reserviert.
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason,
LPVOID lpReserved)
{
// Gibt es eigentlich 4 Gründe, wir Bearbeiten nur 2 von Ihnen,
// denn es ist genug für unsere prog.
if (dwReason == DLL_PROCESS_ATTACH) // Laden der .DLL
{
wenn(pcount == 0)
{
// Init // Erste Ladezeit
// Haken setzen..
}
pcount++;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
// UnInit, bevor das system befreit .DLL aus dem Speicher.
wenn(pcount == 1)
{
// Kostenlos
// Kill Haken..
}
pcount--;
}
return(1);
}
Sie sehen, es ist ziemlich einfach, würde ich sagen. Anyways, pcount ist unsere Prozess-Zähler, er sagt, wie viele Male der .DLL aufgerufen wurde. pcount ist eine spezielle variable, es werden in den globalen heap, denn wenn es nicht dann jedesmal, wenn unsere .DLL aufgerufen wird, wird es initialisiert auf 0 wieder und wieder...also, um zu verhindern, dass, sagen wir dem compiler, die variable in den globalen heap. Wir machen das für den hook-handle zu, denn wir setzen den Haken nur einmal. Wenn wir den Haken gesetzt jedesmal, wenn die .DLL aufgerufen wird, wird es ein Durcheinander Haken und es würde nicht richtig funktionieren und wie wir wollen! Damit sagen Sie dem compiler, wollen wir es platzieren Sie die variable in den globalen heap, tun wir dies:
#pragma data_seg("SharedBlock")
HHOOK hhook = NULL;
int pcount = 0;
#pragma data_seg()
Beachten Sie alle Variablen initialisiert werden. ok, wir gehen zu HHOOK hhook = NULL; unsigned long Tastenanschläge = 0; int pcount = 0; #pragma data_seg (), die Wir bald fertig zu schreiben, die .DLL, jeden .DLL-Datei muss eine .DEF-Datei, um direkt den compiler. In der .DEF-Datei sagen wir dem compiler die Funktionen, die wir exportieren wollen, ja, diejenigen, die mit der _declspec(dllexport), und wir sagen dem compiler über die freigegebenen Daten-block. (Sehen Sie den Quellcode für das volle Verständnis der .DEF-Datei). Sobald die .DLL ist die Datei fertig, Sie haben, um es zu kopieren, um die Anwendung, die die Lasten der .DLL-Verzeichnis oder kopieren Sie es in %windir%\system.
OK, das Wars für die .DLL-Zeug, jetzt laden wir die .DLL, die wir gerade erstellt! Zuerst müssen wir erklären, Zeiger auf Funktionen mit den Parametern, die Sie erhalten.
typedef void (*LPFunction)(void);
LPFunction Funktion = NULL;
// Dies ist ein Zeiger auf eine Funktion, die keine
// Parameter und die einen void zurückgibt.
HMODULE DLLmodule = LoadLibrary("mydll.dll");
if (!DLLmodule) // .DLL-Datei wird nicht gefunden!!!
// Diese Funktion ruft den code des bestimmten gewünschten Funktion aus dem Speicher,
// Beachten Sie die Großbuchstaben, die gewünschte Funktion-name ist um genau zu sein,
// wie in der .DEF-Datei und .CPP-Datei der DLL, den wir schrieben.
Funktion = (LPFucntion)GetProcAddress(DLLmodule, "Funktion");
if (!Funktion) // Implementierung der Funktion code wird nicht gefunden!!!
// Jetzt können Sie Funktionen aufrufen.
Funktion();
// Nach dem Ende des mit der .DLL, vergessen Sie nicht, Sie zu befreien!
FreeLibrary(DLLmodule);
Woohoo, das ist es!! Gut, das war nur die Grundlagen und es wird nicht funktionieren, wenn Sie kopieren und einfügen.
Datum der Veröffentlichung: