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