More Related Content
Similar to Hook原理简介 new.pptx (7)
Hook原理简介 new.pptx
- 1. C# Inline Hook 简介
Hook功能说的直白一点,就是改变函数的执行流程,在执行某个函数之前将其拦截
并引导到另一个函数中。这种功能既可以实现改变程序逻辑(劫持到其他函数去),
也可以实现对某个函数的监听(劫持完成之后再返回原逻辑)。
对于Unity项目而言,Hook功能一般不用于游戏运行时,而是多用于编辑器环境下。
因为Inline Hook功能涉及到了内存加权,这在iOS平台上是非法操作。
原逻辑 原逻辑
Hook逻辑
- 2. C# Inline Hook 简介
出于工作需要在Unity环境下对函数进
行Hook,使用Inline Hook是最合适的
方法之一。这种Hook的核心思路是替
换目标函数在内存中的JITTED Code,
把原本的头部汇编代码换成一个跳转
代码,从而跳到新函数里。
预制的跳转代码在MethodHook.cs中。
可以看到针对不同架构,准备了多种
不同的代码。
- 4. C# Inline Hook 步骤
对目标函数进行Hook总共有五步。
1. 获取对应函数Jit后的Native Code地址
2. 计算需要替换的指令长度,并
对目标函数区域进行内存加权
3. 备份目标函数的头部
4. 将目标函数的头部替换为跳转逻辑,跳
到我们的函数中
5. 如果还需要调用原函数,在这里进行处理
- 5. C# Inline Hook 简介
获取函数Native Code地址的方法:GetFunctionPointer()
内存加权的方法:kernel32.dll (Windows内核文件,负责内存管理、I/O、中断)
lpAdress:需要修改的内存基址
dwSize:要变更的区域大小
flNewProtect:请求保护方式,这里我们需要PAGE_EXECUTE_READWRITE,可读写可执行
lpflOldProtect:旧的保护方式
- 6. Bytes[ ] _jmpBuff
1. 初始化,拿到三个函数的内存地址,计算需要替换的指令长度,根据CPU架构准
备对应的跳转代码
需要进行Hook的目
标方法
targetFunc
我们自己写的方法
replacementFunc
本身是没用的
主要用于在Hook之
后调用原方法
proxyFunc
跳转代码 目标:
null
Bytes[ ] _proxyBuff