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

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

jeffrey_s

Unregistered / Unconfirmed
GUEST, unregistred user!
前一个帖子是: http://www.delphibbs.com/delphibbs/dispq.asp?lid=3815761
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;
begin
// 这里如何写 才能得出所调用的指针 也就是 @@Proc1[0] 或 @@Proc1[1]
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.
 
没看明白...
 
恩.呢......
 
Proc1[0] 和 Proc[1] 都是调用 CallProc的, 但问题是 CallProc 是没有参数的,正常的情况运行的结果是一样的。

但问题是我希望 由不同的调用,同一个CallProc方法,也就是Proc1[0] 和 Proc1[1] 的两个方法去调用,CallProc能够分辨出是哪个调用, 基本上只能靠用汇编实现。

在CallProc里Showmessage, Show出@@Proc1[0]或@@Proc1[1]的地址就可以达到要求了。
 
在CallProc里面获得调用CallProc返回后的下一条指令IP没有任何问题,但是
如果想获取其它信息,只能针对特定的代码来实现,以你的代码为例,
procedure CallProc;
var
p: DWORD;
begin
asm
// 这里如何写 才能得出所调用的指针 也就是 @@Proc1[0] 或 @@Proc1[1]
push eax
mov eax, [ebp+4]
mov p, eax
pop eax
end;

//显示的是调用返回后的下一条指令地址
ShowMessage(Format('Index=%d, Next Addr=%0.8X', [index,p]));
end;

这里面偷懒了,直接读取Index值,实际上,通过返回地址值,分析之前指令
也可以获取调用时的值,或者直接用assembler,在CallProc里读取EAX也可以

procedure ShowAddr(i, p: dword)
register;
begin
ShowMessage(Format('Index=%d, Next Addr=%0.8X', [i,p]));
end;

procedure CallProc
assembler;
asm
// 这里如何写 才能得出所调用的指针 也就是 @@Proc1[0] 或 @@Proc1[1]
push edx
mov edx, [ebp+4]
call showAddr;
pop edx
end;
 
我不是要取 下一条指令地址
很明显,当Index一样时, Show出来的结果应该是一样的,而指令地址却不一样。。
所以还不是符合我的要求。。
 
1、知道返回的下一条指令地址可以获得调用地址,计算一下就行了
2、Index一样,Show的结果未必一样,因为你调用的地址不同,当然它返回
的下一条指令地址也不一样
3、多说一句,不知道你要获取调用者地址的目的是什么,同样的目的或许有
不同的思路。类似的用法一般都是为了定位某些指令或者数据,通常针对
于特定的代码。
 
目的就是求出 Index,意图就是Hook

在Proc1: array[0..n] of MyProc 中
[0]是nil, 其他的都不是。 找出地址后,我回溯nil就可以求出 Index的值
 
直接就知道Index值,干吗还要费二遍事?
 
后退
顶部