2013-02-13 01:36:58 +00:00
|
|
|
unit LuaDisassembler;
|
|
|
|
|
|
|
|
|
|
{$mode delphi}
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
uses
|
2013-08-13 00:12:15 +00:00
|
|
|
Classes, SysUtils, disassembler, lua, lauxlib, lualib, symbolhandler, LastDisassembleData;
|
2013-02-13 01:36:58 +00:00
|
|
|
|
2021-06-03 12:16:36 +02:00
|
|
|
procedure initializeLuaDisassembler(L: PLua_state);
|
2013-02-13 01:36:58 +00:00
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
procedure LastDisassemblerDataToTable(L: PLua_State; t: integer; const ldd: TLastDisassembleData);
|
|
|
|
|
procedure LastDisassemblerDataFromTable(L: PLua_State; t: integer; var ldd: TLastDisassembleData);
|
|
|
|
|
|
2013-02-13 01:36:58 +00:00
|
|
|
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;
|
|
|
|
|
|
2013-02-13 10:08:33 +00:00
|
|
|
function disassembler_decodeLastParametersToString(L: PLua_State): integer; cdecl;
|
|
|
|
|
var d: TDisassembler;
|
|
|
|
|
begin
|
|
|
|
|
d:=luaclass_getClassObject(L);
|
|
|
|
|
lua_pushstring(L, d.DecodeLastParametersToString);
|
|
|
|
|
result:=1;
|
|
|
|
|
end;
|
|
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
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);
|
|
|
|
|
|
2018-04-15 09:00:46 +02:00
|
|
|
lua_pushstring(L,'commentsoverride');
|
|
|
|
|
lua_gettable(L, t);
|
|
|
|
|
ldd.commentsoverride:=Lua_ToString(L, -1);
|
|
|
|
|
lua_pop(L, 1);
|
|
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
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);
|
2013-02-13 01:36:58 +00:00
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
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;
|
2013-02-13 01:36:58 +00:00
|
|
|
i: integer;
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'address');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushinteger(L, ldd.address);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'opcode');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushstring(L, ldd.opcode);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'parameters');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushstring(L, ldd.parameters);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'description');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushstring(L, ldd.description);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
2018-04-15 09:00:46 +02:00
|
|
|
lua_pushstring(L,'commentsoverride');
|
|
|
|
|
lua_pushstring(L, ldd.commentsoverride);
|
|
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_pushstring(L, 'bytes');
|
|
|
|
|
lua_newtable(L);
|
|
|
|
|
temptable:=lua_gettop(L);
|
2013-03-22 22:22:49 +00:00
|
|
|
for i:=0 to length(ldd.Bytes)-1 do
|
2013-02-13 01:36:58 +00:00
|
|
|
begin
|
|
|
|
|
lua_pushinteger(L, i+1);
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushinteger(L, ldd.Bytes[i]);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, temptable);
|
|
|
|
|
end;
|
|
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L, 'modrmValueType');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushinteger(L, integer(ldd.modrmValueType));
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'modrmValue');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushinteger(L, ldd.modrmValue);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L, 'parameterValueType');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushinteger(L, integer(ldd.parameterValueType));
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'parameterValue');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushinteger(L, ldd.parameterValue);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'isJump');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushboolean(L, ldd.isJump);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'isCall');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushboolean(L, ldd.isCall);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
|
|
|
|
lua_pushstring(L,'isRet');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushboolean(L, ldd.isret);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
2021-12-07 23:17:28 +01:00
|
|
|
lua_pushstring(L,'isRep');
|
|
|
|
|
lua_pushboolean(L, ldd.isrep);
|
|
|
|
|
lua_settable(L, t);
|
|
|
|
|
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_pushstring(L,'isConditionalJump');
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_pushboolean(L, ldd.isConditionalJump);
|
2013-02-13 01:36:58 +00:00
|
|
|
lua_settable(L, t);
|
2013-03-22 22:22:49 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function disassembler_getLastDisassembleData(L: PLua_State): integer; cdecl;
|
|
|
|
|
var d: TDisassembler;
|
|
|
|
|
t: integer;
|
2013-02-13 01:36:58 +00:00
|
|
|
|
|
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
i: integer;
|
|
|
|
|
begin
|
|
|
|
|
result:=1;
|
|
|
|
|
d:=luaclass_getClassObject(L);
|
2013-02-13 01:36:58 +00:00
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
lua_newtable(L);
|
|
|
|
|
t:=lua_gettop(L);
|
|
|
|
|
LastDisassemblerDataToTable(L, t, d.LastDisassembleData);
|
2013-02-13 01:36:58 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function createDisassembler(L: PLua_State): integer; cdecl;
|
|
|
|
|
begin
|
|
|
|
|
luaclass_newClass(L, TDisassembler.Create);
|
|
|
|
|
result:=1;
|
|
|
|
|
end;
|
|
|
|
|
|
2018-03-28 21:18:37 +02:00
|
|
|
function createCR3Disassembler(L: PLua_State): integer; cdecl;
|
|
|
|
|
begin
|
2019-12-18 12:07:17 +01:00
|
|
|
result:=0;
|
|
|
|
|
{$ifdef windows}
|
2018-03-28 21:18:37 +02:00
|
|
|
luaclass_newClass(L, TCR3Disassembler.Create);
|
|
|
|
|
result:=1;
|
2019-12-18 12:07:17 +01:00
|
|
|
{$endif}
|
2018-03-28 21:18:37 +02:00
|
|
|
end;
|
|
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
2013-02-13 01:36:58 +00:00
|
|
|
procedure disassembler_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
|
|
|
|
|
begin
|
|
|
|
|
object_addMetaData(L, metatable, userdata);
|
|
|
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'disassemble', disassembler_disassemble);
|
2013-02-13 10:08:33 +00:00
|
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'decodeLastParametersToString', disassembler_decodeLastParametersToString);
|
2013-02-24 23:49:26 +00:00
|
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getLastDisassembleData', disassembler_getLastDisassembleData);
|
2013-02-13 01:36:58 +00:00
|
|
|
luaclass_addPropertyToTable(L, metatable, userdata, 'LastDisassembleData', disassembler_getLastDisassembleData, nil);
|
|
|
|
|
|
|
|
|
|
end;
|
|
|
|
|
|
2013-03-22 22:22:49 +00:00
|
|
|
|
2021-06-03 12:16:36 +02:00
|
|
|
procedure initializeLuaDisassembler(L: PLua_state);
|
2013-02-13 01:36:58 +00:00
|
|
|
begin
|
2021-06-03 12:16:36 +02:00
|
|
|
lua_register(L, 'createDisassembler', createDisassembler);
|
|
|
|
|
lua_register(L, 'createCR3Disassembler', createCR3Disassembler);
|
2018-03-28 21:18:37 +02:00
|
|
|
|
2021-06-03 12:16:36 +02:00
|
|
|
lua_register(L, 'getDefaultDisassembler', getDefaultDisassembler);
|
|
|
|
|
lua_register(L, 'getVisibleDisassembler', getVisibleDisassembler);
|
2013-02-13 01:36:58 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
initialization
|
|
|
|
|
luaclass_register(TDisassembler, disassembler_addMetaData);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end.
|
|
|
|
|
|
|
|
|
|
|