Bei Hook öfters mal Programmabsturz
-
soo erstmal der kot:
// dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. #include "stdafx.h" #ifdef UNICODE typedef std::wstring String; #else typedef std::string String; #endif using namespace std; #pragma data_seg ("Shared") HWND hWindow=NULL ; #pragma data_seg () #pragma comment (linker, "/section:Shared,RWS") HINSTANCE hDllInstance=NULL ; HHOOK htesthook=NULL; LPCTSTR pBuf; HANDLE hMapFile; String int_to_str(int i) { #ifdef UNICODE wostringstream ret; #else ostringstream ret; #endif ret << i; return ret.str(); } LRESULT CALLBACK MsgProc(int,WPARAM,LPARAM); LRESULT SendMsg(String); void OpenFio(void); void CloseFio(void); void stdInitINFO(void); BOOL cpyBufIO(void); struct{ RECT wndRect; double zoom; SCROLLINFO vScroll; SCROLLINFO hScroll; int x_pos; int y_pos; DWORD dwError; BOOL bKeyState; } INFO; #define BUF_SIZE 4096 TCHAR szName[]=TEXT("Global\\WordCapture"); TCHAR szMsg[]=TEXT("Message from first process."); int *clrBuf; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { //MessageBox(HWND_DESKTOP, (LPCWSTR)L"huhu",(LPCTSTR)L"lala",IDOK); switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: {//MessageBox(HWND_DESKTOP, (LPCWSTR)L"DLL_PROCESS_ATTACH",(LPCTSTR)L"lala",IDOK); hDllInstance=(HINSTANCE) hModule ; OpenFio(); stdInitINFO(); break;} case DLL_THREAD_ATTACH: {//MessageBox(HWND_DESKTOP, (LPCWSTR)L"DLL_THREAD_ATTACH",(LPCTSTR)L"lala",IDOK); hDllInstance=(HINSTANCE) hModule ; OpenFio(); stdInitINFO(); break;} case DLL_THREAD_DETACH: {//MessageBox(HWND_DESKTOP, (LPCWSTR)L"DLL_THREAD_DETACH",(LPCTSTR)L"lala",IDOK); CloseFio(); break;} case DLL_PROCESS_DETACH: {//MessageBox(HWND_DESKTOP, (LPCWSTR)L"DLL_PROCESS_DETACH",(LPCTSTR)L"lala",IDOK); CloseFio(); break;} default: break; } return TRUE; } EXPORT BOOL SetupHook (HWND hParent, DWORD dwThreadId){ hWindow = hParent ; HHOOK hTempHook=SetWindowsHookEx (WH_CALLWNDPROC, MsgProc,hDllInstance,dwThreadId) ; if (hTempHook==NULL)//hTempHook == NULL) {String temp=(LPWSTR)L"Got an Error:"; temp+=int_to_str(GetLastError()); MessageBox(HWND_DESKTOP,(LPCWSTR)L"error",(LPCWSTR)L"",IDOK); return 1;}; htesthook=hTempHook; String temp=(LPCWSTR)L"Hook installed \r\n"; SendMsg(temp); return TRUE ; } LRESULT CALLBACK MsgProc(int nCode,WPARAM wParam,LPARAM lParam) { if(nCode!=HC_ACTION) { return CallNextHookEx (htesthook,nCode,wParam,lParam); } CWPSTRUCT* cp=(CWPSTRUCT*)lParam; TCHAR *buffer; buffer=new TCHAR[300]; GetClassName((cp->hwnd),(LPWSTR)buffer,(DWORD)299); INFO.bKeyState=FALSE; try{ if((LPCWSTR)(LONG_PTR)buffer==(String)(LPCWSTR)L"ScrollBar") { SCROLLINFO sbi; sbi.cbSize=sizeof(SCROLLINFO); sbi.fMask=SIF_ALL; GetScrollInfo((cp->hwnd),SB_CTL,&sbi); RECT rect; GetWindowRect((cp->hwnd),&rect); if((rect.bottom-rect.top)>(rect.right-rect.left)) {INFO.vScroll=sbi;} else {INFO.hScroll=sbi;} INFO.dwError=GetLastError(); cpyBufIO(); delete[] buffer; return CallNextHookEx (htesthook,nCode,wParam,lParam); } }catch(...){ MessageBox((HWND)NULL,(LPCWSTR)L"Error @ Scrollbar write",(LPCWSTR)L"Test.dll",IDOK); }; try{ if((LPCWSTR)(LONG_PTR)buffer==(String)(LPCWSTR)L"RichEdit20W") { TCHAR *buf1; TCHAR *buf2; buf1=new TCHAR[300]; buf2=new TCHAR[300]; GetClassName(GetParent((cp->hwnd)),(LPWSTR)buf1,(DWORD)299); if((LPCWSTR)(LONG_PTR)buf1==(String)(LPCWSTR)L"MsoCommandBar") { int iLength=(int)GetWindowText((cp->hwnd),(LPWSTR)buf2,(DWORD)299); String strWindowText=(LPCWSTR)(LONG_PTR)buf2; size_t stPos=strWindowText.find_first_of('%',0); if(stPos!=String::npos) { if(INFO.zoom!= (double)_wtoi(strWindowText.c_str())) { INFO.zoom=(double)_wtoi(strWindowText.c_str()); INFO.dwError=GetLastError(); cpyBufIO(); } } } delete[] buf1; delete[] buf2; delete[] buffer; return CallNextHookEx (htesthook,nCode,wParam,lParam); } }catch(...){ MessageBox((HWND)NULL,(LPCWSTR)L"Error @ Zoom",(LPCWSTR)L"Test.dll",IDOK); }; try{ if((cp->hwnd!=(HWND)NULL)&&(GetAsyncKeyState(VK_LCONTROL))&&(cp->message==WM_NCHITTEST)&&((LPCWSTR)(LONG_PTR)buffer==(String)(LPCWSTR)L"_WwG")) { //now the mouse coordinates has to be set INFO.x_pos=LOWORD(cp->lParam); INFO.y_pos=HIWORD(cp->lParam); //Set Buffer copy to INFO.bKeyState=TRUE; INFO.dwError=GetLastError(); cpyBufIO(); delete[] buffer; return CallNextHookEx (htesthook,nCode,wParam,lParam);//hhkhook, nCode, wParam, lParam); } }catch(...){ MessageBox((HWND)NULL,(LPCWSTR)L"Error @ Mouse",(LPCWSTR)L"Test.dll",IDOK); }; try{ if((LPCWSTR)(LONG_PTR)buffer==(String)(LPCWSTR)L"_WwG") { RECT rect; GetWindowRect((cp->hwnd),&rect); INFO.wndRect.left=rect.left; INFO.wndRect.right=rect.right; INFO.wndRect.top=rect.top; INFO.wndRect.bottom=rect.bottom; INFO.dwError=GetLastError(); cpyBufIO(); delete[] buffer; return CallNextHookEx (htesthook,nCode,wParam,lParam); } }catch(...){ MessageBox((HWND)NULL,(LPCWSTR)L"Error @ _Wwg",(LPCWSTR)L"Test.dll",IDOK); }; delete [] buffer; return CallNextHookEx (htesthook,nCode,wParam,lParam); } EXPORT BOOL UninstallHook (DWORD dwThreadId){ UnhookWindowsHookEx (htesthook);//hHook) ; String temp=(LPCWSTR)L"\r\nHook Uninstalled"; SendMsg(temp); return TRUE; }; void OpenFio(void) { clrBuf=new int[BUF_SIZE]; for(int i=0;i<BUF_SIZE;i++) {clrBuf[i]=0;} hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, // read/write access FALSE, // do not inherit the name szName); // name of mapping object if (hMapFile == NULL) { MessageBox(NULL,(LPCWSTR)L"Could not create file mapping object",(LPCWSTR)L"Error",IDOK); GetLastError(); CloseHandle(hMapFile); return ; } pBuf = (LPTSTR) MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUF_SIZE ); if (pBuf == NULL) { MessageBox(NULL,(LPCWSTR)L"Could not map view of file",(LPCWSTR)L"Error",IDOK); GetLastError(); CloseHandle(hMapFile); return ; } return; } void CloseFio(void) { UnmapViewOfFile(pBuf); CloseHandle(hMapFile); delete[] clrBuf; return; } LRESULT SendMsg(String temp) { long length; CopyMemory((PVOID)pBuf,(PVOID)clrBuf ,BUF_SIZE); if(BUF_SIZE>(temp.length()*sizeof(TCHAR))) {length=(temp.length()*sizeof(TCHAR));} else {length=BUF_SIZE;}; CopyMemory((PVOID)pBuf,(LPWSTR)temp.c_str() ,length); SendNotifyMessage(hWindow,(WM_USER+3),(WPARAM)NULL,(LPARAM)length); return TRUE; } void stdInitINFO(void) { SCROLLINFO siTemp; siTemp.cbSize=sizeof(SCROLLINFO); siTemp.fMask=0; siTemp.nMax=0; siTemp.nMin=0; siTemp.nPage=0; siTemp.nPos=0; siTemp.nTrackPos=0; INFO.wndRect.bottom=0; INFO.wndRect.left=0; INFO.wndRect.right=0; INFO.wndRect.top=0; INFO.x_pos=0; INFO.y_pos=0; INFO.zoom=100; INFO.hScroll=siTemp; INFO.vScroll=siTemp; return; }; BOOL cpyBufIO(void) { if(BUF_SIZE >sizeof(INFO)) { CopyMemory((PVOID)pBuf,(PVOID)&INFO, sizeof(INFO)); //SendNotifyMessage(hWindow,(WM_USER+2),(WPARAM)NULL,(LPARAM)1); return true; }else{ SendMsg((LPCWSTR)L"\r\ndll:Heap overflow, not Enough space to transfer data"); //MessageBox(NULL,(LPCWSTR)L"",(LPCWSTR)L"ERROR ind test.dll",IDOK);} return false; } }; /////////////////////////////////////////////////////////////////////Der hook sollte eigentlich thread spezifisch sein, denn der wird mit einer Therad ID initialisiert,...
Seid gegrüßt und danke für die hilfe
-
Also wenn ich mir diesen Code ansehe würde ich Dir erstmal raten C++ zu lernen, bevor man irgend etwas mit Hooks macht...
1. Kein einziger Deiner String-Compares kann funktionieren.
2. Unnötigerweise allokierst Du Speicher auf dem Heap wo es auch Speicher auf dem Stack tut.
3. Deine Wahllose Casterei ist ein absoluter Horror.
-
Aha,
Punkt 1)Ok erstmal vorneweg, dass ist das erste Projekt das ich mit VC 2008 machte, und auch das erste in UNICODE, und dann noch dazu das Projekt bei welchem ich mich das erstme mal mit Hooking beschäftige.
Punkt 2) Die Compare'S funktionieren.
Punkt 3) Das ist keine Wahllose Casterei, Der VC meckert sonst.Martin ich weiß das Du etwas drauf hast, siehe mal aber bitte Punkt 1).
Durch den Hook bekomme ich die Informationen die ich haben möchte, aber die gehookte app schmiert durch die zugriffsverletzung ab.
Nenn mir doch bitte dann eine andere Möglichkeit Stringcompares für WCHAR's für den VC Compiler zu tätigen, unter Dev-cpp war ich nur char's gewöhnt.
Bitte dann auch gleich cons tchar zu tchar, tchar zu wchar string etc...Zu deinem Punkt 2)
Für mich war die frage woher der Allokierte Speicher kam unter Winapi bisjetzt irrelevant, das kann vlt. hier das prob sein.
Gib mir mal bitte ein Beispiel wo wie, etc.Grüüße und danke
-
zeusosc schrieb:
Aha,
Punkt 1)Ok erstmal vorneweg, dass ist das erste Projekt das ich mit VC 2008 machte, und auch das erste in UNICODE.Na und?
zeusosc schrieb:
Punkt 2) Die Compare'S funktionieren.
Bist Du sicher?
Dein Compare kann nicht davon ausgehen, dass der case der Klasse korrekt ist.
Klassennamen müssen caseless verglichen werden!Ansonsten ist dieser Code totaler Schrott!
TCHAR *buf1; TCHAR *buf2; buf1=new TCHAR[300]; buf2=new TCHAR[300]; GetClassName(GetParent((cp->hwnd)),(LPWSTR)buf1,(DWORD)299); if((LPCWSTR)(LONG_PTR)buf1==(String)(LPCWSTR)L"MsoCommandBar")zeusosc schrieb:
Punkt 3) Das ist keine Wahllose Casterei, siehe 1).
Das ist wahllose Casterei!Hier wäre nicht ein cast notwendig:
int iLength=(int)GetWindowText((cp->hwnd),(LPWSTR)buf2,(DWORD)299);zeusosc schrieb:
Martin ich weiß das Du etwas drauf hast, siehe mal aber bitte Punkt 1).
Und! UNICODE heißt nicht, dass man alles catsne muss. Man muss nur die richtigen Typen eben verwenden.
zeusosc schrieb:
Durch den Hook bekomme ich die Informationen die ich haben möchte, aber die gehookte app schmiert durch die zugriffsverletzung ab.
Eben! Dein Code ist so was von unübersichtlich und falsch, dass mich ein Absturz in keiner Weise wundert.
zeusosc schrieb:
Nenn mir doch bitte dann eine andere Möglichkeit Stringcompares für WCHAR's für den VC Compiler zu tätigen, unter Dev-cpp war ich nur char's gewöhnt.
Bitte dann auch gleich cons tchar zu tchar, tchar zu wchar string etc...Na dann schau mal in die MSDN nach stricmp?
Du finset auch dir wchar_t Variante auf dergleichen Seite erklärt inclusive TCHAR Notation.
http://msdn.microsoft.com/en-us/library/k59z8dwe(VS.80).aspxzeusosc schrieb:
Zu deinem Punkt 2)
Für mich war die frage woher der Allokierte Speicher kam unter Winapi bisjetzt irrelevant, das kann vlt. hier das prob sein.
Gib mir mal bitte ein Beispiel wo wie, etc.
Grüüße und dankeWarum sollte ich das tun?

Ungeprüfter Code in TCHAR Notation:
TCHAR buf1[300]; GetClassName(GetParent((cp->hwnd)),buf1,_countof(buf1)); if(_tcsicmp(buf1,_T("MsoCommandBar"))==0) { TCHAR buf2[300]; int iLength = GetWindowText((cp->hwnd),buf2,_countof(buf2));
-
debuggen
-
olor olor!
Bitte mache ein neues Projekt auf, schreibe dein Programm komplett neu, überlege genau was du tust, mit jedem Buchstaben den du tippst. Schreibe sauberen Code! Soweit es nur geht! Dann überlege nochmal, und nochmal. Dann googlest du. Dann noch mehr, und noch mehr. Dann überlege wieder, noch mehr, schreibe, überlege, google, überlege, überlege, schreibe, überlege, überlege, schreibe, überlege, google, überlege, überlege.
Wird schon

-
Hoi,
Marting danke.
Ich kannte die Header file TCHAR.h noch nicht.
Zu der Speicherzuteilung, ich war geöhnt bei µC's mir den Stack zu nehmen den ich brauche, sowie in der alten DOS (Win97) Zeit habe ich mir halt immer den benötigten Speicher per asm direkt vom RAM genommen. Deswegen stellte sich mir die frage des Heap's und Stacks nie.
Hast Du vielleicht n Link darüber, bzw. worauf ich, insbesondere bei Dll's , achten muss??? (büdde
)Noch ne Frage (erstmal):
Wo ist hier der Vorteil anstattTCHAR *buffer; buffer=new TCHAR[300]; ...... delete[] buffer;lieber:
TCHAR buffer[300]zu verwenden?
Der Pointer referiert doch auf den Verfügbaren Stack,..,.. !?Schön das olor der Meinung ist das alles neu geschrieben werden muss,
wo liegt denn deiner Meinung nach exakt das problem,
bis auf die typenkonvertierung ???
(und wehe du kommst jetzt mit ner simplen "nimm nen switch statt die 4 mal if")Seid gegrüßt und danke
-
zeusosc schrieb:
Hast Du vielleicht n Link darüber, bzw. worauf ich, insbesondere bei Dll's , achten muss??? (büdde
)Aus dem Alter mit Tutorials bin ich raus.
Insofern habe ich da wirlich keine Ahnung. Meine "Bibeln" waren Jeffrey Richters Programming Windows und der Petzold!Man muss ansonsten gar nichts bei DLLs beachten. Man sollte eben nur keinen Programmfehler einbauen, aber das ist bei DLL und EXE IMHO gleich.

zeusosc schrieb:
Noch ne Frage (erstmal):
Wo ist hier der Vorteil anstattTCHAR *buffer; buffer=new TCHAR[300]; ...... delete[] buffer;lieber:
TCHAR buffer[300]zu verwenden?
Der Pointer referiert doch auf den Verfügbaren Stack,..,.. !?new allokiert auf dem Heap und nicht auf dem Stack.
Auf dem Stack kostet es weder Zeit noch sonst was, und ist Exception sicher. Auf dem Heap musst Du selber für das freigeben sorgen. Argumente auf dem Stack räumen sich selber ab.
Wenn schon new dann nur mit Smartzeigern
zeusosc schrieb:
Schön das olor der Meinung ist das alles neu geschrieben werden muss,
wo liegt denn deiner Meinung nach exakt das problem,
bis auf die typenkonvertierung ???
(und wehe du kommst jetzt mit ner simplen "nimm nen switch statt die 4 mal if")Ich würde auch sagen, schreib es neu.
Und wenn Du es wirklich ernst meinst, mach genau dass, was schon gesagt wurde. Schalte Dein Hirn mal bei jederr Zeile an...
-
Hoi leutz,
also durch debugging hatte ich herausgefunden das die fkt.:
CopyMemory(pBuf,&INFO,sizeof(INFO));die Zugriffsverletzung verursacht/e.
Mit SecureZeroMemory ergibt sich das gleiche Bild, um genau zu sein bei
FORCEINLINE PVOID RtlSecureZeroMemory( __in_bcount(cnt) PVOID ptr, __in SIZE_T cnt ) { volatile char *vptr = (volatile char *)ptr; #if defined(_M_AMD64) __stosb((PBYTE )((DWORD64)vptr), 0, cnt); #else while (cnt) { *vptr = 0; //<- hier vptr++; cnt--; } #endif return ptr; }Ansich das gleiche Problem.
Ich habe den ptr wärend der Laufzeit geprüft, die Addresse ändert sich nicht.
Weiter habe ich dafür gesorgt das zwei zugriffe zur gleichen Zeit vermieden werden.Die cnt Variable hat zum auftreten des Fehlers den 4095, also zeigt vptr in diesem fall auf die gleiche addresse wie pBuf.
Ich habe leider keine Ahnung woran das nun liegen könnte,
vielleicht könnt ihr mir ja weiterhelfen.Seid gegrüßt
-
schreib alles neu. bei hooks muss man sein hirn einschalten sonst wird das nix. solche rumfrickelei wird dich ned weit bringen, siehste ja.