add loadModule(memorystream, internalfilename, executeEntryPoint OPTIONAL default=true, timeout OPTIONAL default=nil=infinite)

This commit is contained in:
Dark Byte 2023-11-27 23:13:38 +01:00
parent 85f8dc1587
commit c83cfcece2
3 changed files with 64 additions and 29 deletions

View File

@ -27,36 +27,59 @@ var
usetimeout: boolean=false;
timeout: integer;
paramoffset: integer;
o: TObject;
ms: tmemorystream absolute o;
begin
result:=0;
paramoffset:=0;
if lua_gettop(L)>=1 then
begin
filename:=Lua_ToString(L,1);
try
ml:=TModuleLoader.create(filename);
ml.createSymbolListHandler;
except
on e: exception do
if lua_isstring(L,1) then
begin
filename:=Lua_ToString(L,1);
try
ml:=TModuleLoader.create(filename);
ml.createSymbolListHandler;
except
on e: exception do
begin
lua_pushnil(L);
lua_pushstring(L,e.message);
exit(2);
end;
end;
end
else
if lua_isuserdata(L,1) then
begin
o:=lua_toceuserdata(L, 1);
if o is TMemoryStream then //(memstream, filename, executeEntrypoint, timeout)
begin
lua_pushnil(L);
lua_pushstring(L,e.message);
exit(2);
if lua_gettop(L)>=2 then
filename:=Lua_ToString(L,2);
ml:=TModuleLoader.create(ms, filename);
ml.createSymbolListHandler;
paramoffset:=1;
end;
end;
if lua_gettop(L)>=2 then
executeEntryPoint:=lua_toboolean(L,2)
if lua_gettop(L)>=2+paramoffset then
executeEntryPoint:=lua_toboolean(L,2+paramoffset)
else
executeEntryPoint:=true;
if lua_gettop(L)>=3 then
if lua_gettop(L)>=3+paramoffset then
begin
if lua_isnil(L,3) then
if lua_isnil(L,3+paramoffset) then
useTimeout:=false
else
begin
useTimeout:=true;
timeout:=lua_tointeger(L,3);
timeout:=lua_tointeger(L,3+paramoffset);
end;
end
else

View File

@ -38,10 +38,12 @@ type TModuleLoader=class
importlist: TStringHashList;
procedure cleanupExportList;
function FindKernelModuleExport(modulename: string; exportname: string): ptruint;
procedure createFromMemoryStream(memstream: tmemorystream);
public
Exporttable: TStringlist;
procedure createSymbolListHandler;
constructor create(filename: string);
constructor create(memstream: tmemorystream; filename: string='<memstream>.dll');
published
property BaseAddress: ptruint read destinationBase;
property Loaded: boolean read FLoaded;
@ -67,6 +69,7 @@ var
begin
module:=ExtractFileName(filename);
fSymbolList:=TSymbolListHandler.create;
fSymbolList.name:=filename;
fSymbolList.AddModule(module,filename,destinationbase,modulesize,is64bit);
@ -104,7 +107,28 @@ begin
result:=0;
end;
constructor TModuleLoader.create(memstream: tmemorystream; filename: string='<memstream>.dll');
begin
inherited create;
self.filename:=filename;
createFromMemoryStream(memstream);
end;
constructor TModuleLoader.create(filename: string);
var m: TMemoryStream;
begin
inherited create;
self.filename:=filename;
m:=tmemorystream.create;
m.LoadFromFile(filename);
createFromMemoryStream(m);
m.free;
end;
procedure TModuleLoader.createFromMemoryStream(memstream: tmemorystream);
var
i,j,k: integer;
filemap: TMemorystream;
@ -134,11 +158,6 @@ var
processhandle: thandle;
mi: TModuleInfo;
begin
inherited create;
self.filename:=filename;
exporttable:=tstringlist.create;
pid:=processid;
@ -148,15 +167,9 @@ begin
processhandle:=dbk32functions.OP(ifthen<dword>(GetSystemType<=6,$1f0fff, process_all_access), true, pid);
filemap:=tmemorystream.Create;
filemap:=memstream;
filemap.Position:=0;
try
//showmessage('Loading '+filename);
//todo: add a filesearch if no patch is given
filemap.LoadFromFile(filename);
if PImageDosHeader(filemap.Memory)^.e_magic<>IMAGE_DOS_SIGNATURE then
raise exception.create(rsMMLNotAValidFile);
@ -422,8 +435,6 @@ begin
tempmap.free;
end;
finally
filemap.free;
cleanupExportList;
end;
end;

View File

@ -3737,6 +3737,7 @@ methods
ModuleLoader(Inheritance: -)
loadModule(pathtodll, executeEntryPoint OPTIONAL default=true, timeout OPTIONAL default=nil=infinite)
loadModule(memorystream, internalfilename, executeEntryPoint OPTIONAL default=true, timeout OPTIONAL default=nil=infinite)
properties:
loaded: boolean - true if successfuly mapped