OldSchoolHack

Registrieren / Anmelden Deutsch

Breakpoint Hooking Problem

icon Thema: Breakpoint Hooking Problem

Anmeldungsdatum: Sep 2009

Beiträge: 4

Mhh hab den Fehler noch etwas eingrenzen können...

Es betrifft nur die letzten beiden Register:

TEXT Code:
  1. // Register #3
  2. ctx.Dr2 = 0x4003000; //gBreakPoints.bp[2].dwAddr;
  3. ctx.Dr7 |= 0x00000010;
  4.  
  5. // Register #4
  6. ctx.Dr3 = 0x4004000; //gBreakPoints.bp[3].dwAddr;
  7. ctx.Dr7 |= 0x00000040; // todo: dynamic loop here

Wenn ich, wie oben schon getan, manuell eine Addresse einsetze, dann freezt das Spiel nicht.

Die Funktion welche die Addressen setzt sieht folgendermaßen aus:
TEXT Code:
  1.  
  2. bool bpInitialize(breakpoints_t *pBreakPoints)
  3. {
  4. memcpy(&gBreakPoints, pBreakPoints, sizeof(gBreakPoints));
  5.  
  6. if (gBreakPoints.hThread == NULL)
  7. gBreakPoints.hThread = GetCurrentThread();
  8.  
  9. for (int i = 0; i < 4; i++)
  10. {
  11. if (*(gBreakPoints.bp[i].pSystemFunction) != NULL)
  12. continue;
  13.  
  14. gBreakPoints.bp[i].dwAddr = gBreakPoints.bp[i].dwFunctionAddr;
  15.  
  16. // length of opcode + 0x5
  17. size_t sStubSize = oplen((BYTE *)gBreakPoints.bp[i].dwAddr);
  18. *(gBreakPoints.bp[i].pSystemFunction) = malloc((sStubSize + 0x5));
  19.  
  20.  
  21. // copy the opcodes to the buffer
  22. memcpy(*(gBreakPoints.bp[i].pSystemFunction), (PVOID)gBreakPoints.bp[i].dwAddr, sStubSize);
  23.  
  24. // add a jmp instruction to the original system function at the end of the buffer
  25. *(PBYTE)((DWORD)*(gBreakPoints.bp[i].pSystemFunction) + (DWORD)sStubSize) = 0xE9;
  26. *(PDWORD)((DWORD)*(gBreakPoints.bp[i].pSystemFunction) + (DWORD)sStubSize + 0x1) = (((DWORD)gBreakPoints.bp[i].dwAddr + (DWORD)sStubSize) - ((DWORD)*(gBreakPoints.bp[i].pSystemFunction) + (DWORD)sStubSize + 0x5));
  27.  
  28. }
  29.  
  30. if (pExceptionHandler == NULL)
  31. pExceptionHandler = AddVectoredExceptionHandler(1, ExceptionHandler);
  32. return true;
  33. }
  34.