[Hook,汇编求助]如何由被调用的函数指针 得出 所调用函数的地址? ( 积分: 300 )

  • 主题发起人 主题发起人 jeffrey_s
  • 开始时间 开始时间
J

jeffrey_s

Unregistered / Unconfirmed
GUEST, unregistred user!
//类似于:
type
MyProc = procedure
//定义函数指针
var
Proc1: MyProc
//变量1; 假设@地址为 $00451210
Proc2: MyProc
//变量2; 假设@地址为 $00451214

implementation // 下面的CallProc不会直接调用,只通过Proc1,Proc2调用

procedure CallProc;
begin
//Todo: 这里如何写才可以得出地址 或者 区分出不同的调用?
end;

initialization
Proc1 := CallProc;
Proc2 := CallProc;

需要调用Proc1 和 Proc2 时会有不同的结果。
使用传统的方法是不能够实现的,基本上要靠汇编来实现。希望有能力的帮忙一下。
 
意思不明确。
 
就是在 Todo 部分如何写代码实现?
当使用 Proc1 时能 ShowMessage Proc1的地址 $00451210
而使用 Proc2 时能 ShowMessage Proc2的地址 $00451214
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
MyProc = procedure
//定义函数指针

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
var
Proc1: MyProc
//变量1; 假设@地址为 $00451210
Proc2: MyProc
//变量2; 假设@地址为 $00451214

implementation

{$R *.dfm}
procedure CallProc;
var
tmpaddr : dword;
begin
asm
mov tmpaddr,ebp
add tmpaddr,4
end;
tmpaddr := pdword(pdword(tmpaddr)^-4)^;
if tmpaddr=dword(@@Proc1) then showmessage('Proc1');
if tmpaddr=dword(@@Proc2) then showmessage('Proc2');
//Todo: 这里如何写才可以得出地址 或者 区分出不同的调用?
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Proc1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Proc2;
end;

initialization
Proc1 := CallProc;
Proc2 := CallProc;
end.
 
要显示地址
if tmpaddr=dword(@@Proc1) then showmessage('Proc1');
if tmpaddr=dword(@@Proc2) then showmessage('Proc2');
这里换一下
if tmpaddr=dword(@@Proc1) then showmessage(inttohex(dword(@@Proc1),8));
if tmpaddr=dword(@@Proc2) then showmessage(inttohex(dword(@@Proc2),8));
 
虽然回答简单,不过基本上能达到要求了。
 
还在不?
tmpaddr := pdword(pdword(tmpaddr)^-4)^;
这句中 -4 的意义是??

我试过使用另外的方式就不能够显示出来
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
MyProc = procedure
//定义函数指针

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
var
Index: Integer;
Proc1: array[0..1] of MyProc;

implementation

{$R *.dfm}
procedure CallProc;
var
tmpaddr : dword;
begin
asm
mov tmpaddr,ebp
add tmpaddr,4
end;
tmpaddr := pdword(pdword(tmpaddr)^-4)^;
if tmpaddr=dword(@@Proc1[0]) then showmessage('Proc1');
if tmpaddr=dword(@@Proc1[1]) then showmessage('Proc2');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Index := 0;
Proc1[Index];
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Index := 1;
Proc1[Index];
end;

initialization
Proc1[0] := CallProc;
Proc1[1] := CallProc;
end.
 
不明白.学习学习....
 
后退
顶部