我可以在Delphi中动态编译代码并执行它吗?

Tom*_*Tom 5 delphi assembly winapi interpreter compilation

是否可以生成一个字节数组,然后让Windows像普通代码一样执行它?假设我们有一些汇编代码:

inc  ecx
Run Code Online (Sandbox Code Playgroud)

这是一个计划的一部分.在我们用Nasm编译之后,我们得到一个EXE,其中上面的行被转换成这样的东西:

00000035 41 
Run Code Online (Sandbox Code Playgroud)

是否可以创建一个字节数组,用上面的字节填充它并执行 - 所以增量实际发生了?

我已经制作了超级简单的解释语言,但由于它被解释得很慢.我不想为它编写真正的编译器,但我想让它更快 - 编译并在运行中运行.

Rob*_*edy 14

绝对.支持数据执行预防的处理器和操作系统可能会犹豫不决,但这很容易规避.只需调用VirtualProtect将内存块标记为可执行文件.最好用它VirtualAlloc来分配你计划执行的内存.这样,您就拥有了专门用于可执行代码的整页内存.如果你VirtualProtect打算用GetMem可执行文件分配一些任意内存,它实际上会标记整个页面,所以你可能会意外地将某些数据标记为可执行文件.如果该数据受到损害,它可能会被执行.这正是DEP旨在防范的问题,因此最好将数据和可执行代码保存在单独受保护的区域中.

请记住,将文本代码转换为机器代码的任务编译,因此如果您不想编写真正的编译器,您可能根本不想生成机器代码.


Ego*_*off 7

const
   size = 32768;
type
   TFuncInt = function(param: Integer): Integer; // EAX -> EAX
   TByteArray = array[0..size-1] of Byte;
   PByteArray = ^TByteArray;
var
   arr: PByteArray;
   func_param: Integer;
   func_result: Integer;
begin
   arr := VirtualAlloc(nil, size, $3000, $40);
   if arr <> nil then begin
     arr[0] := $40;  // inc EAX
     arr[1] := $C3;  // ret
     func_param := 77;
     func_result := TFuncInt(arr)(func_param);  // 78
     VirtualFree(arr, 0, $8000);
  end;
end;
Run Code Online (Sandbox Code Playgroud)