ARM INLINE HOOK (一)

Arm Inline hook的简易原理图 Arm架构下有arm指令和thumb指令之分,不同指令集的hook过程不一样。 假设我们要hook libc.so中的execv和read函数,android系统的库应该都加了-mthumb-interworking编译选项,支持thumb/arm的代码交织,所以要区分目标函数是thumb还是arm指令的。 用ndk编译自己的代码好像默认的是arm(虽然我网上查的说默认是thumb,但我的库编 阅读详情

运行在ARM指令集的CPU上(比如Android手机),通过HOOK机制,对一些关键的方法进行监控,从而达到一些特殊目的,比如性能监控、安全等。

常用的HOOK方法有:GOT表Hook和Inline Hook。而inline hook具有更广泛的适用性,几乎可以Hook任何函数(当然也有特殊情况无法进行inline hook,后面会提到)。相较于GOT表hook,inline hook由于需要能读懂ARM指令,而且还需要会对修改过的指令进行修复,会写一些基本的ARM指令,所以门槛较高。如果您有兴趣研究底层的技术,可以好好读一下我这篇文章。

inline hook的原理:

如图:

这张图很清晰表达了inline hook的原理,Caller是调用者,Callee是被调用函数,inline hook修改被调用函数头,将其修改为jmp指令,跳转到Hook进去的方法里,在Hook方法里可以做一些工作,比如记录函数参数值,或者对传参机型一些合法校验等,然后执行Trampoline,Trampoline其实就是Callee方法里被覆盖为jmp的内容,但是注意,不是简单的把jmp覆盖的内容直接拷贝到Trampoline中执行,这里要做指令的修复(为什么?后面会详细解释),执行完Trampoline后继续执行Callee后面的指令,然后返回调用者,这就是一个完整的inline hook的执行流程。

所以实际的执行步骤如下:

     1、将需要hook的方法的头两个指令替换为跳转指令,并保存原指令;

     2、将保存的原指令等价搬迁到Trampoline,注意是等价搬迁不是拷贝,这样在执行hook的内容后继续执行原来的逻辑;

 要解决上述两个问题之前,我们必须先要了解:

     1、ARM和Thumb指令的区别,ARM指令是按照固定长度的四字节进行编码,需要四字节对齐,Thumb指令是可变长度的两字节或四字节编码,需要两字节对齐,Thumb指令大部分都是两字节编码,但是也有部分指令是四字节编码,比如:bl和blx指令就是四字节编码。

     2、Arm处理器采用3级流水线来增加处理器指令流的速度,也就是说程序计数器R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的,即PC总是指向当前正在执行的指令地址再加2条指令的地址。

  所以被hook的方法的头两个指令被替换为如下:

        LDR PC, [PC, #-4]

        addr (自己编写的hook方法的地址)

   下面举例进行说明:

     需求:需要hook libc库中的read方法,在执行read方法前先跳转到my_read方法里,记录read的参数fd,*buf等内容,然后返回继续执行。

     那这里的addr就是my_read方法的地址。为什么要将PC寄存器减去4呢?因为PC当前的地址为PC+8,所以-4刚好执行下一条指令地址,然后通过LDR将addr的内容load进PC寄存器中,达到跳转的目的。

     1、首先将LDR PC, [PC, #-4]这条指令转化为16进制的机器码,这里推荐一个网站,可以提供arm指令和十六进制机器码之间的转换:http://svr-acjf3-armie.cl.cam.ac.uk/main.cgi,如图:

 2、备份read方法的头两条指令,在Assembly code中输入LDR PC, [PC, #-4]后,machine code部分就显示出十六进制的机器码,然后将0xE51FF004写入第一个指令,通过取值符获得my_read方法的地址,将该地址(四字节)写入下一条指令。

   OK,现在执行read方法时,会首先跳转到my_read方法中,记录相关数据。那么是不是大工告成了呢?远远没有!万里长征刚开始,下面就是最复杂的部分:指令修复。

  在了解指令修复之前,首先需要熟悉ARM指令的结构,ARM指令的的summary图如下:

        这张图基本上把ARM所以的指令结构都表示出来了(不包括Thumb),根据该图我们试着转化一条指令,该指令的格式为:

        LDR RX, [PC, #xx],其中RX代表R0、R1...等寄存器#xx表示任意一个立即数,那么这条指令翻译成16进制后有什么特点呢?         1、31-28位,Cond:这个四位是固定条件位不用管;
       2、27-25位,101,Load指令标识
       3、24位,Load指令为1:add offset before transfer;

       4、23-20位:1001

       5、19-16位:1111:PC寄存器是R15

       从上述分析可以得出,将该指令 & 0xfff0000 等于0x59f0000,这个运算就把LDR RX, [PC, #xx]这个类型的指令进行了归类。

       下面就引出指令修复中的一个难题:因为所有的PC地址都只想当前指令地址向下偏移两个字节的地址,如果我们把该指令迁移到另外一个地址,那么执行该指令时,PC寄存器指向的是迁移的新地址加上两个字节的偏移地址,所以在迁移前需要判断一下,该指令是否包含PC寄存器:  例如:if ( (*instruction & 0x0fff0000) == 0x59f0000) ,如果包含PC寄存器,则首先将pc向下偏移两条指令的地址加上指令后的立即数,得到绝对地址。得到四个字节绝对地址后,可以保存起来,然后通过指令load指令进行加载。

       思路就是如此,但是实现起来有很多细节要考虑,比如Thumb,Thumb-2指令的支持,处理的细节也很麻烦,稍微出错就可能引起崩溃,而且很难定位。笔者花了大量的经历,基本上将涉及到PC寄存器的ARM、THUMB、THUMB-2指令都进行了修复。

      时间问题,这篇文章暂时写到这儿,后面我还会具体讲一些实例,如何做指令的解析、如何修复指令,ARM指令的操作很有意思,需要程序员有扎实的技术功底和耐心,比如要对位操作非常熟,我也打算为位操作写一篇专门的文章。到时候您会发现位操作有多好玩儿,有多强大。

     最后,推荐我写的一个抓包工具,WebSee,能抓取网页的http/https数据,无需root,无需中间人攻击,可以在华为应用商城下载:https://appstore.huawei.com/app/C101448345。

ARM64汇编0C - inlinehook 本文是ARM64汇编系列的完结篇,主要利用前面学过的知识做一个小实验完整系列博客地址:https://www.lyldalek.top/article/arm这里只讨论 ARM64 下的 inlinehook,做一个简单的demo,只是抛砖引玉,有兴趣了解更多细节的可以去查找资料,看开源项目。ARM64 相比 ARM 的 inlinehook 要麻烦不少,因为有很多指令都没了,且无法直接访问 PC 寄存器。 阅读详情

相关推荐

ARM汇编基础知识汇总与Inline Hook

ARM汇编 ARM汇编中B、BL、BLX指令的使用? B:跳转 BL:例如BL{cond} label。带链接的跳转,如果条件cond满足,会首先将当前指令的下一条指令的地址拷贝到R14(即LR)寄存器中,然后跳转到label指定的地址处继续执行。这个指令通常用于调用子程序,在子程序的尾部,通过MOV PC, LR返回到主程序中。 BX:例如BX{cond} Rm。带状态切换的跳转,如果条

犀牛划水 1352

arm64 内核 inline hook

linux 内核对于安全可能是比较重要的一环。 关于syscall table 表替换的问题 这里以linux 4.15和4.19为代表的说明我遇到的问题。 syscall hook 4.15 4.19 拥有可读写状态 hook成功 hook失败 这里似乎到4.19添加了对systable的保护。 如果非要对systable进行hook,可能替换这页表,改变物理地址指向是一种解...

inquisiter 2456

Android PLT hook 与 Inline hook

Android Native 函数 Hook 技术是一种在应用运行时拦截或替换系统或自身函数行为的手段,常见实现包括 PLT Hook、Inline Hook。PLT Hook 和 Inline Hook 是两种不同层次和机制的函数 Hook 技术,常用于逆向工程、安全分析、壳保护或热修复等场景。

1405

Android Natvie Hook讲解、 got表hook、inline hook 原理

Android Natvie Hook 讲解什么是Hook,以及Android Native层 hook名词解释以及知识储备处理器架构欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 什么是

spinchao的博客 8294

基于ARM32/Thumb-2的Android Inline Hook SO库开发实战

为了让Java层能够调用Native函数,必须遵循JNI命名规则并正确导出符号。同时,为了防止符号被优化掉,需注意链接器行为。典型JNI函数定义如下:extern "C"上述函数对应Java类中的声明:关键点解析:extern "C":防止C++函数名 mangling,确保符号以原始名称导出。JNIEXPORT和JNICALL:由JNI头文件定义,保证正确的调用约定(如ARM AAPCS)。函数命名格式为:Java_包名_类名_方法名,中间下划线替换。

weixin_30765637的博客 1198

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 414

Frida源码|Hook原理

Frida 整体的inline hook实现原理图如下(可能需要挂梯子看,svg图看雪上传不了,我挂github图床了)话说这需要deflector的流程中,4字节inline hook的一级跳板并没有将x0、lr存入栈中,但它同样也跳转到,根据二级跳板的生成,需要中继器deflector的会在写入第一条指令,这样对4字节的inline hook不会有什么影响嘛?希望大佬帮忙解答一下我的疑惑。

2503_90751938的博客 401

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5830

如何写一个Android inline hook框架

Android_Inline_Hook https://github.com/GToad/Android_Inline_Hook_ARM64 有32和64的实现,但是是分离的,要用的话还要自己把两份代码合并在一起。 缺点: 1、不支持函数替换(即hook后不执行原函数),现在只能修改参数寄存器,无法修改返回值。 2、不支持定义同类型的hook函数来接受处理参数,只能通过修改寄存器的方式修改参数。 ...

DaoDivDiFang的博客 2165

vivado生成及调用自定义IP的方法

开发环境:vivado 2018.2 1.将整个工程封装为自定义IP 将整个工程封装为自定义IP主要有以下步骤: 步骤1.选中工程中的top模块。点击Tools ------> Create and Package New IP,如图1所示 图1 步骤2.弹出界面后,点击next至图2界面,选择Package your current project,然后继续点击next 图2 步骤3.选择生成的IP路径,如图3所示。这个路径就是后续添加该IP的路径 图3 步骤4.继续点击next,然后选择fi

进击的阿日比 4730

使用 Restart Extension 继续解决 Ansys 机械分析

您正在执行复杂或大型的多步有限元分析,突然,您意识到经过数小时的求解后,您需要添加或修改边界条件。在本篇博文中,您将了解如何利用 Ansys Mechanical 中的 RestartAnalysis 扩展来扩展多步分析,方法是合并额外的时间步骤和边界条件,而不会丢失已计算的结果。幸运的是,在 Mechanical 中,有一种直接的方法可以实现这一点,而不会损害您之前的结果,而这在添加新边界条件和使用重新启动点时经常发生。得到的结果符合预期,您可以看到施加的力产生的这两个部分之间的相对位移。

jkh920184196的博客 1233

实现Android ARM64平台下Inline Hook框架

Android阵营新出机型的cpu基本都是64位了,虽然可以向下兼容armeabi-v7a,但是使用32位的so毕竟不能充分发挥64位cpu的潜力,所以以后arm64-v8a用的会越来越多。但是整个安卓生态圈似乎还没有开源发布的ARM64内联HOOK方案,所以自己动手写了个,姑且取名And64InlineHook吧,需要注意的是仍然是Alpha版。         关于Inline Hook的背

Rprop 6万+

详细解读经典跨模态对齐技术Q-Former代码

介绍BLIP2的博客层出不穷,介绍Q-Former的博客也不少,但是详细解读Q-Former代码的博客很少。这篇博客希望以代码为基础,讲明白Q-Former的原理和核心思想,并详细解读一些值得注意的细节。希望读者们能从这一经典技术中朝花夕拾,得到启发。

沉迷单车的追风少年 2459

SandHook 之 Native Inline Hook

简介 在 SandHook ART Hook 稳定之后,抽空把 Native Inline Hook 实现了,虽然有重复造轮子的嫌疑,但确实是本人一行一行码出来的,基本所有的东西都是自己实现的。 Github: https://github.com/ganyao114/SandHook 支持 目前支持 ARM32 ARM64 其实 X86 非常好实现,但是想了一下还是往后稍稍吧,等 ARM 稳...

ganyao939543405的博客 3795

Python数据分析全流程指南:从数据采集到可视化呈现的实战解析

在数字化转型浪潮中,数据分析已成为企业决策的核心驱动力。Python凭借其丰富的生态库和简洁的语法,成为数据分析师的首选工具。本文将以实战案例为脉络,拆解数据分析全流程的关键环节,通过具体代码和场景说明如何用Python完成从数据采集到可视化呈现的完整链路。

这家伙很懒,什么都没有留下 1681

22、常见加密哈希算法及安全机制解析

本文详细解析了多种常见加密哈希算法,包括SHA系列、RIPEMD、Tiger、HAVAL、Whirlpool等,涵盖其工作原理、安全性与性能对比。同时探讨了哈希攻击方式如预映像攻击和彩虹表,并介绍了盐、MAC、HMAC等防御机制。结合密码存储、消息完整性验证及区块链应用案例,分析了不同场景下的算法选择建议,并展望了哈希算法在创新、融合与标准化方面的未来发展趋势。

seed的博客 391

Windows on Arm 下的 Inline Hook 简单实现

关于Windows on Arm平台的Inline Hook的简单实现思路和实现说明。

PeaZomboss的博客 1057

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

从0到1掌握Android-Inline-Hook:ARM架构下内联钩子开发指南

Android-Inline-Hook是一个专注于ARM架构的内联钩子开发工具,支持thumb16、thumb32和arm32指令集,为Android平台的开发者提供了高效的函数拦截解决方案。无论是进行应用调试、功能扩展还是安全分析,掌握内联钩子技术都能让你在Android开发领域如虎添翼。 ## 📚 什么是内联钩子? 内联钩子(Inline Hook)是一种高级编程技术,通过修改目标函数的

gitblog_00764的博客 963

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android Arm Inline Hook

什么是Inline HookInline Hook即内部跳转Hook,通过替换函数开始处的指令为跳转指令,使得原函数跳转到自己的函数,通常还会保留原函数的调用接口。与GOT表Hook相比,Inline Hook具有更广泛的适用性,几乎可以Hook任何函数,不过其实现更为复杂,考虑的情况更多,并且无法对一些太短的函数Hook。 其基本原理请参阅网上其他资料。需要解决的问题1.Arm模式与Thumb模

xiziyunqi的博客 600

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SandHook:构建Android ART Hook与Native Inline Hook的完整解决方案

如果你正在寻找一个功能强大且兼容性极佳的Android Hook框架,那么SandHook绝对是你的理想选择。这款框架支持从Android 4.4到11.0的32位和64位系统,提供完整的ART Hook和Native Inline Hook能力,同时完美兼容Xposed API,让你能够轻松实现各种Hook需求。无论是进行应用性能监控、安全分析还是功能扩展,SandHook都能为你提供专业级的H

gitblog_00039的博客 356

android inline hook 学习笔记

hook种类 GOT表hook,通过更改GOT表offset来实现hook inline hook,即内部跳转hook,替换函数开始处的地址为跳转指令,跳转到hook函数比较而言, 1.GOT表对于本so文件中不经过GOT表 2.dlsym来调用的函数不经过GOT表 android inline hook难点 - ARM模式和Thumb存在区别,不像x86,需要区分处理. - 跳转指令如

jmp esp 2658

Android Inline Hook 教程

Android Inline Hook 教程 1. 项目介绍 Android Inline Hook 是由开发者 zhuotong 创建的一个库,旨在提供Android平台上的内联钩子功能。它支持Thumb和ARM指令集,适用于armeabi-v7a及arm64-v8a架构。此库的独特之处在于它可以对整个函数进行挂钩,而不是像某些其他工具那样只支持函数的特定位置。 主要特性包括: 支持Andro...

gitblog_00390的博客 1311

【亲测免费】 Android Inline Hook 使用教程

Android Inline Hook 是一个用于 Android 平台的内联钩子库,支持 thumb、arm32 和 arm64 架构。该项目允许开发者在运行时修改函数的行为,常用于性能分析、安全监控和功能扩展等领域。 ## 项目快速启动 ### 环境准备 1. 确保你已经安装了 Android NDK。 2. 克隆项目到本地: ```bash git clone http...

gitblog_00792的博客 1267

Inline Hook

什么是Inline Hook Inline Hook即内部跳转Hook,通过替换函数开始处的指令为跳转指令,使得原函数跳转到自己的函数,通常还会保留原函数的调用接口。与GOT表Hook相比,Inline Hook具有更广泛的适用性,几乎可以Hook任何函数,不过其实现更为复杂,考虑的情况更多,并且无法对一些太短的函数Hook。 其基本原理请参阅网上其他资料。 需要解决的问题 Arm模式与T...

Android系统攻城狮 1392

Android ART Hook 实现 - SandHook

简介 Github: https://github.com/ganyao114/SandHook 关于 Hook,一直是比较小众的需求。本人公司有在做 Android Sandbox(类似 VA),算是比较依赖 Hook 的产品,好在 Android Framework 大量使用了代理模式。所以也不用费劲在VM层作文章了,直接用动态代理即可。 然而,VM 层的 Java Hook 还是有些需求的,...

ganyao939543405的博客 2万+
上一篇: Dalvik指令分析(三) dex文件的结构
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值