Peter's Den

悲观者只见到机会后面的问题,乐观者却看见问题后面的机会

Hello,在下2012年涉足Apple Developer,至今在iOS/OSX领域混迹多年,本职工作以iOS为主


精通Objective-c/Swift,对Python/Java/.Net/JavaScript也略懂一二,会与大家在这里记录分享

mach-o动态注入原理

mach-o动态注入原理

本文主要讲解开源工具yololib的实现原理,超级简单,源码总共也就200多行,并无多大技术含量,主要是为了记录备忘

命令
// 命令基本用法
yololib <mach-o> <dylib file>
入口代码

可以看出,这里是记录了2个路径,然后调用了inject_file函数

函数:inject_file

步骤:

  • fopen打开mach-o
  • fread读取mach-o信息
  • 根据读取到的buffer获取fat_header信息struct fat_header* fh = (struct fat_header*) (buffer);
  • 根据magic类型来区分32位还是64位:若magic=FAT_MAGIC时,需要用cputype来区分
  • 然后32位调用inject_dylib,64位调用inject_dylib_64
函数:inject_dylib

函数:inject_dylib_64

原理

#include <mach-o/loader.h>,这个头文件中用到一个重要的结构体,就是dylib_command,需要通过设置它的参数来注入,最终调用fwrite来写入即可。

更早的文章

iOS启动优化之二进制重排

启动优化 关于启动优化,在客户端开发中是一个老生常谈的话题,图片压缩/删除代码等方式都已经老掉牙了,一般的面试中也回答这些方案,在众多面试者中也无亮点。 下面的文章主要来讲讲,利用二进制重排的方案,来做优化启动时间。概念 在讲重排之前,我们需要了解几个概念。 虚拟内存和物理内存 物理内存:内存条(硬件)上的地址就叫物理地址,以前的计算机都是通过CPU访问物理内存拿到数据的,这样存在安全问题(金手指?),而且随着软件发展速度快于硬件速度,物理内存也越发不够…… ...…

iOS继续阅读