IOS上的几种注入动态库的方式

0x00 准备环境

编译dylib

首先得先写一个测试用的动态库。Xcode 新建 iOS 工程的时候,选择 Framework 工程,默认文件格式为动态库
在这里插入图片描述

#import <Foundation/Foundation.h>
__attribute__((constructor)) static void EntryPoint()
{
    NSLog(@"inject seucess");
}

这里编译出来的是以.framework为结尾的文件

三种注入代码的方式

0x01 DynamicLibraries

注入动态库的第一种方法可以将 dylib 文件放入 DynamicLibraries 目录。写过 Tweak 的朋友,应该知道 Tweak 产生的 dylib 实际会安装到 /Library/MobileSubstrate/DynamicLibraries 目录,在这个目录的 dylib 会被应用加载,里面的 dylib 会有一个 plist 文件,标识哪些进程会加载,也就是我们写tweak的那个bundle id:

在这里插入图片描述

0x02 修改可执行文件

注入动态库的第二种方法就是修改可执行文件。OSX 和 iOS 应用的可执行文件都属于 Mach-O 文件格式,只要我们在可执行文件的添加了一条 LoadCommand 为 LC_LOAD_DYLIB,将路径指定我们的 dylib,不就行了吗?下面的图可以看出,LoadCommand 加载系统的动态库。根据这个文章里可以分析得知
在这里插入图片描述
1.修改mach-o文件的头文件
2.添加一个dylib_command结构体

案例可见:
https://github.com/gengjf/insert_dylib

./insert_dylib  dylibpath  demo

0x03 DYLD_INSERT_LIBRARIES

第三种方法是使用 DYLD_INSERT_LIBRARIES 环境变量启动进程。

dumpdecrypted 它就是使用 DYLD_INSERT_LIBRARIES 注入进程,然后把文件从内存中给 dump 下来。
有人会奇怪,为什么 DYLD_INSERT_LIBRARIES 能够注入呢?其实这就是苹果本身提供的一个功能,我们可以看苹果开源的 dyld 的源码,在 main 函数里相关的代码,判断了 DYLD_INSERT_LIBRARIES 环境变量,如果有的话就会加载。

DYLD_INSERT_LIBRARIES=libpayload.dylib ./testProgram

参考:
https://juejin.im/post/5b1f1d3a6fb9a01e6e2baded#heading-1

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值