问题1:
挂钩程序自身的MessageBoxA,在自定义的函数中不可以调用原来的MessageBoxA了,只有先保存原函数的地址然后才可以调用。但如果做个dll挂钩其它进程中的MessageBoxA,在自定义的函数中就不需要保存原来的函数地址可以直接调用。不明白这是为什么,请大虾们帮我分析下~问题2:
挂钩某个进程中的MessageBoxA,但无法挂钩AfxMessageBox,必须挂钩所有进程中的MessageBoxA,请详细解释下原因

解决方案 »

  1.   

    AfxMessageBox会在里面调用MessageBoxA,所以挂钩MessageBoxA的同时也要挂钩GetProcAddress,,对其加裁的动态链接库也要进行MessageBoxA这个API的搜索替换
      

  2.   

    问题1: 那个是DLL调用的是自己的IAT里面的MessageBox,改写的是注入进程的IAT,不矛盾
      

  3.   

    AfxMessageBox只是一个库,它的本质还是封装了MessageBoxA以及W
      

  4.   


    这个问题解决了,新的疑惑又来了:
    以下是部分代码
    // 定义MessageBoxA函数原型
    typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT uType);
    // 保存MessageBoxA函数的真实地址
    PROC g_orgProc = (PROC)MessageBoxA;// 用于替换MessageBoxA的自定义函数
    int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
    {
        return ((PFNMESSAGEBOX)g_orgProc)(hWnd, "新函数", "HookDemo", MB_ICONINFORMATION);

    }即使保存过了原函数的地址,调用还是要通过IAT呀,但是IAT已经改变了呀,为什么又可以调用了呢??
      

  5.   

    即使保存过了原函数的地址,调用还是要通过IAT呀,这句话就不对调用是通过地址调用的,不通过IAT。IAT只是一个地址的“容器”罢了就像你查字典,从前翻到后,找到120页,和120页撕下来,就那么一张纸来看,是一样的
      

  6.   


    我要反驳你的观点,照你的说法,那么挂钩程序自身的MessageBoxA,在自定义的函数中应该是直接可以调用原来的函数呀,因为MessageBoxA是函数地址呀(没有通过IAT呀)!!
      

  7.   

    哎。挂钩了自己,直接调用MessageBox,那么查到的就是修改后的地址,它是去IAT里面查的。
    IAT是地址的集合