当前位置: 首页 > news >正文

记一次Runtime Hook的问题

背景

项目中遇到一个问题,需要引入两个SDK,我们暂且命名为A 和 B,由于业务需要这两个SDK都需要对一个系统函数C进行hook, 但是有一个前提,由于B 所做的是一个统计相关的SDK,所以B要监控App内的所有代码这其中也包括了 SDK A 所做的一些操作,所以我们必须确保B在hook C函数时候 A已经对C函数hook完毕,其实这就涉及到hook顺序的问题。

研究

先看下代码,我用hookMethod来模仿系统方法。

- (void) TEST_HOOK_TWICE {
    [self changeOrginalSelectorName:@"hookedMethod" inClass:@"RootViewController" withCustomSelectorName:@"swizzle_hookedMethod1" isClassMethod:NO];

    [self changeOrginalSelectorName:@"hookedMethod" inClass:@"RootViewController" withCustomSelectorName:@"swizzle_hookedMethod2" isClassMethod:NO];

    [self hookedMethod];

}

- (void)hookedMethod {
    NSLog(@"原始方法");
}

- (void)swizzle_hookedMethod1 {
    NSLog(@"1");
    [self swizzle_hookedMethod1];
}

- (void)swizzle_hookedMethod2 {
    NSLog(@"2");
    [self swizzle_hookedMethod2];
}复制代码

然后看下没有hook之前的样子

原本的样子

然后我们执行代码

//第一步:交换A中的方法和系统方法
 [self changeOrginalSelectorName:@"hookedMethod" inClass:@"RootViewController" withCustomSelectorName:@"swizzle_hookedMethod1" isClassMethod:NO];
//第二步:交换B中的方法和系统方法
[self changeOrginalSelectorName:@"hookedMethod" inClass:@"RootViewController" withCustomSelectorName:@"swizzle_hookedMethod2" isClassMethod:NO];
//第三步:调用系统方法
[self hookedMethod];复制代码

然后我们一步一步来看,先看调用第一步之后是什么样子的(红色箭头为第一步之后的样子)

第一步之后

然后看第二步调用完之后的样子(绿色是第二部调用)
第二部之后的样子

接下来我们调用系统方法也就是第三步,然后我们看下流程是怎样的(每个方法实现里面都会递归调用下自身,为了是hook时候不改变原有逻辑)
调用顺序

这样一来就很明显 如果想想监控住所有的代码那就需要在A IMP 这步,因为之前的Hook顺序是先A -> B -> System 这样一来只要我们改一下顺序改为 B -> A -> System就可以让B SDK监控到所有的代码。
调用顺序

茉莉儿简书同步更新: www.jianshu.com/p/86907071a…

相关文章:

  • POJ 2942 圆桌骑士
  • 2016.3.17__CSS3动画__第十一天
  • 【搞机】9.7英寸iPad Pro 上手开箱(图文)
  • 【凯子哥带你夯实应用层】使用ActionProvider实现子菜单时遇到的一个坑
  • 使用 FreeRTOS 时注意事项总结(基础篇教程完结)
  • 推荐系统中的矩阵分解演变方式
  • Java——操作Excel表格,读取表格内容
  • 伊吹萃香
  • BZOJ 1878 SDOI2009 HH的项链 树状数组/莫队算法
  • 数据库对象
  • 中文分词--逆向最大匹配
  • servlet文件下载2(单文件下载和批量下载)
  • php 上传文件
  • 程序员工作中绕不开的9大问题,你遇到过几个?
  • Adobe将于2020年末停止对Flash的支持
  • Android开源项目规范总结
  • angular学习第一篇-----环境搭建
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • emacs初体验
  • Promise面试题2实现异步串行执行
  • Redis中的lru算法实现
  • windows下如何用phpstorm同步测试服务器
  • 安装python包到指定虚拟环境
  • 程序员该如何有效的找工作?
  • 动态规划入门(以爬楼梯为例)
  • 聊聊directory traversal attack
  • 聊聊redis的数据结构的应用
  • 如何设计一个微型分布式架构?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 说说动画卡顿的解决方案
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我从编程教室毕业
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #NOIP 2014# day.1 T2 联合权值
  • #控制台大学课堂点名问题_课堂随机点名
  • (C++17) optional的使用
  • (ibm)Java 语言的 XPath API
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (分布式缓存)Redis哨兵
  • (过滤器)Filter和(监听器)listener
  • (汇总)os模块以及shutil模块对文件的操作
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Linq学习笔记
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)重识new
  • .chm格式文件如何阅读
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET DevOps 接入指南 | 1. GitLab 安装