能否生成一个字节数组,然后让Windows像正常代码一样执行它?假设我们有一些汇编代码:
inc ecx
这是程序的一部分。在使用Nasm编译后,我们得到一个EXE文件,其中上述行被转换为类似于以下内容:
00000035 41
是否有可能创建一个字节数组,填充上述字节并执行-这样增量实际上就会发生?
我已经建立了我的超级简单的解释性语言,但是由于它是解释型的,因此速度相当慢。我不想为此编写真正的编译器,但我想让它更快-实时编译和运行。
能否生成一个字节数组,然后让Windows像正常代码一样执行它?假设我们有一些汇编代码:
inc ecx
这是程序的一部分。在使用Nasm编译后,我们得到一个EXE文件,其中上述行被转换为类似于以下内容:
00000035 41
是否有可能创建一个字节数组,填充上述字节并执行-这样增量实际上就会发生?
我已经建立了我的超级简单的解释性语言,但是由于它是解释型的,因此速度相当慢。我不想为此编写真正的编译器,但我想让它更快-实时编译和运行。
VirtualProtect
将内存块标记为可执行即可。最好使用VirtualAlloc
来分配要执行的内存。这样,您就有了一个完整的内存页面专门用于可执行代码。如果您调用VirtualProtect
使一些随意分配的内存可执行,则实际上会将整个页面标记为这种方式,因此可能会意外地将某些数据标记为可执行内容。如果该数据受到损害,可能会被执行。这正是DEP旨在保护的内容,因此最好将数据和可执行代码保留在单独的受保护区域中。
请记住,将文本代码转换为机器代码的任务就是编译,因此,如果您不想编写真正的编译器,您可能不想生成机器代码。
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;
Page_Execute_ReadWrite
。你应该手动定义它,或者使用数字值代替。 - Egor Skriptunoff