Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

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

Re: MakeProcInstance & Priviligierte Anweisung

  Alt 8. Jun 2009, 13:18
Das ist komplizierter als ich dachte.
Ich habe jetzt die Version 0 fertig. Die funktioniert aber nur solange du keinen Mehrfachaufruf machst:
Delphi-Quellcode:
function MakeProcInstance(M: TMethod): Pointer;
  begin
    // Ausführbaren Speicher alloziieren
    Result := VirtualAlloc(nil, $27, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    asm
      // POP EDX (bisherige Rücksprungadresse nach edx)
      MOV BYTE PTR [EAX], $5A
      // CALL +4 (4 Bytes Platz für Speicherung der Rücksprungaddresse)
      MOV BYTE PTR [EAX+$01], $E8
      MOV BYTE PTR [EAX+$02], $04
      MOV BYTE PTR [EAX+$03], $00
      MOV BYTE PTR [EAX+$04], $00
      MOV BYTE PTR [EAX+$05], $00
      // DD 0
      MOV DWORD PTR [EAX+$06], $00000000
      // POP ECX (Addresse vonn "DD 0" nach ECX)
      MOV BYTE PTR [EAX+$0A], $59
      // MOV [ECX], EDX (Rücksprungaddresse bei "DD 0" speichern)
      MOV BYTE PTR [EAX+$0B], $89
      MOV BYTE PTR [EAX+$0C], $11
      // MOV ECX, (Self nach ECX)
      MOV BYTE PTR [EAX+$0D], $B9
      MOV ECX, M.Data
      MOV DWORD PTR [EAX+$0E], ECX
      // PUSH ECX (self als Parameter 0 anfügen)
      MOV BYTE PTR [EAX+$12], $51
      // MOV ECX, (Adresse nach ecx laden)
      MOV BYTE PTR [EAX+$13], $B9
      MOV ECX, M.Code
      MOV DWORD PTR [EAX+$14], ECX
      // CALL ECX (Sprung an den ersten abgelegten Befehl und Methode aufrufen)
      MOV BYTE PTR [EAX+$18], $FF
      MOV BYTE PTR [EAX+$19], $D1
      // POP ECX (Self vom Stack löschen)
      MOV BYTE PTR [EAX+$1A], $59
      // CALL +0 (aktuelle Addresse ermitteln)
      MOV BYTE PTR [EAX+$1B], $E8
      MOV DWORD PTR [EAX+$1C], $00000000
      // POP ECX (aktuelle Addresse nach ECX)
      MOV BYTE PTR [EAX+$20], $59
      // ADD ECX, -19 (Addresse von "DD 0" errechnen)
      MOV BYTE PTR [EAX+$21], $83
      MOV BYTE PTR [EAX+$22], $C1
      MOV BYTE PTR [EAX+$23], $E6
      // MOV EDX, [ECX] (Rücksprungadresse von "DD 0" nach EDX)
      MOV BYTE PTR [EAX+$24], $8B
      MOV BYTE PTR [EAX+$25], $11
      // PUSH EDX (Rücksprungadresse zurück auf den Stack)
      MOV BYTE PTR [EAX+$26], $52
      //RET
      MOV BYTE PTR [EAX+$27], $C3
    end;
  end;
Edit: Vergiss nicht, dass zu jedem VirtualAlloc ein VirtualFree gehört (müsste Lucki auch in seinem Code haben), wenn du die Klasse nicht mehr benötigst.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat