确定被调用的宿主问题
有过程Sub1、Sub2、Sub3、.....,均要调用另外一个S_Sub。
我的问题是如何在S_Sub中确定是那会函数调用了它?当然可以通过在S_Sub中确定返回地址的方法判断调用宿主,也可以用形参实参传递标志的方法或设公用标志变量,但我不想用这些方法。
各位还有方法吗?
[解决办法]
procedure S_Sub(Sub1: Boolean = False; Sub2: Boolean = False; Sub3: Boolean = False);
begin
if Sub1 then ShowMessage('被Sub1调用!')
...
end;
procedure Sub1;
begin
S_Sub(True)
end;
...
[解决办法]
分析callstack
procedure S_Sub();
begin
try
raise Exception.Create('故意的异常');
except
//这这里查询callstack delphi并未提供看堆栈的功能,但是你到网上找找,有一些牛人写的工具是很好用的
end;
end;
[解决办法]
比如madExcept或
这个
http://www.dimusware.com/products/excmagic/index.html
[解决办法]
如果S_Sub中没用到edi,还可以这样:
- Delphi(Pascal) code
procedure S_Sub;var f: word;begin asm mov f, di end; if f=1 then ShowMessage('被Sub1调用!')end;procedure Sub1;begin asm push di mov di,1 call S_Sub pop di end;end;
[解决办法]
可以用形参实参传递标志的方法或设公用标志变量
我想知道你为什么你不用?
你的目的是什么?
也期待你的其他方法
[解决办法]
- Delphi(Pascal) code
//调用者的方法地址 mov eax, [ebp+$04]
[解决办法]
[解决办法]
[解决办法]
楼主可以参考这里的详细阐述:
http://liyiwen.iteye.com/blog/345525
[解决办法]
狗尾续貂一下。(^_^)
- C/C++ code
#include <stdio.h>void whocallme();void fun1() { whocallme();}void fun2() { whocallme();}void fun3() { fun1();}void whocallme() { int *_esp,i; __asm { mov eax,esp mov _esp,eax } printf("\nfun1,fun2,fun3,_esp=%08x,%08x,%08x,%08x\n",(int)fun1,(int)fun2,(int)fun3,(int)_esp); for (i=0;i<100;i++) if (_esp[i]==(int)_esp) break; if (i<100) { printf("ret addr=%08x\n",_esp[i+2]); if ((int)fun1<=_esp[i+2] && _esp[i+2]<(int)fun2) printf("fun1 callme\n"); if ((int)fun2<=_esp[i+2] && _esp[i+2]<(int)fun3) printf("fun2 callme\n"); }}void main() { fun2(); fun1();}//C:\tmp\tmp\Debug>tmp////fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84//ret addr=0040102e//fun2 callme////fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84//ret addr=0040100e//fun1 callme////C:\tmp\tmp\Debug>cd ..\release////C:\tmp\tmp\Release>tmp////fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c//ret addr=00401012//fun2 callme////fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c//ret addr=00401008//fun1 callme//
[解决办法]
我否定楼上所有的做法,我觉得越简单越好,直接使用一个静态变量,在调用S_Sub之前设置静态变量的值,在S_Sub中判断静态变量的值就知道了。如果不需要并发那这个方法是最佳的。
------解决方案--------------------
[解决办法]
为什么都是些很奇怪的方法呢?程序员的任务不是把问题复杂化而是解决问题,忽然看到居然某个大神用汇编,已经被惊倒了 ---- 会汇编很了不起,今天给你换个其他平台玩玩:修改程序已经是比较糟糕的主意了,不就要看这个函数被那些函数调用了,用得着这么麻烦:
是不是这个效果?我想知道_getdrive被谁调用了。使用现成工具IDA就可以了