Autor Beitrag
Avanel
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 29.01.11 00:42 
----


Zuletzt bearbeitet von Avanel am Do 24.03.11 04:49, insgesamt 2-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 29.01.11 00:49 
Crossposts bitte immer mit Link angeben ;-)

Bzgl. deiner Routine:

Kannst Du bitte von der gehookten Funktion den ASM-Source der ersten Zeilen mal geben? Auch bei deiner Prozedur: Wenn Du einen __thiscall haben willst: Wo ist der Instanz-Zeiger bei der Parameter-Übergabe?

Auch zerlegst Du Dir durch deine derzeitige Vermischung von ASM und Pascal höchstwahrscheinlich das Stackframe.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Avanel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 29.01.11 01:02 
~~~~


Zuletzt bearbeitet von Avanel am Do 24.03.11 04:50, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 29.01.11 02:03 
Jeder ASM-Block in Delphi erzeugt eine Reihe von zusätzlichem ASM-Code, der in jeder Delphi-Version wechseln kann. Grad wenn man über die Register auf Sachen zugreift, hab ich's nicht erst einmal erlebt, dass der Compiler die Register dann genau woanders hingelegt hat.

Die einfachste Lösung hier wäre, den zusätzlichen Parameter für This als const __this: Pointer; als erstes Argument mit anzugeben, wenn der auf'm Stack liegt, ODERdeinen Hook selber zu wrappen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure Wrapper(p1, p2: DWORD); stdcall;

    Procedure ActualFunc(__this: Pointer; P1, p2: DWORD);
    Begin
        //Hier den eigentlichen Code für den Hook, kein ASM mehr nötig
    end;

asm
    //Secure the Stack Frame
    push    ebp
    mov     ebp, esp
    SUB     esp, $0C

    //Arguments seem to come from: [EBP], [EBP+4] und ECX
    //Copy them over for register (Pascal)
    MOV     EAX, DWORD PTR [EBP]
    MOV     EDX, DWORD PTR [EBP+4]
    //MOV     ECX, ECX // aka "NOP" ;-)

    CALL ActualFunc

    //Clear our internal stackframe
    POP     EBP
end;  //RET generated by compiler


Zum Aufruf der weitergeleiteten Funktion einfach ein Trampolin verwenden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure CallThisfunc(F: Pointer; __this: Pointer; d1, d2: DWORD);
asm
    //Stack contains our return address at the top, just build the new stackframe from here
    PUSH    ECX  //put d1 onto the stack
    XCHG    ECX, DWORD PTR [ESP+8//read d2
    XCHG    ECX, DWORD PTR [ESP] //d2 onto stack, d1 into ECX
    PUSH    ECX  //Put d1 onto the stack
    XCHG    ECX, EDX //Get the __this pointer into ECX
    PUSH    EAX  //Put the function pointer onto the stack
end//The RET now jumps to our destination


Ist ungetestet, dürfte aber das Prinzip zeigen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.

Für diesen Beitrag haben gedankt: Avanel
Avanel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 29.01.11 02:39 
------


Zuletzt bearbeitet von Avanel am Do 24.03.11 04:50, insgesamt 1-mal bearbeitet
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 29.01.11 11:11 
Dein Problem liegt aber woanders: Es werden 2 Timestamps gepusht (wie du schon erkannt hast)
Also liegt nahe, dass die Funktion die Differenz der beiden berechnet um auf die vergangene Zeit zu kommen. Du verschiebst jetzt aber beide Timestamps um die gleiche Zeit --> Differenz ist gleich.
Fazit: Du darfst nur dwTime1 verschieben. BTW: Das Trunc bitte nach der Berechnung. Sonst kannst du nie die Zeit langsamer machen...

Für diesen Beitrag haben gedankt: Avanel
Avanel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 29.01.11 21:54 
----------