AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MessageBox ersetzen

Ein Thema von Codewalker · begonnen am 4. Jul 2006 · letzter Beitrag vom 4. Jul 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#11

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 17:16
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#12

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 20:18
Ich habs mal ausprobiert und irgendwie bekomme ich immer eine Schutzverletzung. Hast du vielleicht ein Beispielprojekt?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 20:33
Warum dieser Umstand und dieses rumgehacke im Quellcode? Du hast doch selber eine Möglichkeit gefunden (MessageboxTimeOut) und ich habe dir noch eine weitere gezeigt? Warum nimmst du nicht eine davon, wenn du schon nicht alles in ein Log schreiben willst.

Im Anhang noch mal beide Versionen in einer Demo von mir.
Angehängte Dateien
Dateityp: zip selfclosing_messageboxes_513.zip (201,4 KB, 14x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz