Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: WinAPI ::  GetMessage() empfängt von Hook, durchläuft aber Schleife nicht     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
linzus
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.01.2018
Beiträge: 3
Beitrag linzus Mitglied 22:03:36 05.01.2018   Titel:   GetMessage() empfängt von Hook, durchläuft aber Schleife nicht            Zitieren

Hallo,
ich habe gerade angefangen WINAPI zu lernen, und versuche einen Keylogger zu schreiben. Was ich weiß:
GetMessage() liefert MSG's aus der eigenen Thread-Queue zurück.
SetWindowsHookEx() liefert genau an den Thread MSG's, der den Hook installiert hat.
Folglich muss der Thread, der SetWindowsHookEx() aufruft auch der sein der die Hook-MSG's durch die GetMessage() empfängt.

Mein folgender Code funktioniert, bis auf die Tatsache, dass das printf("\mMSG"); nicht ausgeführt wird, was schließen lässt, dass auch keine MSG's gelesen werden. Wie kann das aber sein? Wenn ich die while-Schleife ersetzte mit einem Sleep(10000) und dann Knöpfe drücke, passiert nichts!

Danke für eure Hilfe!
Grüße;
Linzus


C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
LRESULT CALLBACK LLKBProc(int nCode, WPARAM wParam, LPARAM lParam) {
    KBDLLHOOKSTRUCT *keyMetaP = (KBDLLHOOKSTRUCT *) lParam;
    printf("\nkey = %x", keyMetaP->vkCode);
    CallNextHookEx(NULL, nCode, wParam, lParam);
    return 0;
}
 
 
void logging() {
    printf("\nTHREAD:");
 
    // get handle to process
    HINSTANCE hExe = GetModuleHandle(NULL);
    printf("\nHinstance = %i", hExe);
 
    // set hook
    HHOOK keyHook;
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) LLKBProc, hExe, 0);
    printf("\nkeyHook = %i", keyHook);
 
    // rx messages from hook
    int i = 0;
    MSG msg;
    while ( GetMessage(&msg, 0, 0, 0) != -1 && (i < 10) ) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        i++;
        printf("\nMSG");
    }
 
    UnhookWindowsHookEx(keyHook);
 
    return;
}
 
int main()
{
    HANDLE thread = CreateThread(0, 0, logging, 0, 0, 0);
    WaitForSingleObject(thread, INFINITE);
    return 0;
}




PS: Wie wenn nicht mit "
C:
 
" kann ich den Code ordentlich formatieren?


Zuletzt bearbeitet von linzus am 12:13:19 06.01.2018, insgesamt 4-mal bearbeitet
Suznil
Unregistrierter




Beitrag Suznil Unregistrierter 10:41:50 06.01.2018   Titel:              Zitieren

Du denkst zu kompliziert. Hier mal ein kleines Beispiel:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <windows.h>
#pragma comment(linker, "/entry:Startup /subsystem:console")
 
LRESULT CALLBACK LowLevelKeyboardProc(INT nCode, WPARAM wParam, PKBDLLHOOKSTRUCT lParam);
 
INT Startup(VOID)
{
    SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, *(PDWORD)(__readfsdword(0x30) + 8), 0);
 
    while(GetMessage(0, 0, 0, 0));
 
    ExitProcess(EXIT_SUCCESS);
}
 
LRESULT CALLBACK LowLevelKeyboardProc(INT nCode, WPARAM wParam, PKBDLLHOOKSTRUCT lParam)
{
    if (wParam == WM_KEYDOWN)
    {
        printf("KeyDown:\t%08X\n", lParam->vkCode);
    }
    else if (wParam == WM_KEYUP)
    {
        printf("KeyUp:\t\t%08X\n", lParam->vkCode);
    }
 
    return CallNextHookEx(0, nCode, wParam, lParam);
}
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 4773
Beitrag Th69 Mitglied 11:36:17 06.01.2018   Titel:   Re: GetMessage() empfängt von Hook, durchläuft aber Schleife nicht            Zitieren

linzus schrieb:
Hallo,
PS: Wie wenn nicht mit "[code="c"][/code]" kann ich den Code ordentlich formatieren?

Überprüfe mal in deinem Profil, ob "BBCode immer aktivieren:" auf "Ja" steht.
Und dann editiere und speichere deinen Beitrag nochmal (und schau, daß "BBCode in diesem Beitrag deaktivieren" nicht angehakt ist).
linzus
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.01.2018
Beiträge: 3
Beitrag linzus Mitglied 12:17:28 06.01.2018   Titel:   Re: GetMessage() empfängt von Hook, durchläuft aber Schleife nicht            Zitieren

Th69 schrieb:
linzus schrieb:
Hallo,
PS: Wie wenn nicht mit "[code="c"][/code]" kann ich den Code ordentlich formatieren?

Überprüfe mal in deinem Profil, ob "BBCode immer aktivieren:" auf "Ja" steht.
Und dann editiere und speichere deinen Beitrag nochmal (und schau, daß "BBCode in diesem Beitrag deaktivieren" nicht angehakt ist).


@Th69
Super danke, hat funktioniert. War sowohl im Profil als auch im Beitrag deaktiviert.

@Suznil:
Danke für das Beispiel. Ich weiß jetzt aber immer noch nicht wieso die message-loop denn nicht durchlaufen wird. MSDN https://msdn.microsoft.com/de-de/library/windows/desktop/ms644985(v=vs.85).aspx schreibt:

Remarks

An application installs the hook procedure by specifying the WH_KEYBOARD_LL hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function.
This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.

Also bedeutet das doch, dass der Hook ausgelöst wird, indem dem installierenden Thread eine msg gesendet wird. Wieso wird dann aber der loop dennoch nicht durchlaufen?

@Susnil:
mit *(PDWORD)(__readfsdword(0x30) + 8) ließt du vom FS beginnend 0x30 entfernt aus (also Prozess Environment Block?) und dort dann mit dem Offset 8 also die Ldd-Struktur und ließt dort das erste DWORD (32bit unsigned) was nicht sein kann, weil dort "Reserved" steht.
https://en.wikipedia.org/wiki/Win32_Thread_Information_Block
https://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx

Ich würde gerne verstehen wie du die HINSTANCE bekommst ohne GetModule(NULL) :-)



Danke und Grüße,
Linus


Zuletzt bearbeitet von linzus am 12:48:33 06.01.2018, insgesamt 1-mal bearbeitet
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15380
Beitrag Martin Richter Moderator 10:07:37 08.01.2018   Titel:              Zitieren

Zitat:
Ich würde gerne verstehen wie du die HINSTANCE bekommst ohne GetModule(NULL) :-)



GetModuleHandle(NULL) liefert immer nur HINSTANCE der EXE nicht unbedingt, die des aktuellen Modules (also einer DLL).

Dein hInstance bekommst Du automatisch in Deinem WinMain Startcode.

Du hast eine Cconsole Anwendung. Da wird auch hinstance übergeben, das wird aber intern von der CRT verdeckt, weil diese wiederum Deinen main Code aufruft, der eben keinen hInstance Parameter kennt.

Hier hilft __ImageBase...
Siehe https://blogs.msdn.micros ....... hing/20041025-00/?p=37483


Grundsätzlich habe ich das mal vor langer Zeit hier diskutiert:
http://blog.m-ri.de/index ....... verwenden/comment-page-1/

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
linzus
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.01.2018
Beiträge: 3
Beitrag linzus Mitglied 18:47:19 08.01.2018   Titel:              Zitieren

Martin Richter schrieb:
Zitat:
Ich würde gerne verstehen wie du die HINSTANCE bekommst ohne GetModule(NULL) :-)


Grundsätzlich habe ich das mal vor langer Zeit hier diskutiert:
http://blog.m-ri.de/index ....... verwenden/comment-page-1/


Sehr interessant, danke.
C++ Forum :: WinAPI ::  GetMessage() empfängt von Hook, durchläuft aber Schleife nicht   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.