[C++] Page Guard hilfe

10/11/2012 21:27 Light.D.Right#1
nabend erstmal,

ich komm gleich zu meinem problem.
Ich nehm ma ein beispiel.
Ich hab die Addy 0x00300000 (fake bsp)
Nun möcht ich auf diese addy via VirtualProtect flag PAGE_GUARD
drauf machen sodass eine Exception ausgelöst wird.
So
Code:
[...]
VirtualProtect((LPVOID)0x00300000, 4, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &oldProtect);
Hier kommt meine frage.
Nun möcht ich die Exception in mein Handler abfangen.
So ungefähr
Code:
void Handle(EXCEPTION_POINTERS* ep)
{
	if(ep->ContextRecord->Eip == 0x00300000)
        {
               MessageBox(NULL, "Address Accessed", "Information", MB_OK);
               ep->ContextRecord->Eip = 0x00500000;
        }
}
Wie krieg ich das nun bewerkstelligt?
10/12/2012 06:19 Nightblizard#2
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Ich denke du suchst danach.
10/16/2012 15:28 Light.D.Right#3
danke dir, hat etwas gedauert hatte aber kaum zeit
nun aber xD

Hier ma ersma den source
Frage steht im Ex_handler
Code:
typedef void(__cdecl* EXCEPTION_HANDLER)(EXCEPTION_POINTERS*);

LONG __stdcall Ex_handler(EXCEPTION_POINTERS* ep)
{
    if(ep->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION)
    {
       // Hier möcht ich checken welche page guard ausgelöst wurde.
       // Also die adresse
 
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved )
{
	switch( fdwReason ) 
	{
		case DLL_PROCESS_ATTACH:
                        AddVectoredExceptionHandler(1,Ex_handler);
			VirtualProtect((LPVOID)0x00030000, sizeof(unsigned long), PAGE_EXECUTE_READWRITE | PAGE_GUARD, &oldProtect);
			break;
	}
	return TRUE;
}
10/16/2012 15:48 Jeoni#4
Adresse (als void*) kriegste vermutlich mit:
Code:
ep->ExceptionRecord->ExceptionAddress
Und das checken dürfte eine If-Abfrage erledigen, aber das weißte sicher schon :D

[Only registered and activated users can see links. Click Here To Register...] mal durchklicken für mehr Infos zu den Structs ;)
10/16/2012 16:58 Light.D.Right#5
Quote:
Originally Posted by Jeoni View Post
Adresse (als void*) kriegste vermutlich mit:
Code:
ep->ExceptionRecord->ExceptionAddress
Und das checken dürfte eine If-Abfrage erledigen, aber das weißte sicher schon :D

[Only registered and activated users can see links. Click Here To Register...] mal durchklicken für mehr Infos zu den Structs ;)
Ja hab ich auch schon versucht, aber wenn ich eine if abfrage mit der selben addresse mache, die ich auch in virtualprotect benutzt habe, wird das ereignis nicht ausgeführt. Hab mir dann man die Addresen
die ExceptionAddress gibt per msgbox anzeigen lassen, alle fingen sie mit 404... an. Meine addresse begint aber mit 00...
10/17/2012 13:48 Omdi#6
Versuch mal bei VirtualProtect die Region nur auf PAGE_GUARD zu setzen und lass PAGE_EXECUTE_READWRITE weg.