Thema: Delphi MessageBox ersetzen

Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 22:06
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).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat