Einzelnen Beitrag anzeigen

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, 14: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