ELF文件的native hook:ELF的运行时状态

💡 原文中文,约9600字,阅读约需23分钟。
📝

内容提要

本文介绍了ELF文件结构和虚拟内存概念,包括虚拟地址映射到物理地址的页映射,共享库的虚拟内存共享,以及导出符号的重定位和hook实现。同时介绍了dl_iterate_phdr函数查询共享库分布情况。

🎯

关键要点

  • 本文介绍了ELF文件结构和虚拟内存概念。

  • 虚拟内存是程序与物理内存之间的中间层,提供独立的内存空间。

  • 地址空间是操作系统分配的内存空间的地址集合,32位计算机最大寻址能力为4GB。

  • 虚拟地址到物理地址的映射采用分页映射,减少存储空间消耗。

  • 程序在虚拟内存中运行时,首先创建独立的虚拟地址空间,然后映射ELF文件。

  • 多个进程可以共享动态链接库(.so文件),提高内存利用率。

  • 共享库的可读写段会通过写时赋值技术实现数据隔离。

  • ELF文件中有导入符号和导出符号,程序在运行时动态链接库时进行重定位。

  • native hook是通过替换重定位地址实现的,可以在不影响其他程序的情况下进行。

  • 使用dl_iterate_phdr函数可以查询运行时的共享库分布情况。

  • 总结了native hook的基础知识和原理,后续将介绍代码实现。

延伸问答

什么是ELF文件的native hook?

ELF文件的native hook是通过替换重定位地址来实现的,可以在不影响其他程序的情况下进行函数的钩取。

虚拟内存的作用是什么?

虚拟内存为每个程序提供独立的内存空间,防止程序间的数据相互干扰,提高安全性。

如何实现多个进程共享动态链接库?

多个进程通过虚拟内存空间共享动态链接库,操作系统在内存中只保留一份库的副本,并为每个进程建立虚拟地址与物理地址的映射关系。

ELF文件中的导入符号和导出符号有什么区别?

导入符号是ELF文件中引入的外部符号,而导出符号是ELF内部定义的符号,可以被外部使用。

如何使用dl_iterate_phdr函数?

dl_iterate_phdr函数用于查询运行时的共享库分布情况,可以获取每个共享库的名称和基地址等信息。

写时赋值技术如何实现数据隔离?

写时赋值技术在进程尝试修改共享库的可读写段时,会复制该段数据到新的物理内存区域,从而实现数据的隔离。

➡️

继续阅读