首先说明一下,我学过1年的C++。不过最近没有怎么用它了。我根本不懂DLL注入的做法。现在我做一个基于别人的库的系统,他的SDK的头文件,有一个方法的定义是:extern "C" HRESULT __stdcall QueryMember(LPCWSTR name,REFIID riid,LPVOID FAR *ppv)我现在希望程序能做一些通用的效果。所以希望修改上面方法的调用。所以我想到了 DLL注入 技术。到这里来求救。我根本不知道 QueryMember 是放在哪个 DLL 里的。
(不要问我为什么不知道,总之就是不知道,重点不在这里)我希望我的代码启动后,(那时QueryMember肯定已经装入了的)执行一段实现 DLL注入 的代码,实现了下面的功能:1。找出进程里已经加载的 DLL
2。循环这些 DLL , 找出包含这个 QueryMember 的 DLL
3。把 QueryMember 切换为我自己的 MyQueryMember就这样就足够了。关于注入后如何卸载MyQueryMember不需要考虑。。希望得到你的支持!谢谢。顺便问问 extern "C" 是干什么的?

解决方案 »

  1.   

    哎,,我头脑有点涨了。。我不知道QueryMember在那个DLL的原因,是因为它根本就是内部的实现而已。。这应该没有办法了吧。。
      

  2.   

    API Hook咯~
    修改导入地址表~把对 QueryMember 的调用全部改成自己的 MyQueryMember~嘿嘿~extern "C" 是在C++中使用C编译方式~
      

  3.   

    API Hook要知道在哪个DLL中哦
      

  4.   

    你需要的技术在<<Windows核心编程>>中应该有,就在Dll的高级应用那一章extern "C" 是为了保持函数的名字不被C++编译器改动(为了实现重载)
      

  5.   

    谢谢斑竹。。
    我现在还不完全确定能不能取到它的地址。
    不过有个engine.idl里有:#pragma midl_echo("CHSTDCALL QueryMember(LPCWSTR name, REFIID riid, void **ppv);")是什么意思?为什么要做这一句?是不是有希望?注:CHSTDCALL 就是 extern "C" HRESULT __stdcall
      

  6.   

    谢谢  icr_mio(玄猫) . 我不是长期做C++开发的,不想钻研。现在没有<<Windows核心编程>>。我想我上面的问题不容易,但是做起来也可能就几行代码而已。知道的话就一下子搞定了。我在某个.def文件里找到了EXPORTS
          QueryMember这应该说明它是 dll 输出吗 ? 为什么没有指定 __declspec(dllexport) 的?因为没有*.cpp,我不知道它是在哪里调用的~~~我现在先重新查查它在那个 dll 中吧。
      

  7.   

    5555,
    我在一个dll里找到它了。
    (用记事本打开dll,然后找出来的。我现在手头连象样的工具都没有555)下一步该怎么办?谁帮帮我?帖个简单的例子也好。帮我UP也行。我满3回复了。
      

  8.   

    简单的API Hook的例子可以搜到~能找到DLL就可以了~
      

  9.   

    to:rivershan(笨猫)(深入浅出DLL与Hook) 谢谢。我自己会去找的。现在有没有现成的代码?例如:bool ReplaceMethodEntryPoint(LPCWSTR srcdll,LPCWSTR srcname,LPCWSTR dstdll,LPCWSTR dstname);
    或者是
    bool ReplaceMethodEntryPoint(LPCWSTR srcdll,LPCWSTR srcname,void* pDstMethod);
      

  10.   

    给你篇文档
    其中讲解的很详细
    http://www.xfocus.net/articles/200304/xfocus_conference_doc.zip
      

  11.   

    我找到的代码里:
    BYTE OldMessageBoxCode[5],NewMessageBoxCode[5];    _asm
        {
            lea edi,OldMessageBoxCode
            mov esi,pfMessageBox
            cld
            movsd
            movsb
        }
        NewMessageBoxCode[0]=0xe9;//jmp MyMessageBox的相对地址的指令
        _asm
        {
            lea eax,MyMessageBox
            mov ebx,pfMessageBox
            sub eax,ebx
            sub eax,5
            mov dword ptr [NewMessageBoxCode+1],eax
        }为什么里面是 5 ? 这个 5 是不是和参数数量相关?
      

  12.   

    到现在为止还没有成功啊~~~555我要拦截的API是 __stdcall 的。。这是不是有影响。
      

  13.   

    SetWindowsLongPtr,用这个函数来设置API钩子~你需要跑一个远程线程,然后在这个线程里面用LoadLibrary和GetProcAddress找到QueryMember的函数地址。
    用LoadLibrary线程注入一个dll,里面包含着替换的函数,用SetWindowsLongPtr把QueryMember的地址转向到新的函数入口,就可以了。
    WINAPI类型的API并没有什么关系,另外,你想要实现的功能,真的不是几行代码能搞定的。
      

  14.   

    给你介绍个工具
    http://www.freewebs.com/cgsoftlabs/zip/Stud_PE1.8.zip
    可以很容易的知道任意一个进程加载的所有dll我认为你的问题没有必要使用dll注入
      

  15.   

    这个要用到注入吗?!用depents 看在哪个DLL中写一个有一样导出的DLL,把原来的DLL更名,你写的DLL命名为原来的在你的DLL里处理请求,或将请求交给原来的DLL