function TrueFunctionAddress(func: Pointer): Pointer;
var
Code: PlmportCode;
begin
Result := func;
if func = nil then exit;
try
Code := func;
if (Code.jumplnstruction = $25FF) then
begin
Result := Code.AddressOfPointer_ToFunction^;
end;
except
Result := nil;
end;
end;
procedure doit;
begin
messagebox(0,'执行动作','',mb_ok);
end;
要获得 esi 的字符串,用汇编是可以的,不过不要用 string 类型的变量,用 PChar 类型即可。
从你提供的资料来看,似乎并不是做函数的Hook,而是想在函数执行体(某个DLL的?)内部插入个钩子来取得 esi 寄存器的值。如果是这样的需求,可以用下面的方法:
1、创建一个TCnMethodHook对象Hook掉目标地址。
2、在Hook函数中用,根据需要用汇编先保存寄存器现场,再将 esi 读到 pchar 全局变量。
3、在Hook函数中用UnhookMethod恢复被Hook函数体。
4、恢复寄存器现场,再用绝对跳转指令或者push 地址加 ret 的方法跳回到原地址执行。
5、如果需要多次挂接,在适应的时机重新挂接。