有没有可能模仿 loadlibrary
函数呢?我想从BLOB字段中加载一个库,而不需要先将其写入临时文件,并且需要一种不依赖于特定版本的Delphi编译器或Windows系统的解决方案,也不会触发反病毒软件。
有没有可能模仿 loadlibrary
函数呢?我想从BLOB字段中加载一个库,而不需要先将其写入临时文件,并且需要一种不依赖于特定版本的Delphi编译器或Windows系统的解决方案,也不会触发反病毒软件。
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;
loadlibrary
加载它。通过上述代码,我可以将我的加密函数存储在智能卡中,并直接将其加载到内存中。 - iMan Biglaridzlib包含一个现成的对象,用于将dll从资源中读取到内存中并使用它,而不必将其保存到磁盘上:
这是主文件...
http://sourceforge.net/p/dzlib/code/147/tree/dzlib/trunk/src/u_dzResourceDllLoader.pas
...但它需要来自同一代码库的其他文件。
在delphi.about.com上有一篇文章,展示了如何从资源中加载dll。
首先将资源加载到内存中,然后使用Memory Module从资源中加载dll。
您可以使用数据库或其他任何来源来加载dll,只需将其保存在内存流中,然后使用以下代码加载和执行dll函数,这看起来非常像调用dll的“正常”代码:
var
btMM: PBTMemoryModule;
begin
btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize);
try
if btMM = nil then Abort;
@m_TestCallstd := BTMemoryGetProcAddress(btMM, 'TestCallstd');
if @m_TestCallstd = nil then Abort;
m_TestCallstd('This is a Dll Memory call!');
except
Showmessage('An error occoured while loading the dll: ' + BTMemoryGetLastError);
end;
if Assigned(btMM) then BTMemoryFreeLibrary(btMM);
end;