cheat-engine/Cheat Engine/LuaDisassembler.pas
Dark Byte 8292b1dc6d added isRep to the lua LastDisassemblerData field. And stepover now steps over rep instructions
changed mono compiler setting to better deal with exceptions
make the new view available to tracer as well
2021-12-07 23:17:28 +01:00

279 lines
6.9 KiB
ObjectPascal
Executable file

unit LuaDisassembler;
{$mode delphi}
interface
uses
Classes, SysUtils, disassembler, lua, lauxlib, lualib, symbolhandler, LastDisassembleData;
procedure initializeLuaDisassembler(L: PLua_state);
procedure LastDisassemblerDataToTable(L: PLua_State; t: integer; const ldd: TLastDisassembleData);
procedure LastDisassemblerDataFromTable(L: PLua_State; t: integer; var ldd: TLastDisassembleData);
implementation
uses LuaHandler, LuaClass, LuaObject;
function disassembler_disassemble(L: PLua_State): integer; cdecl;
var d: TDisassembler;
s,desc: string;
address: ptruint;
begin
result:=0;
d:=luaclass_getClassObject(L);
if lua_gettop(L)=1 then
begin
if lua_type(L,1)=LUA_TSTRING then
address:=symhandler.getAddressFromNameL(Lua_ToString(L, 1))
else
address:=lua_tointeger(L, 1);
s:=d.disassemble(address, desc);
lua_pushstring(L, s);
result:=1;
end;
end;
function disassembler_decodeLastParametersToString(L: PLua_State): integer; cdecl;
var d: TDisassembler;
begin
d:=luaclass_getClassObject(L);
lua_pushstring(L, d.DecodeLastParametersToString);
result:=1;
end;
procedure LastDisassemblerDataFromTable(L: PLua_State; t: integer; var ldd: TLastDisassembleData);
var bytestable: integer;
i, size: integer;
begin
lua_pushstring(L,'address');
lua_gettable(L, t);
ldd.address:=lua_tointeger(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'opcode');
lua_gettable(L, t);
ldd.opcode:=Lua_ToString(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'parameters');
lua_gettable(L, t);
ldd.parameters:=Lua_ToString(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'description');
lua_gettable(L, t);
ldd.description:=Lua_ToString(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'commentsoverride');
lua_gettable(L, t);
ldd.commentsoverride:=Lua_ToString(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'bytes');
lua_gettable(L, t);
bytestable:=lua_gettop(L);
size:=lua_objlen(L, bytestable);
setlength(ldd.Bytes, size);
for i:=1 to size do
begin
lua_pushinteger(L, i);
lua_gettable(L, bytestable);
ldd.bytes[i-1]:=lua_tointeger(L, -1);
lua_pop(L, 1);
end;
lua_pop(L, 1);
lua_pushstring(L,'modrmValueType');
lua_gettable(L, t);
ldd.modrmValueType:=TDisAssemblerValueType(lua_tointeger(L, -1));
lua_pop(L, 1);
lua_pushstring(L,'modrmValue');
lua_gettable(L, t);
ldd.modrmValue:=lua_tointeger(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'parameterValueType');
lua_gettable(L, t);
ldd.parameterValueType:=TDisAssemblerValueType(lua_tointeger(L, -1));
lua_pop(L, 1);
lua_pushstring(L,'parameterValue');
lua_gettable(L, t);
ldd.parameterValue:=lua_tointeger(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'isJump');
lua_gettable(L, t);
ldd.isjump:=lua_toboolean(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'isCall');
lua_gettable(L, t);
ldd.isCall:=lua_toboolean(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'isRet');
lua_gettable(L, t);
ldd.isRet:=lua_toboolean(L, -1);
lua_pop(L, 1);
lua_pushstring(L,'isConditionalJump');
lua_gettable(L, t);
ldd.isconditionaljump:=lua_toboolean(L, -1);
lua_pop(L, 1);
end;
procedure LastDisassemblerDataToTable(L: PLua_State; t: integer; const ldd: TLastDisassembleData);
var temptable: integer;
i: integer;
begin
lua_pushstring(L,'address');
lua_pushinteger(L, ldd.address);
lua_settable(L, t);
lua_pushstring(L,'opcode');
lua_pushstring(L, ldd.opcode);
lua_settable(L, t);
lua_pushstring(L,'parameters');
lua_pushstring(L, ldd.parameters);
lua_settable(L, t);
lua_pushstring(L,'description');
lua_pushstring(L, ldd.description);
lua_settable(L, t);
lua_pushstring(L,'commentsoverride');
lua_pushstring(L, ldd.commentsoverride);
lua_settable(L, t);
lua_pushstring(L, 'bytes');
lua_newtable(L);
temptable:=lua_gettop(L);
for i:=0 to length(ldd.Bytes)-1 do
begin
lua_pushinteger(L, i+1);
lua_pushinteger(L, ldd.Bytes[i]);
lua_settable(L, temptable);
end;
lua_settable(L, t);
lua_pushstring(L, 'modrmValueType');
lua_pushinteger(L, integer(ldd.modrmValueType));
lua_settable(L, t);
lua_pushstring(L,'modrmValue');
lua_pushinteger(L, ldd.modrmValue);
lua_settable(L, t);
lua_pushstring(L, 'parameterValueType');
lua_pushinteger(L, integer(ldd.parameterValueType));
lua_settable(L, t);
lua_pushstring(L,'parameterValue');
lua_pushinteger(L, ldd.parameterValue);
lua_settable(L, t);
lua_pushstring(L,'isJump');
lua_pushboolean(L, ldd.isJump);
lua_settable(L, t);
lua_pushstring(L,'isCall');
lua_pushboolean(L, ldd.isCall);
lua_settable(L, t);
lua_pushstring(L,'isRet');
lua_pushboolean(L, ldd.isret);
lua_settable(L, t);
lua_pushstring(L,'isRep');
lua_pushboolean(L, ldd.isrep);
lua_settable(L, t);
lua_pushstring(L,'isConditionalJump');
lua_pushboolean(L, ldd.isConditionalJump);
lua_settable(L, t);
end;
function disassembler_getLastDisassembleData(L: PLua_State): integer; cdecl;
var d: TDisassembler;
t: integer;
i: integer;
begin
result:=1;
d:=luaclass_getClassObject(L);
lua_newtable(L);
t:=lua_gettop(L);
LastDisassemblerDataToTable(L, t, d.LastDisassembleData);
end;
function createDisassembler(L: PLua_State): integer; cdecl;
begin
luaclass_newClass(L, TDisassembler.Create);
result:=1;
end;
function createCR3Disassembler(L: PLua_State): integer; cdecl;
begin
result:=0;
{$ifdef windows}
luaclass_newClass(L, TCR3Disassembler.Create);
result:=1;
{$endif}
end;
function getDefaultDisassembler(L: PLua_State): integer; cdecl;
begin
luaclass_newClass(L, defaultDisassembler);
result:=1;
end;
function getVisibleDisassembler(L: PLua_State): integer; cdecl;
begin
luaclass_newClass(L, visibleDisassembler);
result:=1;
end;
procedure disassembler_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
object_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'disassemble', disassembler_disassemble);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'decodeLastParametersToString', disassembler_decodeLastParametersToString);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getLastDisassembleData', disassembler_getLastDisassembleData);
luaclass_addPropertyToTable(L, metatable, userdata, 'LastDisassembleData', disassembler_getLastDisassembleData, nil);
end;
procedure initializeLuaDisassembler(L: PLua_state);
begin
lua_register(L, 'createDisassembler', createDisassembler);
lua_register(L, 'createCR3Disassembler', createCR3Disassembler);
lua_register(L, 'getDefaultDisassembler', getDefaultDisassembler);
lua_register(L, 'getVisibleDisassembler', getVisibleDisassembler);
end;
initialization
luaclass_register(TDisassembler, disassembler_addMetaData);
end.