Zitat von
himitsu:
100%: die Parameter müssen übereinstimmen (denk ich mal)
und so wie das aussieht überschreibt man damit die ersten Bytes der Funktion ... also mit einem Sprung in die neue Funktion ... demnach könnte man damit alles ersetzten, zerstört damit aber die Originalfunktion, diese ist dann also nicht mehr nutzbar?
mir fällt grad ein, daß an Posiion @MessageBoxA doch auch nur ein Jump steht
@Bärchen: wirde es dann denn nicht ausreichen, wenn du den Jump-Befehl stehen läßt und nur die Adresse änderst?
@Himitsu: Bei der statichen Variante steht da wirklich nur ein Jump, wenn du die Funktion mit GetProcAddress ermittelst bekommst du die Adresse wo der staatiche Jump hinzeigt. Idealerweise sollte also die statiche Adresse von MessageBox, von MessageBoxA (ist eine andere als die von MessageBox) oder nur die Adresse welche bei GetProcAddress zurück geliefert wird (denn GetProcAddress liefert die richtige Adresse der Funktion und nicht nur die Adresse wo dann erst zur richten Funktion gesprungen wird.
Also Idealer Weise so:
Delphi-Quellcode:
var lLib: Cardinal;
begin
lLib := LoadLibrary('user32.dll');
if (lLib <> 0) then
begin
ReplaceFunktion(GetProcAddress(lLib, 'MessageBoxA'), @MessageBoxB);
FreeLibrary(lLIb);
end;
end;
@Codewalker: Wenn du eine
AV bekommst ist dein Funktionrumpf nicht mit dem originalen Identisch. Die Parameter müssen gleich sein und auch die Aufrufkonvention. Wenn du zum Beispiel "stdcall" weglässt geht es schon schief.
Im falle von MessageBoxA bzw. MessageBox muss dein Funktionskopf exakt so aussehen (ausgenommen der Funktionsname):
function Funktionsname(AHandle: HWND; AMsg, ATitle: PChar; uType: Cardinal): Integer; stdcall;
Es darf also keine Methode etc. sein sondern muss eben exakt mit der declaration der Originalfunktion übereinstimmen.
Das die Originale Funktion dabei zerstört wird ist richtig. Aus dem Grund hab ich vor das ganze in eine Klasse zu packen so das man eine Funktion ersetzen kann und später auch wieder herstellen (so das beim ersetzen der Teil welcher überschrieben wird, gesichert wird).