![]() |
...Methodenzeiger in Funktionszeiger konvertieren?
Bei den
![]()
Delphi-Quellcode:
Dazu hätte ich noch Verständnisfragen:
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; 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 :gruebel: 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. |
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
Zitat:
Zitat:
Zitat:
Zitat:
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). |
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
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?
|
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
Du tust Code implementieren, keine Daten speichern!
In deinen 15 Bytes steht folgendes (in Hex)
Code:
Kannst du durchzählen .. ergibt 15.
B9 (1 Byte)
[M.Data] (4 Bytes) 5A (1 Byte) 51 (1 Byte) 52 (...) B9 [M.Code] (4 Bytes) FF E1 Das sind OpCodes. Der Opcode B9 erwartet einfach eine 32bit-Zahl hintendrann, also so in ASM:
Code:
Und die 4 Bytes hinter B9 (was ja so viel heist wie mov ecx,...) füllst du mit sinnvolleren Werten aus TMethod.
B901020304 mov ecx,$04030201
5A pop edx 51 push ecx 52 push edx B900000000 mov ecx,$00000000 FFE1 jmp ecx 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. |
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
Zitat:
Delphi-Quellcode:
und
result:=virtualalloc(nil,15,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
Delphi-Quellcode:
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. |
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
Liste der Anhänge anzeigen (Anzahl: 1)
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.
|
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
wenn du ein kleines testprogramm anhängst könnte ich es unter windows server 2003 probieren.
|
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
Liste der Anhänge anzeigen (Anzahl: 1)
OK, hier ist die Echse:
|
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
unter vista funktioniert das demo exe auch
|
Re: ...Methodenzeiger in Funktionszeiger konvertieren?
Liste der Anhänge anzeigen (Anzahl: 1)
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz