[fpc-pascal] Get all caller adresses of a given function/procedure before executing
Rainer Stratmann
RainerStratmann at t-online.de
Sat Aug 11 13:40:44 CEST 2012
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;
More information about the fpc-pascal
mailing list