Zitat von
Luckie:
Kapier ich nicht. Sinnvoll ändern kan nman doch sowie so nur Bytes von Daten und über die habe ich doch sowieso in meinem Programm die volle Kontrolle.
Ich gebe Dir vollkommen recht, wenn man von dem Standpunkt ausgeht, das es sich um Variablen handelt die man Programatisch verändern kann.
z.B
Code:
A := 10;
A soll nun 11 werden.
A := 11;
Ist allemal sinnvoller als
WriteByte($woauchimmer,$B);
Wenn ich jedoch dynamisch den Code erweitern ohne jeweils alles neu zu Compilieren bzw. neu Auszuliefern hat man kaum eine andere Möglichkeit.
Pseudocode:
Code:
dbgMakeJump(hxInMSGProcBase, DWord(@InMsgProc) + 2, 0);
dbgMakeJump(DWord(@InMsgProc), hxInMSGProcBase-5, 0);
:
:
procedure dbgMakeJump(hxZielAddr, hxJumpAddr, NOPS: DWord);
Var
Buffer : Array[1..5] of Byte;
Data : DWord;
X : Byte;
begin
Data:= hxZielAddr - (hxJumpAddr + 5);
Move(Data, Buffer[2], 4);
Buffer[1]:= $E9;
WriteSecureBuffer(hxJumpAddr, @Buffer, 5);
For X:= 1 to NOPS do WriteSecureByte(hxJumpAddr + 4 + X, $90);
end;
Vorstehendender Code befindet sich in einer Debug-
DLL die nur geladen wird wenn Sie da ist. Ist dem So wird eine bestimmte Routine der Exe auf eine Funktion der
DLL umgebogen. Im Prinzip kommt das einen "Funktionshook" recht nahe.
Eine andere Einsatzmöglichkeit währe es auch z.B. einen Durchlaufszähler auf ähnliche Weise zu verändern. Nochmal deutlich hervorheben, will ich, daß die Änderungen aus der
DLL kommen und im Hauptprogramm vorgenommen werden. Die Änderung im Hauptprogramm selbst auf diese weise ist, wie bereits richtig festgestellt wurde, relativ sinnlos.
Gruß
Martin