64os dll Problem



  • Nein sonnst würde ich nicht fragen.
    Meine frage ist immer noch warum sich der hook aufhängt. da ja ein 32bit dll nie in ein 64bit prozess gemapt werden kann.

    Habe jetz je einen seperaten hook einer 32bit und einer 64bit. aber es nützt nichts. bei eingabe in einem 32bit prozess, hängt die 64bit dll, und umgekehrt das gleiche. aber warum?


  • Mod

    Warum willst Du es nicht verstehen:
    - Du kannst ene 32bit DLL nur in einen 32bit Prozess injezieen.
    - Du kannst eine 64bit DLL nur in einen 64bit Prozess injezieren.

    Alles andere muss fehlschlagen!

    PS: BTW: Ich habe den letzten Thread nicht gesperrt.
    Allerdings hättest Du einfach bei der alten Diskussion bleiben können. Ich hasse es wen wegen jedem Mist ein neuer Thread aufgemacht wird, den man gerade erst diskutiert hat.

    Bitte bleibe bei einem Thread zu einem Thema, andernfalls werde ich auch diese Threads sperren... 👎



  • WAS für einen Hook hast Du denn?
    Es gibt auch Hooks, wofür man keine DLL braucht...



  • Hallo

    Also ich versuche es so verständlich wie möglich zu erklären.

    Martiin Richter schrieb:

    - Du kannst ene 32bit DLL nur in einen 32bit Prozess injezieen.
    - Du kannst eine 64bit DLL nur in einen 64bit Prozess injezieren.

    Das habe ich verstanden und auch gewusst !

    Doch zu meinem Problem jetzt.

    Auf einem 64Bit OS kann man ja 64Bit Prozesse starten oder aber auch 32Bit Prozesse die mit wow ausgeführt werden.

    Da ja 32 und 64Bit Prozesse gestartet werden können habe ich auch 2 DLL(HOOK's) geschrieben, einen für 32Bit übersetzt und der andere 64Bit. Desweiteren habe ich 2 Prozesse geschrieben die den Hook installieren. Ein Prozess(32Bit) installiert den 32Bit Hook(DLL) und der 64Bit Prozess installiert den 64Bit Hook (DLL).
    Jetzt habe ich aber das Problem das sich scheinbar das System ab den DLL's aufhängt. (Code Fehler gibt es keine) den das Problem tritt auch auf wen die Keyboard Hook callback funktionen leeren inhalt haben,ausser die funktion CallNextHookEx( , , , ); die ich aufrufen (muss).

    Wenn ich zbsp. auf 64Bit Vista nur die 32Bit Exe starte mit der ich den 32Bit Keyboard Hook (DLL) installiere ,Hängt das Programm erst wen ich bei einer 64Bit EXE, bsp.IE8 x64 etwas eingebe, bzw er bleibt hängen und gibt gar keine Zeichen aus, erst wen ich den Hook entferne. Klar kann ich mit einem 32Bit hook keine 64Bit Programme hooken, doch wen ich als Anwender eine 64Bit Anwendung starte sollte das auch noch funktionieren und nicht gleich das System bzw. die 64Bit Anwendung blockieren. Das gleiche passier beim umgekehrten Szenario auch.
    Wenn ich den 64Bit Hook mit dem 64Bit Prozess installiere, kann ich so lange eingaaben machen, bis ich bei einem 32Bit Prozess eine eingabe mache, dan hängts wider.

    Und wen ich beide starte, hängt es logischerweisse bei jeder eingabe in ein 32/64 Bit Programm.

    DLL :

    #include <windows.h>
    #include <stdio.h>
    #include "hooking_dll.h"
    
    #pragma comment(linker, "/Section:.hook,RWS")
    
    #pragma bss_seg(".hook")
    HINSTANCE hinstanc;
    #pragma bss_seg()
    
    HHOOK hkb;
    
    int WINAPI DllMain(HINSTANCE hins ,DWORD fdwr ,PVOID rwd)
    {
    
        switch (fdwr){
            case DLL_PROCESS_ATTACH :
                // Die DLL wird in den Adressraum des aktuellen Prozesses
                // eingeblendet.
                hinstanc = hins ;
                break ;
        }
    
        return 1;
    
    }
    
    LRESULT CALLBACK KeyboardProc(int nCode ,WPARAM wParam ,LPARAM lParam )
    {
    
        return CallNextHookEx( hkb, nCode, wParam, lParam );
    }
    
    // Install Keyboard hook Function.
    EXPORT BOOL CALLBACK installhook()
    {
    
        hkb = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hinstanc,0);
    
        return hkb;
    }
    
    // Uninstall Keyboard hook Function.
    EXPORT BOOL CALLBACK uninstallhook()
    {
    
        return UnhookWindowsHookEx(hkb);
    }
    

    HEADER:

    #define EXPORT __declspec (dllexport)
    
    EXPORT BOOL CALLBACK installhook(void);
    
    EXPORT BOOL CALLBACK uninstallhook(void);
    

    MAIN :

    #include <windows.h>
    #include <stdio.h>
    #include "hooking_dll.h"
    
    int main()
    {
    
    	/* Install Keyboard Hook */
    	r = (int)installhook();
    	if(r != 1){
    	   return 0;
    	}
    
    	getchar();
    
    	return 0;
    }
    

    Diese sind einmal für 64Bit compiliert und einmal für 32Bit.
    Ich hoffe ihr könnt mein Problem jetz besser verstehen.

    Und ich bin kein gauner ,ich möchte einfach nur lernen. Und so wie ich gesagt habe möchte ich auf Hotkey's reagieren, das war eigentlich ursprünglich mal mein Ziel, oder ist es immer no sonnst nichts.
    Ich denke jeder fängt mal klein an.

    Ps: Es funktioniert ja, nur eben nicht bei dem oben gennanten Scenario (64BitOS).

    Ich bin für jede hilfe dankbar.

    Grüsse



  • Danke schön !

    Sollte mich mal registrieren, da dies wirklich absolut das beste c/c++ Forum ist dass ich kenne.



  • hallo

    Weis den niemand was das Problem ist?
    was låuft da nur falsch??

    grüsse



  • Hey

    Scheinbar geht dies einfach nicht. 😞 ein Bug seitens MS ?
    Oder habe ich da einfach konzeptionelle Probleme ? Scheinbar muss mann auf etwas achten im bezug auf SysWow64 ... Aber wie gesagt hab keine Ahnung, und auch schon alles Probiert, inclusive das Halbe Web nach diesem Problem durchforstet. Scheinbar hat da niemand eine Ahnung wie das richtig geht.
    Wäre immer noch auf jede Hilfe dankbar. Ich will ja nicht Code sehen, will nur wissen wie das auf 64 OS gemacht wird bzw. was ich speziell mit syswow64 beachten muss. Oder was eigentlich genau das Probelm ist !
    Den unter 32Bit Os funktioniert der Hook einwandfrei. Bei 64OS nur bedingt, mit den oben genannten Problemen.(3Posts witer oben).

    michaela caminada


  • Mod

    Die letZte Lösung ist immer, das andere den Fehler machen? 😕

    Und Du hast alles bzgl. Wow64 gelesen und beachtet?
    http://msdn.microsoft.com/en-us/library/aa384274(VS.85).aspx

    Global Hooks
    The SetWindowsHookEx function can be used to inject a DLL into another process if the following conditions are met:

    A 32-bit DLL can be injected only into a 32-bit process, and a 64-bit DLL can be injected only into a 64-bit process. It is not possible to inject a 32-bit DLL into a 64-bit process or vice versa.
    The 32-bit and 64-bit DLLs must have different names.
    For more information, see SetWindowsHookEx.
    Be aware that the WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL, and low-level hooks can be called on the thread that installed the hook rather than the thread processing the hook. For these hooks, it is possible that both the 32-bit and 64-bit hooks will be called if a 32-bit hook is ahead of a 64-bit hook in the hook chain. For more information, see Using Hooks.

    BTW: Meine Hooks laufen... 🕶
    PS: Ich bin gerade wieder meinen eigenen Prinzipien untreu geworden und helfe beim Hooking. Ich kann es kaum fassen... 🤡



  • hey

    Geholfen hasst du bisher überhaupt nicht.
    Musst auch nicht.
    Und ja ich habe alles gelesen.
    Am Quelltext an mûsstest du ja sehen was falsch ist.

    mc


  • Mod

    mc schrieb:

    Am Quelltext an mûsstest du ja sehen was falsch ist.

    Nein!
    Sehe ich nicht wie Dein Projekt heißt, d.h. ob Deine 64bit DLL und 32bit DLL unterschieldich heißen. Ich sehe nicht wo diese platziert sind etc. Ich sehe Deine Projketeinstellungen nicht. All das kann negative Effekte haben. Nichts davon sehe ich...

    Geholfen habe ich Dir nicht?
    Ich gebe Dir wenigstens Futter zum nachdenken...



  • hey

    ja das stimmt. die dll's haben unterschiedliche namen.
    was muss ich den beachten bei den prject einstellungen?
    und was wo platziert ?
    wie ich geschrieben habe passiert es auch wen ich nur eine dll laufen lasse.
    wen ich zbsp. 32bit dll injeziere. dan hängt es wen icj eine eingabe in einer 64bit anwendung mache. ja ich weis ich kann keine 64bi apps mit einer 32bi dll machen. doch hängen sollte es auch nicht.. es dürfte ja nicht mal etwas passieren, da ja die 32bit dll, niemals in den 64bit prozess injeziert wird.
    daher kann ich es nicht verstehen.
    wen ich nur bei 32bit anwendungen etwas eingebe, funktioniert er ja tadellos, bis ich bei einer 64bit app was eingebe. dan hängt das programm. aber der 64bit prozess, mappt die dll ja gar nicht!?darum verstehe ich das problem nicht.

    mc



  • wäre noch schön, wenn du mir sagen könntest auf was ich bei den project einstellungen achten muss!

    mc



  • Hey

    hängt es vielleicht damit zusammen das ich die 64/32 dll für das 64os auf einem 32os übersetze ?

    ich habe schon alles durchgelesen, und alles probiert, und dies scheint mir die letzte mögliche fehlerquelle.

    ich bin über jede hilfe dankbar.

    mc



  • Hey

    Habe mein Problem immer noch nicht gelöst.
    Dieses problem habe ich ... wenn das vielleicht verständlicher ist.

    http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/236a1e72-0ec3-471d-88a7-572462a5d684

    mc



  • Hallo

    Habe das Problem zwar immer noch nicht schön gelöst. Doch habe jetz wirklich fast alles zu Hooks gelesen. Das Problem scheint dies zu sein, das das 64Bit OS in einer VM ausgeführt wird. Habe schon von ein paar gelesen die das gleiche Problem haben.

    Doch man kann es auch anders lösen indem man Prüft welches Programm der aktuelle Fokus hat, um dann zu ermittel ob das Programm 64Bit ist oder nicht. Dann einfach der eintsprechende Hook 32/64Bit installieren / deinstallieren. Umständlich aber es funktioniert unter Vista/Win7 64Bit in einer VM-Ware.

    mc


Anmelden zum Antworten