API挂接具体的操作方法:1)找到你想挂接的函数在内存中的地址(比如说Kernel32.dll中的ExitProcess)。2)将该函数的头几个字节保存在你自己的内存中。3)用一个JUMPCPU指令改写该函数的头几个字节,该指令会转移到你的替换函数的内存地址。当然,你的替换函数的标记必须与你挂接的函数的标记完全相同,即所有的参数必须一样,返回值必须一样,调用规则必须一样。4)现在,当一个线程调用已经挂接的函数时,JUMP指令实际上将转移到你的替换函数。这时,你就能够执行任何代码。5)取消函数的挂接状态,方法是取出(第二步)保存的字节,将它们放回挂接函数的开头。6)调用挂接的函数(它已不再被挂接),该函数将执行其通常的处理操作。7)当原始函数返回时,再次执行第二和第三步,这样你的替换函数就可以被调用。在执行到第4步后,进入第5步时,为什么要"5)取消函数的挂接状态,方法是取出(第二步)保存的字节,将它们放回挂接函数的开头"???第1-2步已经将原始函数地址保存起来,这时可以用来调用啊,为什么要5.6.7步???

解决方案 »

  1.   

    没看过汇编和机器码的人就不明白了我给你简单讲一下吧因为这样保证了兼容性机器码不是定长的你修改头上5个字节有可能出现这样的情况比如移出的aaa
    bbb
    ccc
    你移动了以后截断了他的代码
    变成
    jmp 你的地址
    b(前5个字节给你改掉了)
    ccc
    这就造成了这个api的代码分成了两段
    在外面的是
    aaa
    bb
    而他不能运行
    因此如果你还想运行这个api
    你就必须把代码恢复回来才能执行当然其实你完全可以不管api直接给被你hook的程序返回你想要的值比如你hook住了某个api函数,你只想返回1,
    那你就不用恢复原函数,只要
    mov eax,1
    ret
    这样就ok了
      

  2.   

    没看过汇编和机器码的人就不明白了我给你简单讲一下吧因为这样保证了兼容性机器码不是定长的你修改头上5个字节有可能出现这样的情况比如移出的aaa
    bbb
    ccc
    你移动了以后截断了他的代码
    变成
    jmp 你的地址
    b(前5个字节给你改掉了)
    ccc
    这就造成了这个api的代码分成了两段
    在外面的是
    aaa
    bb
    而他不能运行
    因此如果你还想运行这个api
    你就必须把代码恢复回来才能执行当然其实你完全可以不管api直接给被你hook的程序返回你想要的值比如你hook住了某个api函数,你只想返回1,
    那你就不用恢复原函数,只要
    mov eax,1
    ret
    这样就ok了
      

  3.   

    请问大哥,如何查看某api函数的入口函数的长度,如果5字节不够,长些行不?我想hook messageboxa和messageboxw,不知要多长?
      

  4.   

    你还是没明白我不是说入口函数5字节不够事实上如果用核心编程里介绍的办法几乎hook所有的函数都不会有问题因为他有恢复这个函数这一步的而跳转函数呢,只要统一的5字节就可以了因为32位系统里,eax长度是4个字节,而jmp一个字节所以一起加起来5个字节就ok了
      

  5.   

    基本不会漏事实上windows是一个抢占多任务系统并不太会出现你把代码写回去的时候刚好他调用了代码如果你是说因为你挂钩的速度来不及拦住你想拦截的api请使用createprocess 暂停启动线程然后插入dll来,这样的话保证不会漏钩
      

  6.   

    我之所以会觉得可能漏掉,是因为messagebox显示一对话框,必需要按yes  or  no才能进入下一步,有点担心漏,你这么一说,看来漏是不可能了
      

  7.   

    这样不会漏的因为调用是你的钩子函数调用的返回到你函数里只要你的函数把处理的结果返回给被钩住的程序就ok了不过你记得要return messagebox的返回值