如何在delphi中直接从内存中执行代码?

iMa*_*ari 3 windows delphi api loadlibrary

有可能模仿这个loadlibrary功能吗?我想从BLOB字段加载一个库而不先将其写入临时文件,我需要一个不依赖于特定版本的delphi编译器或Windows的解决方案,并且不会触发防病毒软件.

klu*_*udg 6

是的,你可以,而且你不需要loadlibrary从内存中执行代码 - 你需要使用VirtualAlloc函数分配一个内存,并设置PAGE_EXECUTE标志


更新:这是一个快速而肮脏的演示代码,从32位Delphi的内存执行 - 我只测试它的工作原理:

type
  TIncMe = procedure(var I: Integer);

var
  IncMeProc: TIncMe;

procedure IncMe(var I: Integer);
begin
  Inc(I);
end;

procedure CopyIncMe;
var
  Size: LongWord;
  Tmp: Pointer;

begin
  Size:= LongWord(@CopyIncMe) - LongWord(@IncMe);
  Tmp:= VirtualAlloc(nil, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  Move(Pointer(@IncMe)^, Tmp^, Size);
  IncMeProc:= Tmp;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  J: Integer;

begin
  J:= 0;
  CopyIncMe;
  while J < 10 do begin
    IncMeProc(J);
    ShowMessage(IntToStr(J));
  end;
  VirtualFree(@IncMeProc, 0, MEM_RELEASE);
end;
Run Code Online (Sandbox Code Playgroud)

  • 如果存储的代码需要调用任何外部函数,则会出现问题,因为代码不知道这些函数地址的相对偏移量.修复地址是LoadLibrary执行的任务之一. (5认同)
  • +1是的,你应该小心不要解决外部代码; 仅具有局部变量的函数是移动到内存的最佳候选者. (2认同)

dum*_*uch 5

dzlib包含一个现成的对象,用于将资源从资源读入内存并使用它而无需将其保存到光盘:

这是主要档案......

http://sourceforge.net/p/dzlib/code/147/tree/dzlib/trunk/src/u_dzResourceDllLoader.pas

..但它需要来自同一存储库的其他文件.

  • 但请始终注意,这是MS正式不支持的.这是一个黑客,并希望它在未来回来并咬你. (3认同)