Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynamisch Code Erzeugen (https://www.delphipraxis.net/25645-dynamisch-code-erzeugen.html)

neolithos 9. Jul 2004 18:33


Dynamisch Code Erzeugen
 
Gibt es eine Möglichkeit in Windows eine Procedure dynamisch zu erzeugen.

Also ich lege die Binären Daten in den Speicher ab.
Gebe diesen Speicher ausführrechte.
Und springe zu guterletzt mit einem Call dorthin.

Hintergrund: Das nicht alle denken hier sollen irgentwelcher Viren entworfen werden.

Es geht darum eine Formel die durch den Nutzer angegebene wird, zu Compilieren und als Procedure im Programm abzulegen.

Nur für NT-Systeme.

neolithos 9. Jul 2004 18:52

Re: Dynamisch Code Erzeugen
 
Delphi-Quellcode:
function Fkt(a : Integer) : Integer;
var p : Pointer;
begin
  p := VirtualAllocEx(GetCurrentProcess, nil, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  Move(b, p^, SizeOf(b));
  asm
    mov ecx, p
    mov eax, a
    call ecx
    mov Result, eax
  end;
  VirtualFree(p, 1024, MEM_RELEASE);
end;
Ich habe das mal einfach so versucht. Leider bricht er nach einer weile ohne Fehlermeldung ab?

rantanplan99 9. Jul 2004 19:04

Re: Dynamisch Code Erzeugen
 
Ich weiss nicht ob ich dein Problem richtig verstanden habe.

1) Aber wie will dein Programm auf dem fremd Rechner Code kompilieren?

2) Tuts nicht auch den Code in eine DLL zu packen? Also das der neue Code mit der Funktion als DLL abgelegt wird?

neolithos 9. Jul 2004 19:16

Re: Dynamisch Code Erzeugen
 
Ich will einen sehr sehr flinken Formel-Parser entwickeln!
Delphi-Quellcode:
var b : array [0..5] of byte = ($03, $C0, $83, $E8, $03, $C3); // a * 2 - 3

function Fkt(a : Integer) : Integer;
var p : Pointer;
begin
  p := VirtualAlloc(nil, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if p = nil then
     raise Exception.Create('p=nil');

  CopyMemory(p, @b, SizeOf(b));
  asm
    mov ecx, p
    mov eax, a
    call ecx
    mov Result, eax
  end;
  VirtualFree(p, 0, MEM_RELEASE);
end;
Und dynamisch Code ausführen ist einfacher als ich dachte!

dizzy 9. Jul 2004 19:21

Re: Dynamisch Code Erzeugen
 
Also so langsam werde ich hier von meinen wachsenden Ohren erschlagen! Was du da machst stellt bei mir z.Zt. sämtliche Klausurübungsbemühungen in einen gaaaanz dunkeln Schatten!

...auch machen will! Wenn das ginge *froi*, wär das der Knaller! Evtl. könnten wir ja kooperieren! Weil ich hab so eben auch noch meine Lib für Komplexe Zahlen und Quaternionen korrigiert, und da könnte man doch was drehen :?:

neolithos 9. Jul 2004 19:30

Re: Dynamisch Code Erzeugen
 
Von Complexen Zahlen und Co habe ich wiederrum keine Ahnung. Das ist eher mein gefilte.

Ich studiere Wirtschaftsinformatik! Und unsere oberste divise ist: "Vermeide jede Gleitkommaoperation".

Deshalb müsste ich mich jetzt langsam mal mit den FPU-Befehlen auseinander setzten.
Das ist ein riesen Stück arbeit. Denn was ich da vor habe und wo du kooperieren möchtest, ist fast ein vollwertiger Compilier.

Das kann Wochen dauern bis das Teil steht.


Mein erster Schritt wird Wahrscheinlich sein,den Parser und Scanner von C# nach Delphi umzuheben.
Dann kommt das was ich noch nie gemacht habe. Code für eine Register-Maschine zu erzeugen.

FRAGE: Hast du eine ICQ-Nummer?

dizzy 9. Jul 2004 19:36

Re: Dynamisch Code Erzeugen
 
Hab dich im ICQ angetüdelt...

LarsMiddendorf 9. Jul 2004 20:39

Re: Dynamisch Code Erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe so etwas auch mal gemacht. Vielleicht hilft euch das als Anregung. Die Klasse ist im Anhang. Ist aber nur für single Zahlen.

exp:=TExpression.create('a+b',['a','b']);
exp.Evaluate([1,2]);

Wenn man das noch ein wenig weiter fortsetzen möchte kann man auch dynamisch komplette Units und Delphi kompatible Klassen generieren.
http://www.delphigl.com/forum/viewtopic.php?t=2803


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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