【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

简介: 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

文章目录

一、ARM 架构下的插桩拦截

二、完整代码示例





一、ARM 架构下的插桩拦截


ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 32 3232 位指令 ;


04 F0 1F E5 00 00 00 00 , B target ;


B 指令是无条件跳转指令 , 04 F0 1F E5 是对应的机器码 ;



在 【Android 逆向】函数拦截 ( 修改内存页属性 | x86 架构插桩拦截 ) 一、修改内存页属性 基础上 , 先修改内存页属性 , 取得修改内存的权限 ;



然后开始进行函数拦截 ;


首先 , 拼装 ARM 架构下的无条件跳转指令 ;


/* B 无条件跳转指令 */
  unsigned char code[] = { 0x04,0xF0,0x1F,0xE5,0x00,0x00,0x00,0x00 };

然后 , 设置跳转指令的绝对地址 ; 注意这里与 x86 的跳转指令不同 , x86 设置的跳转地址是相对地址 , arm 的跳转地址是绝对地址 ;


/* arm 的跳转是绝对地址跳转 , 传入 pStub 函数指针即可 */
  *(unsigned*)(code + 4) = (unsigned)pStub;


最后 , 将 arm 跳转指令二进制机器码拷贝到函数开始位置 ;


/* 将机器码复制到函数开始位置 */
  memcpy(pFunc, code, sizeof(code));





二、完整代码示例


下面是 插桩函数拦截 的代码 , 兼容 x86 与 arm 架构 ;


注意 : 写完之后推荐刷新 CPU 高速缓存 , 调用 cache_flush 系统调用函数 ;


/*
 * unsigned char* pFunc
 * unsigned char* pStub
 * 上述两个参数分别是两个函数指针
 * 
 * 注意 : 写完之后要刷新 CPU 高速缓存 , 调用 cache_flush 系统调用函数
 */
int write_code(unsigned char* pFunc, unsigned char* pStub) {
  /* 获取 pFunc 函数入口 , 先获取该函数所在内存页地址 */
  void* pBase = (void*)(0xFFFFF000 & (int)pFunc);
  /* 修改整个内存页属性 , 修改为 可读 | 可写 | 可执行 , 
  * 避免因为内存访问权限问题导致操作失败
  * mprotect 函数只能对整个页内存的属性进行修改 
  * 每个 内存页 大小都是 4KB 
  */
  int ret = mprotect(pBase, 0x1000, PROT_WRITE | PROT_READ | PROT_EXEC);
  /* 修改内存页属性失败的情况 */
  if (ret == -1) {
  perror("mprotect:");
  return -1;
  }
#if defined(__i386__) // arm 情况处理
  /* E9 是 JMP 无条件跳转指令 , 后面 4 字节是跳转的地址 */
  unsigned char code[] = { 0xE9,0,0,0,0 };
  /* 计算 pStub 函数跳转地址 , 目标函数 pStub 地址 - 当前函数 pFunc 地址 - 5 
  * 跳转指令 跳转的是 偏移量 , 不是绝对地址值
  */
  *(unsigned*)(code + 1) = pStub - pFunc - 5;
  /* 将跳转代码拷贝到 pFunc 地址处 , 这是 pFunc 函数的入口地址 */
  memcpy(pFunc, code, sizeof(code));
#else // arm 情况处理
  /* B 无条件跳转指令 */
  unsigned char code[] = { 0x04,0xF0,0x1F,0xE5,0x00,0x00,0x00,0x00 };
  /* arm 的跳转是绝对地址跳转 , 传入 pStub 函数指针即可 */
  *(unsigned*)(code + 4) = (unsigned)pStub;
  /* 将机器码复制到函数开始位置 */
  memcpy(pFunc, code, sizeof(code));
#endif
  return 0;
}
/* C/C++ 中的 hook 函数方式 */
void hook_func(uint8_t* pApi, uint8_t* pUser, uint8_t* pStub, size_t size)
{
  unsigned char code[64] = { 0 };
  memcpy(code, pApi, size);
  write_code(pApi, pUser);
  write_code(size + pStub, size + pApi);
  memcpy(pStub, code, size);
}


目录
相关文章
|
2月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
71 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
1月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
24 3
|
2月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
97 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
1月前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
129 10
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
32 1
|
2月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
设计模式 人工智能 算法
编程之旅:从代码到架构的感悟
【9月更文挑战第33天】在编程的世界里,代码不仅是实现功能的工具,更是连接思想与现实的桥梁。本文将通过个人的编程经历,分享从编写第一行代码到设计系统架构的旅程,探索编程背后的哲学和技术演变。我们将一起思考,如何在代码的海洋中找到自己的航向,以及在这个过程中如何不断成长和适应变化。
|
2月前
|
机器学习/深度学习 大数据 PyTorch
行为检测(一):openpose、LSTM、TSN、C3D等架构实现或者开源代码总结
这篇文章总结了包括openpose、LSTM、TSN和C3D在内的几种行为检测架构的实现方法和开源代码资源。
77 0
|
3月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
35 2
|
3月前
|
机器学习/深度学习 测试技术 数据处理
KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
Kolmogorov-Arnold网络(KAN)作为一种多层感知器(MLP)的替代方案,为深度学习领域带来新可能。尽管初期测试显示KAN在时间序列预测中的表现不佳,近期提出的可逆KAN混合模型(RMoK)显著提升了其性能。RMoK结合了Wav-KAN、JacobiKAN和TaylorKAN等多种专家层,通过门控网络动态选择最适合的专家层,从而灵活应对各种时间序列模式。实验结果显示,RMoK在多个数据集上表现出色,尤其是在长期预测任务中。未来研究将进一步探索RMoK在不同领域的应用潜力及其与其他先进技术的结合。
110 4
下一篇
DataWorks