Zum Inhalt springen

Problem mit einem Hook


Empfohlene Beiträge

Hallo,

Ich will ein Programm schreiben, welches einen Hook für ein anderes Programm installiert und alle WM_CHAR Nachrichten verändert. Es soll eine Datei in einen globalen char Array geladen und mit einer index Variable durchlaufen werden. In der Hook-Funktion soll danach üperpfüft werden, ob die WM_CHAR Nachricht dem aktuellen char des Array entspicht, falls dies nicht der Fall ist soll der Hook die WM_CHAR nachrichten entsprechend verändern. Die Hookfunktion kann jedoch nicht auf den char Array zuegreifen (das Programm lässt sich zwar fehlerfrei Compilern&Linken, der Array hat in der Hook-Funktion jedoch immer den Wert Null). Wiso ist dies so? Hier der Quellcode der Dll und der exe-Datei:


/*Die Dll enthätlt 3 Funktionen, die eine Lädt eine Datei in einen globalen char Array, die andere installiert den Hook und die dritte ist die HookFunktion*/ 


#include <windows.h> 


char Schreibvorlage[1024]; 

HHOOK hook; 

HINSTANCE hDllInstance; 

int zaehler=0; 


__declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); 

__declspec (dllexport) LRESULT CALLBACK dateiladen(void); 

__declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); 



int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) 

{ 

hDllInstance=hInstance; 

return TRUE; 

} 


__declspec (dllexport) LRESULT CALLBACK Filtern(int nCode, WPARAM wParam, LPARAM lParam) 

{ 

/* Die Hook-Funktion kann seltsamerweise nicht auf den Array Schreibvorlage zugrefien, er Array hat den Wert NULL) 



MSG *Nachricht; 

char v; 




if(nCode<0) 

CallNextHookEx(hook,nCode,wParam,lParam); 



switch(nCode) 

{ 

case HC_ACTION: 

Nachricht=(MSG*) lParam; 

if(Nachricht->message==WM_CHAR) 

{ 

v=Nachricht->wParam; 


if(v!=Schreibvorlage[zaehler]) 

{ 

Nachricht->wParam=Schreibvorlage[zaehler]); 

lParam=(LPARAM)Nachricht; 

zaehler++; 

CallNextHookEx(hook,nCode,wParam,lParam); 

return 0; 

} 

zaehler++; 

return 0; 

} 

default: 

break; 

} 

return 0; 

} 



__declspec (dllexport) LRESULT CALLBACK Hooksetzen(void) 

{ 

PROCESS_INFORMATION pi; 

STARTUPINFO su; 


GetStartupInfo(&su); 


CreateProcess("C:\\Programme\\Tastaturschreiben\\Tastatur.exe",NULL,0,0,0,0,NULL,NULL,&su,π); 

WaitForInputIdle(pi.hProcess,3000); 


hook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Filtern,hDllInstance,pi.dwThreadId); 

return 0; 

} 


__declspec (dllexport) LRESULT CALLBACK dateiladen(void) 

{ 

static OPENFILENAME ofn; 

HANDLE hFile; 

int dateigroesse; 

DWORD gelesenebytes; 

static char Dateiname[256], Pfad[256]; 

const char szFilter[] = "Schreibvorlage(*.TXT)\0*.txt\0\0"; 

ofn.lStructSize = sizeof(OPENFILENAME); 

ofn.hwndOwner = FindWindow(NULL,"Gosch"); 

ofn.hInstance=NULL; 

ofn.lpstrFilter=szFilter; 

ofn.lpstrCustomFilter=NULL; 

ofn.nMaxCustFilter=0; 

ofn.nFilterIndex=0, 

ofn.lpstrFile=Pfad; 

ofn.nMaxFile=MAX_PATH; 

ofn.lpstrFileTitle=NULL; 

ofn.nMaxFileTitle=MAX_PATH; 

ofn.lpstrInitialDir=NULL; 

ofn.lpstrTitle=Dateiname; 

ofn.Flags=OFN_HIDEREADONLY | OFN_CREATEPROMPT; 

ofn.nFileOffset=0; 

ofn.nFileExtension=0; 

ofn.lpstrDefExt="txt"; 

ofn.lCustData = 0L; 

ofn.lpfnHook = NULL; 

ofn.lpTemplateName =NULL; 

GetOpenFileName(&ofn); 

hFile=CreateFile(Pfad,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); 

dateigroesse=GetFileSize(hFile,NULL); 

ReadFile(hFile,Schreibvorlage,dateigroesse,&gelesenebytes,NULL); 

CloseHandle(hFile); 

return 0; 

} 
/* Die Exe ruft die beiden Funktionen dateiladen() und Hooksetzen auf*/ 


#include <windows.h> 


__declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); 

__declspec (dllexport) LRESULT CALLBACK dateiladen(void); 

__declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); 



LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 

int WINAPI WinMain (HINSTANCE hInstance, 

               HINSTANCE hPrevInstance, 

               PSTR szCmdLine, 

               int iCmdShow) 


{ 

HWND hwnd; 

MSG msg; 

WNDCLASS wndclass; 

static char szAppName[] = "Gosch"; 


wndclass.style = NULL; 

wndclass.lpfnWndProc = WndProc; 

wndclass.cbClsExtra = 0; 

wndclass.cbWndExtra = 0; 

wndclass.hInstance = hInstance; 

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); 

wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 

wndclass.lpszMenuName = NULL; 

wndclass.lpszClassName = szAppName; 


RegisterClass(&wndclass); 


hwnd =    CreateWindow(szAppName,szAppName, 

      WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 

      CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); 


UpdateWindow(hwnd); 


while(GetMessage(&msg,NULL,0,0)) 

{ 

TranslateMessage(&msg); 

DispatchMessage(&msg); 

} 





return msg.wParam; 

} 


LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 

{ 

HANDLE hFilterdll; 


   switch (message) 

   { 


case WM_CREATE: 

    dateiladen(); 


    Hooksetzen(); 



    break; 


    case WM_QUIT: 


    break; 

    } 

    return DefWindowProc (hwnd, message, wParam, lParam); 



} 

 

Ich hoffe ich konnte mein Problem möglichst genau schildern und danke im Voraus für alle Antworten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ganz einfach, du lädst die DLL mit deinem Programm und rufst die Dateilade funktion und dann die Funktion zum starten des Hooks auf. D.h. innerhalb deines Prozesses wird die Variable Schreibvorlage angelegt und gefüllt.

Wenn du den Hook erstellst zwingt Windows alle anderen Prozesse diese DLL ebenfalls zu laden und bei entsprechenden Ereignis die Hookprozedur aufzurufen. D.h. das geschieht dann innerhalb des Prozesses des anderen Programms wo Schreibvorlage wieder für diesen Prozess angelegt wird und nicht gefüllt wird.

Damit alle Dll Instanzen die selbe Variable Schreibvorlage gemeinsam nutzen musst du sie in einem Shared Memory Segement anlegen auf den dann alle zugriff haben.

Das machst du in der DLL dann so:


#pragma data_seg(".SHARDAT")
static char Schreibvorlage[1024];
#pragma data_seg()
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...