The code below finds all caller adresses in a program to a known
procedure/function adress.
With this I can get all caller adresses to the translate function.
Moreover - with another piece of code (not shown here) I got also the text
snippets itself, because they are loaded immediately before executing the
translate function with MOV textsnippetadr , EAX.
procedure i_realy_know_what_i_am_doing( p_opcode : pbyte ; count : longint ;
proc_adr : pointer );
const
call_opcode = $e8;
caller_adr_pc_offset = 5;
var
p_reladress : pdword; // call works with a relative adress after the opcode
x , caller_adress , jmp_adr_abs : dword;
begin
for x := 1 to count do begin
if p_opcode^ = call_opcode then begin
p_reladress := pdword( p_opcode + 1 ); // after
opcode = relative adress to procedure/function to call
caller_adress := dword( p_opcode + caller_adr_pc_offset );
jmp_adr_abs := caller_adress + p_reladress^; // absolute
adress = programcounter + 5 + relative adress
if jmp_adr_abs = dword( proc_adr )
then add_caller_adress_to_table( caller_adress ); // if call
proc_adr then found!
end;
inc( p_opcode );
end;
end;
_______________________________________________
fpc-pascal maillist - [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal