游戏安全实验室 首页 技术入门 查看内容

 阅读目录

Android平台inline hook实现

发布于:2016-5-4 17:07   |    241549次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

Inline Hook在之前文章有较多概念性描述,本文则侧重介绍如何去实现一个Inline Hook并且关注一些实现过程中会遇到的困难挑战。

1.1 实现原理

HOOK什么,通过前面几章的介绍,相信读者都有个比较具体的了解。通俗点理解,就是拦截指定函数或者具体函数某条汇编指令的功能。注入GOT HOOK之类的方法,只能针对函数头进行HOOK。如果需要针对函数的特定位置进行HOOK,那么Inline Hook则可以派上用场。

Inline Hook直接修改要HOOK位置的指令,让跳转到桩函数中。在桩函数中,会处理寄存器信息并调用相应HOOK点用户自定义桩函数。在处理完用户自定义的桩函数后,则会跳转执行原指令。

图1. Inline Hook原理

如图1所示,Inline Hook的核心原理。这里说明一下几个关键点

(1) 跳转指令的构建、原指令跳转过去的底层桩函数,涉及系统汇编层,和Inline Hook的平台关系较大,既是ARM和THUMB、X86等均有所不同;64位32位也有所不同。本文实现以32ARM为样例实现。

(2) 底层桩函数跳转回原函数,既原理图中第3步跳转,去执行原指令2的时候,有个关键的点如果指令2涉及PC操作则需要进行指令修复。比如说是ADD R3, PC, R3, 两处指令的PC完全不一样,肯定不能直接复制,需要针对修复相应PC值。本文为了方便读者入门,没有针对指令进行修复操作,既是有个限制:HOOK点位置,原指令2不能有涉及到PC的操作。如果读者