export the SavedResultHandler to lua

This commit is contained in:
Dark Byte 2021-06-11 10:23:19 +02:00
parent 23cd930baf
commit ec8e7d0f8e
4 changed files with 138 additions and 4 deletions

View File

@ -12,7 +12,7 @@ procedure initializeMemscan;
implementation
uses luaclass, LuaObject;
uses luaclass, LuaObject, savedscanhandler;
resourcestring
rsNotAllParametersHaveBeenProvided = 'Not all parameters have been provided';
@ -167,6 +167,58 @@ begin
result:=1;
end;
function memscan_getSavedResultHandler(L: Plua_State): integer; cdecl;
var
memscan: TMemscan;
name: string;
ssh: TSavedscanHandler;
begin
result:=0;
memscan:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
name:=Lua_ToString(L, -1);
try
ssh:=TSavedScanHandler.create(memscan.GetScanFolder,name);
ssh.AllowNotFound:=true;
ssh.AllowRandomAccess:=true;
ssh.memscan:=memscan;
luaclass_newClass(L,ssh);
exit(1);
except
on e: exception do
begin
lua_pushnil(L);
lua_pushstring(L,e.message);
exit(2);
end;
end;
end;
end;
function memscan_getSavedResultList(L: Plua_State): integer; cdecl;
var
memscan: TMemscan;
r: tstringlist;
i: integer;
begin
memscan:=luaclass_getClassObject(L);
r:=tstringlist.create;
memscan.getsavedresults(r);
lua_createtable(L,r.count,0);
for i:=0 to r.count-1 do
begin
lua_pushinteger(L,i+1);
lua_pushstring(L, r[i]);
lua_settable(L,-3);
end;
result:=1;
r.free;
end;
function memscan_saveCurrentResults(L: Plua_State): integer; cdecl;
var
@ -251,6 +303,8 @@ begin
luaclass_addClassFunctionToTable(L, metatable, userdata, 'waitTillDone', memscan_waitTillDone);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getProgress', memscan_getProgress);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'saveCurrentResults', memscan_saveCurrentResults);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSavedResultList', memscan_getSavedResultList);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSavedResultHandler', memscan_getSavedResultHandler);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getAttachedFoundlist', memscan_getAttachedFoundlist);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setOnlyOneResult', memscan_setreturnOnlyOneResult);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getOnlyResult', memscan_getOnlyResult);

View File

@ -26,6 +26,7 @@ begin
if ShouldAppsUseDarkMode and (parent<>nil) then
begin
ToolTips:=false;
AllowDarkModeForWindow(handle, 1);
SetWindowTheme(Handle, 'explorer', nil);

View File

@ -4,7 +4,7 @@ Additions and changes:
structure dissect add to addresslist uses the addressstring instead of number, so symbols will be preserved
structure dissect now has a option to save the previous state of a column and show changes easier
Added {$LUACODE} blocks for inline Lua coding
Added a c-compiler to CE (compile)
Added a c-compiler to CE
Added {$C} blocks to the auto assembler. all {$C} blocks get combined into one script before execution
Added {$CCODE} blocks for inline C coding (Check the forum, wiki, CE patreon discord or CE's youtube)
Added a C# compiler (compilecs)
@ -34,14 +34,17 @@ Fixes:
fixed assembling movsq
fixed ultimap ret filter
fixed luapipe never calling OnError
fixed vehdebug in 64-bit CE zeroing out the FPU registers in 32-bit targets
fixed DBVM find what access/writes sometimes skipping entries on AMD
fixed undo not working on memory records when using the single line editor
fixed hide children group option when loading a table
lua:
changes:
saveTable won't ask to sign the table anymore
messageDialog will work if you omit the buttonlist. (Defaults to mbOK then)
added more customizabe button
registerSymbol no longer errors out the whole script on failure. It now overwrites existing symbols
New functions:
form.saveToStream
@ -51,8 +54,10 @@ lua:
signTable
symbollist.getModuleList
symbollist.getSymbolList
memscan.getSavedResultHandler
memscan.getSavedResultList
SavedResultHandler class
How to use:

View File

@ -131,7 +131,10 @@ type
lastFail: integer;
AllowRandomAccess: boolean; //set this if you wish to allow random access through the list. (EXTREMELY INEFFICIENT IF IT HAPPENS, addresslist purposes only)
AllowNotFound: boolean; //set this if you wish to return nil instead of an exception if the address can't be found in the list
memscan: TObject;
function getpointertoaddress(address:ptruint;valuetype:TVariableType; ct: TCustomType; recallifneeded: boolean=true): pointer;
function getStringFromAddress(address: ptruint; out r: string; Hexadecimal: boolean=false; Signed: boolean=false): boolean;
procedure deinitialize;
procedure reinitialize;
@ -144,7 +147,8 @@ end;
implementation
uses Math, globals;
uses Math, globals, memscan, lua, lauxlib, lualib, LuaClass, LuaObject,
LuaHandler, byteinterpreter;
resourcestring
rsMaxaddresslistcountIs0MeansTheAddresslistIsBad = 'maxaddresslistcount is 0 (Means: the addresslist is bad)';
@ -296,6 +300,24 @@ begin
LastAddressAccessed.index:=0; //reset the index
end;
function TSavedScanHandler.getStringFromAddress(address: ptruint; out r: string; Hexadecimal: boolean=false; Signed: boolean=false): boolean;
var
p: pointer;
ms: TMemScan;
begin
result:=false;
if memscan=nil then exit;
ms:=TMemscan(memscan);
p:=getpointertoaddress(address, ms.VarType, ms.Customtype);
if p<>nil then
begin
r:=readAndParsePointer(address, p, ms.VariableType, ms.Customtype, hexadecimal, Signed);
result:=true;
end;
end;
function TSavedScanHandler.getpointertoaddress(address:ptruint;valuetype:TVariableType; ct: Tcustomtype; recallifneeded: boolean=true): pointer;
var i,j: integer;
pm: ^TArrMemoryRegion;
@ -773,5 +795,57 @@ begin
deinitialized:=false;
end;
//---------------LUA-------------------
function savedscanhandler_getStringFromAddress(L: PLua_State): integer; cdecl;
var
address: ptruint;
ssh: TSavedScanHandler;
r: string;
hexadecimal, signed: boolean;
begin
result:=0;
ssh:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
try
address:=lua_toaddress(L,1);
except
on e: exception do
begin
lua_pushnil(L);
lua_pushstring(L, e.Message);
exit(2);
end;
end;
if lua_Gettop(L)>=2 then
hexadecimal:=lua_toboolean(L,2)
else
hexadecimal:=false;
if lua_getProperty(L)>=3 then
signed:=lua_toboolean(L,3)
else
signed:=false;
if ssh.getStringFromAddress(address,r, hexadecimal, signed) then
lua_pushstring(L,r)
else
lua_pushnil(L);
result:=1;
end;
end;
procedure savedscanhandler_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
object_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getStringFromAddress', savedscanhandler_getStringFromAddress);
end;
initialization
luaclass_register(TSavedScanHandler, savedscanhandler_addMetaData);
end.