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

More Related Content

Similar to Hook原理简介 new.pptx

Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
Wade Huang
 
异步和队列分享
异步和队列分享异步和队列分享
异步和队列分享
Tony Deng
 

Similar to Hook原理简介 new.pptx (7)

Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
大话Php之性能
大话Php之性能大话Php之性能
大话Php之性能
 
iOS Hotfix
iOS HotfixiOS Hotfix
iOS Hotfix
 
Cocoa on Rails 4th
Cocoa on Rails 4thCocoa on Rails 4th
Cocoa on Rails 4th
 
製作 Unity Plugin for iOS
製作 Unity Plugin for iOS製作 Unity Plugin for iOS
製作 Unity Plugin for iOS
 
异步和队列分享
异步和队列分享异步和队列分享
异步和队列分享
 
Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)
 

Hook原理简介 new.pptx