在一个进程中有两个DLL(不妨叫DllA 和 DllB),如何在DllA中判断DllB 是否调用了DllA中的函数?请高手指教!

解决方案 »

  1.   

    1。反汇编
    2。函数地址查询(VirtualQueryInfo)
    3。验证函数是否在某个dll模块中, 通常模块句柄,是加载进入进程的基址。
      

  2.   

    ULONG addr;        _asm mov eax, [ebp+4]
            _asm mov addr, eaxaddr就是调用者的地址,
    用VirtualQueryInfo配合GetModuleFileName就能取到模块名.上面的代码只要加到DLLA的函数中.
      

  3.   

    用VirtualQueryInfo配合GetModuleFileName就能取到模块名
    ====================================================
    能不能说得清楚点,我是菜鸟.谢谢:)
      

  4.   

    KeSummer的意思是从Frame Pointer(ebp)上找到Caller的返回地址,假设你的函数是直接被另外 DLL 叫到,这个返回地址肯定是那个 DLL代码段的地址,通过VirtualQueryInfo(Ex)可以找到这个 DLL 的基础地址 (自己去查查MSDN,第一个参数传人GetCurrentProcess()),然后把这个基础地址传给GetModuleFileName。注意这个方法不一定保险。Compiler很多时候在Release Build的时候会做优化(Frame Pointer Optimization),如果这样 ebp里面不会有返回地址,这个方法就不灵了。
      

  5.   

    使用__declspec(naked)定义函数,函数入口处直接使用[esp]为调用者的返回地址.
    只要调用的时候不这样:
    push xxx 
    ret
    当然__declspec(naked)定义时,写函数很麻烦
      

  6.   

    不知道你是不是一定要在程序中察看,如果不是的话我觉得可以用dependency walker啊,不是很简单吗?
      

  7.   

    完全同意KeSummer只要使用Call 的都可以用是KeSummer