hook api的一点记录

    hook api方法不外乎有修改导入表和修改目标函数代码,让其调整到hook函数处执行。这里仅仅说下后者。‘

    后者主要实现为:通过钩子将代码注入到目标进程(简单点就通过钩子加载dll的方式来hook;复杂点的话就

使用创建远程线程的方式来进行),然后通过修改要注入的目标函数其实几个字节(一般来说是5个字节),替换

为一个无条件跳转指令,让其跳转到目标函数来执行。

    一般来说,我们可以这样:

    假设要截获的原函数

    void srcFn(...)

    {

    }

 

    解惑的目标函数dstFn()。

    我们修改srcFn的前面几个字节,让其执行jmp dstFn执行。

    然后在目标函数中进行我们自己的处理,处理完毕后我们要进行恢复处理。这块需要考虑两种情况:

(1) 目标函数中要执行srcFn的正常恢复

(2) 目标函数不执行srcFn的正常恢复。

    看看detours的图解,很详细很直观。

 

那MessageBoxA来简单介绍下:

 

 

      下面看看我们调用MessageBox(NULL, "xx", "xxx", MB_OK)为啥能正常进行。

在调用此函数的时候,首先会将4个参数压入堆栈,导致sp变小16。执行MessageBox函数时会直接跳转到我们的MyMessageBoxA函数处执行,注意,到MyMessageBoxA函数调用是直接进行指令调整的,没有任何参数压栈操作。

此函数内部会维持堆栈平衡,在最后返回时根据stdcall约定会调整sp,根据参数数量将sp加16。这样整个函数调用不会导致sp值在函数调用的前后出现不一致的情况,一切OK。

     从上面的过程也可以看到,关键是需要我们的Hook函数需要和被Hook的原函数要保持原型一致性,包括函数调用约定和函数参数个数等等...

 

     另外,这种方式是用于简单的HOOkApi,因为在hook后的函数如果需要调用原函数的话,我们需要恢复hook之前的函数代码,然后在调用完毕后又要hook此函数。这样每次调用我们的原函数都需要进行这样的处理,因为存在这样的一个事实:我们不能保证hook后的函数不会调用原函数。如果不这么做的话就可能会出现死循环。detours解决这个问题的办法是引入了一个变迁函数。具体就不在这里废话了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值