如何找到一个函数的使用方法

需求: 在iOS上如果想创建一个APFS分区的话很简单,直接执行newfs_apfs -A /dev/disk0s1就可以在容器里面新建一个弹性APFS分区了。但是我想删掉创建出来的分区该怎么操作呢
操作步骤: 删除一个APFS分区
任何其他描述: 搜了半天资料,在ihttps://github.com/xybp888/iOS-SDKs/blob/master/iPhoneOS13.4.sdk/System/Library/PrivateFrameworks/UserFS.framework/PlugIns/livefiles_apfs.tbd里面,可以看到iOS上存在一个文件/System/Library/PrivateFrameworks/UserFS.framework/PlugIns/livefiles_apfs.dylib(在内核缓存里面),里面有一个符号_apfs_deletefs,猜想apfs_deletefs函数应该就是我们需要的删除分区的函数。但是该如何获取到这个函数如何使用的信息呢?xcode sdk里面并没有任何关于这个函数的内容。虽然可以通过dlopen和dlsym的方法直接动态调用这个函数,但是根本不知道应该把什么参数传给它才能达到删除分区的目的。
已知保存资料刷机不会删除手动创建的分区,但是不保存资料刷机或是直接恢复出厂设置都会删除手动创建的分区
环境: iOS13,只有iOS13才有livefiles_apfs.dylib这个文件。iOS12里面虽然在APFS.framework里面也能找到这个符号但是并没有livefiles_apfs.dylib这个文件(能通用其实更好)

图片

你说的这个函数我不会用, 但方法无非要么找到调用的地方参考, 要么分析函数的实现, 了解各个参数是什么

【看走眼了的胡说八道,请忽略】

要是有这么简单那就好了…fs_snapshot_delete是删除快照的函数(这些您都知道我就不多说了),并且它不仅在libSystem_B.dylib中存在符号,而且还在sdk中有定义
apfs_deletefs函数的作用(猜测)应该是删除分区,并且sdk中不存在它的定义 libSystem_B.dylib中也不存在它的符号

macOS上面唯一有删除apfs分区功能的命令就是diskutil,但是它似乎没有用到函数apfs_deletefs,搜了一下github,没有找到任何不使用diskutil删除apfs分区的项目

我贴个图好了


可以看到,从名字上来看 这个dylib里面充满了各种处理apfs分区相关数据的符号,并且这个dylib在iOS12及先前版本中还是不存在的 非常有意思(这个dylib在内核缓存里面)

你要试一试么?

简而言之 先从dyldcache里面dump出几个private framework然后去dlopen他最后把的dlsym搞出来

截屏2020-04-07 上午4.52.05

1 Like

可是不知道怎样正确的传入参数呢

dlsym的时候要定义的

是的 不知道怎么定义
所以您成功了嘛

我好了!!!!!!


0CD4E1C57F6866A20088CE19E30E00C1
原文件是XCXiao(极端阴险)写的,源码在这(https://github.com/KpwnZ/APFSDelete),我只是稍微抄了一下
用的是APFS.Framework,不是上面的dylib,所以12系统应该也可以用

3 Likes