被HOOK的函数位于名为A的DLL中,实现HOOK功能的函数位于名为B的DLL中
有如下问题:
1.进程启动的时候,是用的LoadLibrary函数加载的DLL吗?
2.是不是A先加载,B后加载,才能HOOK成功?
3,当进程要加载A的时候,怎样让它实际上加载的是我们的DLL,B或者其他DLL。
4,Detours是通过修改函数在内存中的映像的前几个字节实现API HOOK的吧,它是怎样在内存中找到目标函数的?
5,为什么发表完帖子后,不能修改呀?

解决方案 »

  1.   

    1.进程启动的时候,是用的LoadLibrary函数加载的DLL吗?
    是。2.是不是A先加载,B后加载,才能HOOK成功?
    如果B先加载,可以由B来加载A,然后Hook。3,当进程要加载A的时候,怎样让它实际上加载的是我们的DLL,B或者其他DLL。
    把A文件用想要被加载的文件替换掉。4,Detours是通过修改函数在内存中的映像的前几个字节实现API HOOK的吧,它是怎样在内存中找到目标函数的?
    对。用GetProcAddress得到目标函数的入口地址,也可以隐式链接目标DLL,直接使用要Hook的函数名就表示函数入口地址。5,为什么发表完帖子后,不能修改呀?
    因为只有管理员和斑竹才有修改帖子的权利。
      

  2.   

    谢谢,解答的很好。还有些不解
    3,A是我想HOOK的对象,我想实现的就是,当进程加载A的时候,实际加载的是B,然后我在B中加载A,然后HOOK A,如何实现?
    4,GetProAddress第一个参数是模块DLL的名字,对于第三方的DLL模块,它是如何得到这个DLL的名字的,不会是用LoadLibrary吧?
      

  3.   

    3、把A改名或者移动到其它路径,把B改成A的名字放在A的原路径下。
    4、第1参数是模块句柄(地址),不是名字。如果有目标DLL的lib文件,用隐式链接直接使用函数名称是最方便的了。如果没有lib,可以用LoadLibrary来得到模块句柄。此外,如果目标DLL在Hook前已加载,也可以用GetModuleHandle来获得模块句柄。
      

  4.   

    3,当进程要加载A的时候,怎样让它实际上加载的是我们的DLL,B或者其他DLL。 可以HOOK LoadLibrary用B替换A
      

  5.   

    3. 系统搜索DLL的顺序如下:
    被装载程序包的执行目录。
    当前目录。如果与执行目录不同的话。
    Windows系统目录
    Windows目录。
    Path中的目录。 
    因此只要把A放到后面的路径中,把B改成A的名字放在前面的路径中,就可以了
      

  6.   

    2,如果只知道A的名称,而不知道它的路径呢?
    有没有像IFEO映像劫持那样的方法,只需要知道A的名称,而不必知道路径,就可以替换的方法?
      

  7.   

    你可以取path环境变量,根据环境变量中的路径来查找。如果嫌麻烦,也可以LoadLibrary、GetModuleFileNameEx来得到。