AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi MakeProcInstance & Priviligierte Anweisung
Thema durchsuchen
Ansicht
Themen-Optionen

MakeProcInstance & Priviligierte Anweisung

Ein Thema von Corelgott · begonnen am 8. Jun 2009 · letzter Beitrag vom 8. Jun 2009
 
Benutzerbild von sirius
sirius

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

Re: MakeProcInstance & Priviligierte Anweisung

  Alt 8. Jun 2009, 13:40
Hier noch eine Version (MakeProcInstance für Aufrufkonvention "cdecl"):
Delphi-Quellcode:
function MakeProcInstance(M: TMethod): Pointer;
  begin
    // Ausführbaren Speicher alloziieren
    Result := VirtualAlloc(nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    asm
      // POP EDX (bisherige Rücksprungadresse nach edx)
      MOV BYTE PTR [EAX], $5A
      // CALL +0 (aktuelle Addresse ermitteln)
      MOV BYTE PTR [EAX+$01], $E8
      MOV DWORD PTR [EAX+$02], $00000000
      // POP ECX (Addresse nach ECX)
      MOV BYTE PTR [EAX+$06], $59
      // ADD ECX, $31 (Addresse von Liste errechnen)
      MOV BYTE PTR [EAX+$07], $83
      MOV BYTE PTR [EAX+$08], $C1
      MOV BYTE PTR [EAX+$09], $31
      // MOV EAX, [ECX] (Listenindex nach EAX)
      MOV BYTE PTR [EAX+$0A], $8B
      MOV BYTE PTR [EAX+$0B], $01
      // INC EAX (Listenindex erhöhen)
      MOV BYTE PTR [EAX+$0C], $40
      // MOV [ECX+EAX*4], EDX (Rücksprungaddresse in Liste eintragen)
      MOV BYTE PTR [EAX+$0D], $89
      MOV BYTE PTR [EAX+$0E], $14
      MOV BYTE PTR [EAX+$0F], $81
      // MOV [ECX], EAX (Index speichern)
      MOV BYTE PTR [EAX+$10], $89
      MOV BYTE PTR [EAX+$11], $01
      // MOV ECX, (Self nach ECX)
      MOV BYTE PTR [EAX+$12], $B9
      MOV ECX, M.Data
      MOV DWORD PTR [EAX+$13], ECX
      // PUSH ECX (self als Parameter 0 anfügen)
      MOV BYTE PTR [EAX+$17], $51
      // MOV ECX, (Addresse nach ecx laden)
      MOV BYTE PTR [EAX+$18], $B9
      MOV ECX, M.Code
      MOV DWORD PTR [EAX+$19], ECX
      // CALL ECX (Sprung an den ersten abgelegten Befehl und Methode aufrufen)
      MOV BYTE PTR [EAX+$1D], $FF
      MOV BYTE PTR [EAX+$1E], $D1
      // POP ECX (Self vom Stack löschen)
      MOV BYTE PTR [EAX+$1F], $59
      // CALL +0 (aktuelle Addresse ermitteln)
      MOV BYTE PTR [EAX+$20], $E8
      MOV DWORD PTR [EAX+$21], $00000000
      // POP ECX (aktuelle Addresse nach ECX)
      MOV BYTE PTR [EAX+$25], $59
      // ADD ECX, $12 (Addresse von Liste errechnen)
      MOV BYTE PTR [EAX+$26], $83
      MOV BYTE PTR [EAX+$27], $C1
      MOV BYTE PTR [EAX+$28], $12
      // MOV EDX, [ECX] (Listenindex nach EDX)
      MOV BYTE PTR [EAX+$29], $8B
      MOV BYTE PTR [EAX+$2A], $11
      // PUSH EAX (Funktionsresult retten)
      MOV BYTE PTR [EAX+$2B], $50
      // MOV EAX, [ECX+EDX*4] (Rücksprungaddresse nach EAX)
      MOV BYTE PTR [EAX+$2C], $8B
      MOV BYTE PTR [EAX+$2D], $04
      MOV BYTE PTR [EAX+$2E], $91
      // DEC EDX (Listenindex dekrementieren)
      MOV BYTE PTR [EAX+$2F], $4A
      // MOV [ECX], EDX (Listenindex speichern)
      MOV BYTE PTR [EAX+$30], $89
      MOV BYTE PTR [EAX+$31], $11
      // POP EDX (Funktionsresult nach EDX)
      MOV BYTE PTR [EAX+$32], $5A
      // PUSH EAX (Rücksprungadresse auf Stack)
      MOV BYTE PTR [EAX+$33], $50
      // MOV EAX, EDX (Funktionsresult zurück nach EAX)
      MOV BYTE PTR [EAX+$34], $89
      MOV BYTE PTR [EAX+$35], $D0
      // RET (End;)
      MOV BYTE PTR [EAX+$36], $C3
      // DD 0 (Anfang der Liste mit Index=0)
      MOV DWORD PTR [EAX+$37], $00000000
    end;
  end;
Hier wird am Ende eine Liste geführt mit mehreren Rücksprungadressen. Dadurch kann ein verschachtelter Aufruf erfolgen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
 


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 05:15 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