ntdll

  • Ja, warum ach nicht :D Ne ich war nur irritiert, da die Funktion QueryPerformanceCounter nur ein Parameter hat und die Funktion ZwQueryPerformanceCounter zwei hat und ich mich seit gestern abend frag ob der eine Parm herkommt. Ich habe die Funktion versucht zu hooken, das das Game crashed, ich weiß nicht warum...Hier ist mein Code:


  • Das ist auch irgendwie klar, wenn du erst QueryPerformanceCounter hookst und dann ZwQueryPerformanceCounter als originale Funktion aufrufst.
    Und was du da mit den Registern machst, leuchtet mir auch nicht ein.


    MfG


    PS: Für deine erste Zeile gibts übrigens GetModuleHandle( "kernel32.dll" );

  • Schau dir mal die QueryPerformanceCounter in der kernel32.dll an. Er springt in die dort in die ntdll. Ist das dort nicht die ZwQueryPerformanceCounter Funktion?



    So mal mit einen Pointer versuchen, aber ich denke, dass wenn die orgianle Funktion aufgerufen wird, dann wie in einen Rad immer rundläuft...

  • Du kannst ja auch nicht direkt zur originalen Funktion springen, sondern speicherst dir die ersten 5 Bytes der Funktion und einen Jump zur Adresse der Funktion + 5 und das rufst du dann auf.


    [Software] Detour Function


    MfG

  • Steht alles in meinen "Detour Function"-Thread in der DetourCreate Methode.
    Du reservierst dir erstmal neuen Speicher (Dieser wird von einigen auch CodeCave genannt.) mit der größe 5 (für den Zurück-Jump) + den Bytes, die du am Anfang der Funktion überschreibst (Bei WinAPI sind das auch immer 5). Dann kopierst du die ersten n Bytes an dieser Stelle und füllst die letzten mit 0xE9 und der Distanz zwischen dieser Adresse und der Adresse an die du springen willst:
    DWORD dwOpDist = ( DWORD )lpOldFunc - ( DWORD )lpOpcodes - 5;
    Dann schreibst du den Jump zu deiner eigenen Funktion an den Anfang der originalen.


    Du musst, nachdem deine eigene Funktion aufgerufen wurde und du deinen Kram erledigt hast, natürlich jetzt diese CodeCave aufrufen und nicht direkt die originale.


    MfG