IOS逆向-恢复Dyld的内存加载方式
作者:电脑教程 来源:电脑教程 浏览: 【大中小】 发布时间:2025-12-08 11:46:14 评论数:
之前我们一直在使用由dyld及其NS Create Object File Image From Memory / NS Link Module API方法所提供的逆内存Mach-O捆绑包的内存加载方式 。虽然这些方法我们今天仍然还在使用 ,向恢但是复D方式这个工具较以往有一个很大的区别......现在很多模块都被持久化到了硬盘上。
@roguesys 在 2022 年 2 月发布公告称,加载dyld 的逆内存代码已经被更新,传递给 NSLinkModule 的向恢任何模块都将会被写入到一个临时的位置中。
作为一个红队队员 ,复D方式这对于我们的加载渗透工作并没有好处 。毕竟 ,香港云服务器逆内存NSLinkModule一个非常有用的向恢api函数 ,这个函数可以使得我们的复D方式有效载荷不被蓝队轻易的发现。
因此 ,加载在这篇文章中,逆内存我们来仔细看看dyld的向恢变化 ,并看看我们能做些什么来恢复这一功能,复D方式让我们的工具在内存中多保存一段时间 ,防止被蓝队过早的发现。
NSLinkModule有何与众不同
由于dyld是开源的亿华云 ,我们可以深入研究一下经常使用的NSLinkModule方法的工作原理 。
该函数的签名为 :
复制NSModule APIs::NSLinkModule(NSObjectFileImage ofi, const char* moduleName, uint32_t options) { ... }1.该函数的第一个参数是ofi ,它是用NSCreateObjectFileImageFromMemory创建的 ,它指向了存放Mach-O包的内存 。然后我们还有moduleName参数和options参数 ,前者只是用于记录语句,模板下载后者一般是被忽略不用的。
通过查看代码发现 ,最新版本的NSLinkModule ,会将osi所指向的内存写入磁盘。
复制if ( ofi->memSource != nullptr ) {...
char tempFileName[PATH_MAX];const char* tmpDir = this->libSystemHelpers->getenv("TMPDIR");if ( (tmpDir != nullptr) && (strlen(tmpDir) > 2) ) { strlcpy(tempFileName, tmpDir, PATH_MAX);if ( tmpDir[strlen(tmpDir) - 1] != / )strlcat(tempFileName, "/", PATH_MAX);}else
strlcpy(tempFileName, "/tmp/", PATH_MAX);strlcat(tempFileName, "NSCreateObjectFileImageFromMemory-XXXXXXXX", PATH_MAX);int fd = this->libSystemHelpers->mkstemp(tempFileName);if ( fd != -1 ) { ssize_t writtenSize = ::pwrite(fd, ofi->memSource, ofi->memLength, 0);}...
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.通过分析可以发现 ,代码并不是真正的发生了 "新 "的变化。这段代码一直存在于dyld3中,只不过是现在macOS也决定使用这段代码路径。云计算所以我们知道内存会被写入磁盘 ,并且路径会被传递给dlopen_from。
复制...
ofi->handle = dlopen_from(ofi->path, openMode, callerAddress);...1.2.3.因此,从本质上讲 ,这也就使得NSLinkModule成为了dlopen的一个封装器。
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)那我们能否恢复dyld之前的内存加载特性呢?
我们知道磁盘 I/O 是被用来持久化和读取我们的代码的......那么,如果我们在调用之前拦截它们 ,会发生什么呢?
使用dyld进行hook
为了拦截 I/O 调用 ,我们首先需要了解如何对dyld进行hook。
我们研究看看dyld是如何处理mmap调用的源码下载
