iOS修改外部符号指针地址—fishhook原理

上篇文章解释了外部符号加载的原理,知道了外部函数地址最后都保存在__DATA_CONST,__got__DATA,__lay_symbol_ptr
因此我们如果想要hook外部函数,只需要在启动后修改这两个段内的值就行。

接下来就是怎么找到某个外部符号在__DATA_CONST,__got__DATA,__lay_symbol_ptr的位置了。
假设这个外部符号名字是MMFWHeaderTest,因为无法确定是懒加载还是非懒加载符号,所以__DATA_CONST,__got__DATA,__lay_symbol_ptr都要遍历。
但是我们看__DATA_CONST,__got__DATA,__lay_symbol_ptr在mach-o文件的内容,都是函数指针,没有符号名称。我们要修改这里的值,但是要先找到,第几个符号是MMFWHeaderTest

SectionHeader

先去Load Commands看看,在这里可以找到__la_symbol_ptr的section header,也可以找__got
请添加图片描述
其中Indirect Sym Index(也就是Reserved1)代表在第一个懒加载的符号在间接符号表的位置是第14个。
Size是88,懒加载符号每个大小是8,所以懒加载符号一共有11个。

间接符号表

这样的话,我们需要遍历间接符号表 第14—24 的符号。这里也还是从0开始计数的。


请添加图片描述

找到间接符号表对应的位置,第一个数据是0x81,这代表这个符号在符号表的第0x81个。

符号表

所以这个符号的地址 = 符号表开头地址 + 0x81 * 符号表每个符号大小(0x10)
我这里是0xC300 + 0x81 * 0x10 = 0xCB10

请添加图片描述

字符串表

再看字符串表位置,0x74,不过这里是字符串表开头地址+0x74
我这里是0xCCA8 + 0x74 = 0xCD1C请添加图片描述

匹配成功,修改内存值

这就算匹配上了,所以懒加载符号表的第一个就是MMFWHeaderTest,然后我们直接修改__DATA,__la_symbol_ptr里第一个指针的值就行。

匹配失败,继续匹配

如果没匹配上,就回到间接符号表那一步,继续往下匹配。
如果__la_symbol_ptr找完了,就回到SectionHeader那一步,开始找__got
如果都找完了还没有,那就说明这个符号不存在。

总结

以上就是fishhook的原理,具体操作可以看源码。

mach-o文件结构

  • Header
  • Load Commands
    • Segment Header
      • Section Header
    • 其他
  • Segment
    • Section

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623151.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lua语法(一)

参考链接: 系列链接: Lua语法(一) 系列链接: Lua语法(二) 系列链接: Lua语法(三)——元表与元方法 系列链接: Lua语法(四)——协程 系列链接: Lua语法(五)——垃圾回收 系列链接: Lua语法(六)——面相对象编程 Lua语法目录 简介正文语言基础一、语法规范二、类型和值三、数值运…

stack使用业务口组建和配置堆叠

一、定义成员编号(成员ID槽位号,默认为0) slot 槽位号(也是成员ID号),如gi0/0/3,第1个0为槽位号,第2个0为子卡号,第3个是接口号。 [Switch2] stack slot 0 renumber 1 …

OV SSL证书申请

随着网络安全的需求度日益提高,https证书也成为了当下最受欢迎的数字证书之一,主要是用于保护网站和应用程序的安全,并提升用户对网站的信任度,且只有企业或组织才可申请。 OV SSL证书全称Organization Validation SSL(组织验证性…

CFDPro雾化仿真 | 专为雾化过程与液滴属性研究设计的仿真模块

雾化是一种将液体转化为微小液滴的技术,通过不同的雾化方法实现液体的高效分散、蒸发、燃烧、吸附或沉积等目的。 雾化仿真在多个工业领域中具有极其重要的地位。无论是内燃机中燃油的高效燃烧,还是化工生产中的喷雾干燥,以及农业喷雾中农药…

AI网关助力边缘物联网

随着人工智能技术的迅猛发展,AI网关作为通往智能未来的桥梁,正逐渐被人们所认识和重视。AI网关是一种智能设备,它连接了各种智能终端设备,促进它们之间的交流和协同工作。在这个信息化、智能化时代,AI网关的作用愈发凸…

【数据结构与算法】递归

To Iterate is Human,to Recurse,Divine.(人理解迭代,神理解递归) ——L.Peter Deutsch 递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。也就是说,递归算法是一种直接或间接调用自身方法的算法。其中,直…

MySql 安装,小白也可以学会成功安装的保姆级教程

MySql 安装 文章目录 MySql 安装1.Mysql下载1.1 访问下载链接1.2 选择合适版本1.3 下载安装包 2.MySql安装3.安装成功检测验证3.1 mysql自带控制台验证3.2 win系统控制台进入验证 4. mysql 配置path5. navicat 连接 mysql 1.Mysql下载 1.1 访问下载链接 MySQL Downloads 这里…

Spring Boot | SpringBoot对 “SpringMVC“的 “整合支持“、SpringMVC“功能拓展实现“

目录: SpringMVC 的 “整合支持” ( 引入"Web依赖启动器",几乎可以在无任何额外的配置的情况下进行"Web开发")1.SpringMVC "自动配置" 介绍 ( 引入Web依赖启动器"后,SpringBoot会自动进行一些“自动配置”&#xff0…

eigen使用教程

一 问题集锦 1 fatal error: Eigen/Dense: No such file or directory ubuntu c++使用eigen提示"fatal error: Eigen/Dense: No such file or directory"的解决办法_: fatal error: eigen3/eigen/dense: 没有那个文件或目录 #incl-CSDN博客https://blog.csdn.net/c…

[Collection与数据结构] 二叉树(一):二叉树的性质与基本操作

1. 树形结构 1.1 概念1 (了解) 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点&#…

使用剧本批量部署rsync服务端实战

目录 1、实战部署 编写剧本 执行剧本测试!!! 2、部署方式对比 1、实战部署 编写剧本 执行剧本测试!!! 2、部署方式对比 ansible模块实战-部署rsync服务端-CSDN博客 ansible临时命令和playbook区别 …

【UE5.1】使用MySQL and MariaDB Integration插件——(4)修改、插入、删除数据

目录 效果 步骤 一、修改 二、插入、删除 在上一篇博客(【UE5.1】使用MySQL and MariaDB Integration插件——(3)表格形式显示数据)基础上继续实现修改、插入和删除数据库数据的功能 效果 修改数据: 插入数据&…