现在有两个DLL,分别是1.DLL和2.DLL(都是MFC的),接口函数都只有一个,就是输出一个MessageBox消息框,当然标题和内容是不一样的。现在怎么才能在A.exe中调用1.DLL时,让弹出2.DLL中的消息框。请大虾抽点宝贵的时间,较详细的讲解一下,万分感谢!!

解决方案 »

  1.   

    用detours把?
    勾a.exe进程的MessageBoxA和MessageBoxW,然后调用1.dll的messagebox接口函数
      

  2.   

    您说的 detours 是一个开发包吗?粗略的搜了一下,好像目前还没有2.1专业版。您有没有用它做的类似这样的简单的例子?我还没接触过这个,邮箱[email protected],谢谢
      

  3.   

    不客气已经给你发过去了:)
    可以参考一下sample里的traceapi.cpp
      

  4.   


    应该是调用2.dll的messagebox接口函数~
      

  5.   

    看了一通,有点晕,没看明白,那个detours到底怎么使用啊?能针对我这个实验较详细的说一下吗?实在是看不明白了
      

  6.   

    #include "detours.h"
    这个是要包含的首先- -然后吧,这个函数用来制造一个API的副本以后可以调用,后面的是API,前面的是你的函数
    DETOUR_TRAMPOLINE(int __stdcall Real_AbortDoc(HDC a0),
                      AbortDoc);在dll attach时掉用这个,就把AbortDoc API劫持到Mine_Abort_Doc函数里了
    DetourFunctionWithTrampoline((PBYTE)Real_AbortDoc,
                                     (PBYTE)Mine_AbortDoc);后者的实现:
    int __stdcall Mine_AbortDoc(HDC a0)
    {
        _PrintEnter("AbortDoc(%lx)\n", a0);    int rv = 0;
        __try {
            rv = Real_AbortDoc(a0);
        } __finally {
            _PrintExit("AbortDoc() -> %lx\n", rv);
        };
        return rv;
    }可以看到调用Real_AbortDoc可以实现原API的功能.你要不调用当然就不会实现了- -
      

  7.   

    detours是把要Hook的函数入口的代码复制出来,再把函数入口改为一条跳转指令,跳到自己的函数入口处,当要执行原函数时先执行复制出来的代码,然后再跳转到原函数中被复制出来的代码的后面继续执行。这种方法不能Hook某些特殊函数,与函数的入口代码有关。此外还有其它Hook DLL的方法,你可以在网上搜索一下API HOOK,不过都有缺陷。
      

  8.   

    楼主说的是MessageBox应该是没问题的,貌似对小于5字节的函数不能替换吧,
    另外替换输入表这一HOOK方法有啥缺陷?
      

  9.   

    3.1 改写IAT导入表法   修改可执行文件的IAT表(即输入表)因为在该表中记录了所有调用API的函数地址,则只需将这些地址改为自己函数的地址即可,但是这样有一个局限,因为有的程序会加壳,这样会隐藏真实的IAT表,从而使该方法失效。
      

  10.   


    不止这个缺陷,比如后方代码有 jmp到前5字节的也是不行的
      

  11.   

    大家好像说的都是比较深的理论知识,我是越听越懵了。在网上找了一篇文章,带有一个截获MessageBoxA()系统api的例子,看看先,再次感谢大家的回复!
      

  12.   

    A.exe中调用1.DLL时用管道发消息给2.DLL让其弹出消息框
      

  13.   

    现在的问题是在用detours的时候,编译不通过(只有一个错误),错误信息是:
     detours.lib(disasm.obj):fatal error LINK1103:debugging information corrupt;recompile module error executing link.exe.
    --------------
    查了一下,好像是需要在 vc工程里添加一些路径,我就把detours中的3个路经分别包含进目录中,可还是不行。好像说要编译一下detours,不知道怎么编译。哪位用过detours的大虾给说说?
      

  14.   

    没那么复杂,包含detours.lib输入库就行了你是不是把它放到directory里了?是的话,调整一下顺序,放到最后面
      

  15.   

    不行啊,我在工程-〉设置-〉链接中填了 detours.lib了,在directory里也放了,都放在最后了,还是老样子
      

  16.   

    是在VC6里用么?我在vs2003一切正常,这个问题是lib编译版本和link.exe版本不一致
      

  17.   

    是在vc6.0,用的是你发的那个detours1.5
    回楼上:这个我知道,不会搞错的:)
      

  18.   

    自己把detours的代码全部添加到工程里面。