专栏首页difcareer的技术笔记Android平台inline hook实现[转载]

Android平台inline hook实现[转载]

转自游戏安全实验室

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的操作。如果读者后续对指令修复有兴趣,可能自行实现,本文的代码框架能很好支持这个扩展。

(3) Inline Hook的指令覆盖顺序,原指令2的覆盖建议留在最后实现。既是完成了底层桩函数构造、原函数构造后,再一次性填写跳转指令覆盖原指令2。这样的好处是防止HOOK一些频繁执行的函数可能导致的崩溃。在Inline Hook的过程中走入了HOOK逻辑,而桩函数或者原函数可能未构造成功导致崩溃。

大概的原理知道后,下面给出一个实现的流程图,如图2。通过该流程图,读者可以快速了解到Inline Hook的实现框架流程主要是这么3个:构造stub、构造原函数、覆盖原指令。图3示意了样例要HOOK的IBored中的一条函数指令,对应图4则示意了Inline Hook实现之后的底层汇编指令结构。

1.2 实现流程

图2. InlineHook实现流程图

图3. HOOK位置的指令

图4. Inline Hook实现后的逻辑

1.3 实现代码

按照实现流程图,这里按照流程讲解下4个流程代码。

首先是备份hook点的信息,如下代码所示,主要是原指令的备份

接着是构造stub。底层stub采用了汇编编写,整片代码在ihookstub.s中。如下代码所示,主要是malloc一块内容用于填充shellcode,同时针对用户自定义的_hookstub_function_addr_s函数地址进行修改填充。备份相应代码地址到INLINE_HOOK_INFO中。(代码为了粘贴美观,去掉相应注释,在实际代码文件里面,会有相应注释片段。)

然后是构建原来的指令块,这里也需要malloc一块空间来填充指令。前8个bytes则是原指令直接填充。本文一开始提到的指令修复,如果需要则是在这个位置进行扩展。后8个bytes用于填充跳转指令,跳转地址则是HOOK地址+8。通过BuildArmJumpCode函数构建简单的指令跳转函数,

LDR PC, [PC, #-4]

Addr

该跳转指令范围是32位,不过对于32位系统来说,则是全地址跳转。构造原指令的同时,将原指令地址,填充到stub中使之可实现示意图中的第3步跳转。

最后则是Inline Hook的最后一步,重构HOOK位置的指令,直接填充一个跳转指令。该跳转指令是跳转到BuildStub构建的stub中。

1.4 小结

本文介绍了Inline Hook的原理,并通过流程图和代码直观地描述和说明Inline Hook的执行过程,配合IBored校验代码的正确性和应用场景的举例。本篇幅重点是让读者了解到Inline Hook的思想和原理,针对THUMB、X86等平台上的Inline Hook扩展,有兴趣的读者基于本篇幅的了解去实现相信难度不会太大。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android Inline Hook 详解前言原理分析

    网上有几篇关于Android inline hook的文章,这篇尤其不错,还有对应的示例代码。为了方便调试看结果,我将其改为gradle工程,代码见这里。你需要...

    用户2930595
  • Android平台导入表Hook方式实现[转载]

    本文会介绍Android平台下导入表Hook的实现过程,导入表(.Got表)的Hook实现有很多种方法,本文会选取其中的一种思路用代码的方式实现过程。

    用户2930595
  • Android平台基于异常的Hook实现[转载]

    Android下面有很多Hook的思路,如果要获取执行到某地址的寄存器信息或者某地址的访问者信息,那么异常Hook将会是一个较优的手段,本章节会介绍Androi...

    用户2930595
  • 流水线、超流水线、超标量(superscalar)技术对比(转)

    流水线技术是一种将每条指令分解为多步,并让各步操作重叠,从而实现几条指令并行处理的技术。程序中的指令仍是一条条顺序执行,但可以预先取若干条指令,并在当前指令尚未...

    zy010101
  • Linux-Bash指令

    悠扬前奏
  • 流水线、超流水线、超标量(superscalar)技术对比

    本文转载自:https://blog.csdn.net/qq_32092885/article/details/83349275

    zy010101
  • Angular2 中的指令

    组件:一种带有模板的指令;使用component来装饰组件类 属性指令:改变元素的外观或行为,如NgClass,NgStyle;使用Directive来装饰指...

    用户1437675
  • 指令相关

    相关是影响乱序调度的罪魁祸首,如果指令2的执行需要依赖指令1的结果,我们就 说这两条指令是相关的,指令2必须在指令1后面执行,无法乱序。 下图描述了指令间的...

    233333
  • Java内存模型与指令重排

    用户1216491
  • 小程序中引入外部字体

    刚刚在星球里写零基础教程时候,为了让他们更加熟悉视图层,给他们布置了一个小作业需要有引入外部字体这个需要,百度虽然挺多的,但我还是喜欢自己实践出的内容,简单写一...

    许坏

扫码关注云+社区

领取腾讯云代金券