首页
社区
课程
招聘
[原创]inline hook 入门教程
发表于: 2014-12-12 23:28 15170

[原创]inline hook 入门教程

2014-12-12 23:28
15170

一、 什么是 inline hook

inline hook 就是在运行的流程中插入跳转指令(call/jmp)来抢夺程序运行流程的一个方法。

好了那么问题就来了:

1. 插入怎么样的跳转指令
    一般为 相对JMP(0xE9) + 4字节地址,方便计算 
        公式:源地址 + 相对偏移 = 目的地址
        公式:目的地址 - 源地址 = 相对偏移

2. 被跳转指令覆盖的原始指令应该被保存起来,找适当的时机再执行

3. 需要对应的 jmpIn 和 jmpOut 跳转。

4. inline hook 的一般流程:
    源程序流 -> jmpIn -> 保存寄存器 -> 具体处理 -> 恢复寄存器 -> jmpOut -> 源程序流
        被跳转指令覆盖的代码可以在 jmpIn之后 或者 jmpOut之前

二、 被 inline hook 的位置

1. 指令或者指令之和大于等于5,因为我们要塞进去5个字节(0xE9 + Address)。只要你处理跳转指令覆盖的指令,理论上可以 inline hook 函数中的任意位置。

2. 判断被 inline hook 位置的指令可以使用反汇编引擎判断指令长度。

3. 很多系统调用的开头都是,能很方便的 inline hook

    mov    edi, edi
    push    ebp
    mov    ebp, esp

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 4
支持
分享
最新回复 (5)
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
2
vc编译器可以使用/hotpatch和/functionpadmin选项生成带热补丁的函数头,即5个nop(x86)在函数入口前,一个mov edi,edi在入口处~
2014-12-13 00:16
0
雪    币: 8201
活跃值: (2706)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
受教育了,继续学习呀
2014-12-13 08:10
0
雪    币: 2
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢, 请教一个问题. 如果hook的地址开头是 eb xx, 而这个跳转偏移5个字节, 但是我hook了7个字节, 这时应该是有两个备份吗, 一个原始的字节, 一个将eb xx 改成 e9 后的数据. 当跳回原本的入口点时用 e9这个, 还原时用原始的. 可对?

0x00100000:     //备份的布局
//4 bytes hook的字节大小n
//n bytes hook的目标的原始字节  这里如果eb 就改 e9
//5 bytes jmp (原本入口点+ n)
//hook的目标的原始字节

test:
   jmp   myHook
   ...

void __stdcall* myHook()
{

   __asm
   {
     leave;
     jmp  (0x00100000 + 4)
   }
}
2014-12-13 08:29
0
雪    币: 0
活跃值: (756)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我研究研究
2014-12-13 09:08
0
雪    币: 0
活跃值: (756)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
不要用 jmpIn 去覆盖 源程序流的相对跳转指令。。那样很难处理

比如你 jmpIn 覆盖了两条指令,第一条是 4字节,第二条是3字节。你就移动 7 字节的数据。5字节的 jmpIn 会剩余两字节。。
2014-12-13 09:16
0
游客
登录 | 注册 方可回帖
返回
//