AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) ...Methodenzeiger in Funktionszeiger konvertieren?
Thema durchsuchen
Ansicht
Themen-Optionen

...Methodenzeiger in Funktionszeiger konvertieren?

Ein Thema von Luckie · begonnen am 3. Aug 2007 · letzter Beitrag vom 3. Aug 2007
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

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

...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 09:59
Bei den Schweizern gibt es folgenden Code, um einen Methodenzeiger in einen Funktionszeiger zu konvertieren:
Delphi-Quellcode:
function MakeProcInstance(M: TMethod): Pointer;
begin
  // allocate memory
  GetMem(Result, 15);
  asm
    // MOV ECX,
    MOV BYTE PTR [EAX], $B9
    MOV ECX, M.Data
    MOV DWORD PTR [EAX+$1], ECX
    // POP EDX
    MOV BYTE PTR [EAX+$5], $5A
    // PUSH ECX
    MOV BYTE PTR [EAX+$6], $51
    // PUSH EDX
    MOV BYTE PTR [EAX+$7], $52
    // MOV ECX,
    MOV BYTE PTR [EAX+$8], $B9
    MOV ECX, M.Code
    MOV DWORD PTR [EAX+$9], ECX
    // JMP ECX
    MOV BYTE PTR [EAX+$D], $FF
    MOV BYTE PTR [EAX+$E], $E1
  end;
end;
Dazu hätte ich noch Verständnisfragen:

1: Warum ist der Speicherbereich, der mit GetMem alloziiert wird ausführbar?
2: Warum werden 15 Bytes alloziiert? 4 Byte Code-Zeiger + 4 Byte Daten-Zeiger + 4 Byte Aufruf der Methode + 4 Byte Rückgabewert = 16
3: Warum wird in dem Code alles mit MOV gemacht?
4: Könnte mal bitte jemand entsprechend Kommentare einfügen im Code an den Stellen an dem der Code-Zeiger, Daten-Zeiger, der Aufruf und der Rückgabewert in den Speicherbereich kopiert werden? Ich kann leider kein ASM.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 10:35
Zitat von Luckie:
1: Warum ist der Speicherbereich, der mit GetMem alloziiert wird ausführbar?
Schonmal ausgeführt auf einem Betriebssystem welches das NO-EXECUTION Flag (Intel's name, AMD nennts ein wenig anders) unterstützt? Ich wette, dass läuft dann nicht mehr. (Windows 2003 und aufwärts)

Zitat von Luckie:
2: Warum werden 15 Bytes alloziiert? 4 Byte Code-Zeiger + 4 Byte Daten-Zeiger + 4 Byte Aufruf der Methode + 4 Byte Rückgabewert = 16
In den 15 Bytes legt er mit dem MOV Befehlen 15 Bytes an Code ab, aber keine der o.g. Zeiger/Adressen.

Zitat von Luckie:
3: Warum wird in dem Code alles mit MOV gemacht?
Der Code aus dem anderen Thread zeigt den Push/Pop der aktuell ausgeführt wird bei einem Aufruf. Dieser Code bewegt die Opcodes des (fast) gleichen Code in die 15 Bytes die alloziiert wurden und diese werden dann durchlaufen.

Zitat von Luckie:
4: Könnte mal bitte jemand entsprechend Kommentare einfügen im Code an den Stellen an dem der Code-Zeiger, Daten-Zeiger, der Aufruf und der Rückgabewert in den Speicherbereich kopiert werden? Ich kann leider kein ASM.
Jo, kann ich gerne heute Abend mache, aber wegen den bewegten Opcodes kann ich dir diese nicht dekodieren, da ich die Unterlagen zu Hause habe...

Grundlegend macht der Code aber nur folgendes:

- 15 Bytes alloziieren
- in diesen nacheinander die Opcodes ablegen (welche Self vor dem Aufruf auf den Stack legen)
- Rückgabe der 15 Bytes als Ergebnis. D.h. er springt an den ersten abgelegten Befehl der 15 Bytes und macht genau dies (und im Endeffekt die Methode aufrufen).
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 10:40
Danke, das reicht mir schon. In dem anderen Thread wurde mir auch schon geholfen. Wie bekommt man das auch unter Os zum Laufen die den NO-EXECUTION Flag unterstützen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 10:42
Du tust Code implementieren, keine Daten speichern!
In deinen 15 Bytes steht folgendes (in Hex)
Code:
B9       (1 Byte)
[M.Data] (4 Bytes)
5A      (1 Byte)
51       (1 Byte)
52       (...)
B9
[M.Code] (4 Bytes)
FF
E1
Kannst du durchzählen .. ergibt 15.
Das sind OpCodes. Der Opcode B9 erwartet einfach eine 32bit-Zahl hintendrann,
also so in ASM:
Code:
B901020304     mov ecx,$04030201
5A            pop edx
51             push ecx
52             push edx
B900000000     mov ecx,$00000000
FFE1           jmp ecx
Und die 4 Bytes hinter B9 (was ja so viel heist wie mov ecx,...) füllst du mit sinnvolleren Werten aus TMethod.
Und EnumWindows ruft diese Funktion einfach auf, beginnend bei B901020304 ...

Man könnte MakeProcinstance, also das zusammensetzen der oben geschriebenen ASM Funktion, auch in Pascal schreiben. Aber das wäre nicht einfacher.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 10:47
Zitat von Luckie:
Danke, das reicht mir schon. In dem anderen Thread wurde mir auch schon geholfen. Wie bekommt man das auch unter Os zum Laufen die den NO-EXECUTION Flag unterstützen?
Funktionieren müsste definitvi statt getmem virtualalloc und statt freemem virtualfree.
result:=virtualalloc(nil,15,MEM_COMMIT,PAGE_EXECUTE_READWRITE); und
virtualfree(ProcInstance,15,MEM_DECOMMIT);
evtl. statt MEM_commit mem_reserve und entspr. auch bei virtualfree. Das weis ich immer nicht. Schau mal bei msdn.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 10:51
Also unter XP SP2 geht es immer noch mit VirtuallAlloc. Aber geht es auch unter OS mit diesen NO-EXECUTION Flag? Ich hänge das mal zum Test an.
Angehängte Dateien
Dateityp: dpr callbackmethod_189.dpr (2,5 KB, 29x 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
 
#7

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 11:03
wenn du ein kleines testprogramm anhängst könnte ich es unter windows server 2003 probieren.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 11:09
OK, hier ist die Echse:
Angehängte Dateien
Dateityp: exe callbackmethod_416.exe (17,0 KB, 20x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#9

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 11:16
unter vista funktioniert das demo exe auch
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Leonard

Registriert seit: 12. Okt 2005
Ort: Lutherstadt Eisleben
64 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: ...Methodenzeiger in Funktionszeiger konvertieren?

  Alt 3. Aug 2007, 11:17
Hi,
ich weiss nun nicht genau was passieren soll, aber im Anhang siehst du, was hier auf einem Windows2003 Standard Server mit SP2 ausgegeben wird.

mfg Leonard
Miniaturansicht angehängter Grafiken
testcallbackmethod_205.jpg  
Tobias
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 11:49 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