我认为最好变得更加现实,或者至少意识到自己想要做什么。
软件的最低层是存储模块之上的内核模块,它“加密”数据。
在 Windows 中,您可以堆栈驱动程序,因此从概念上讲,您只需拦截读取/写入调用,对其进行编辑并将其传递到驱动程序堆栈。
BSD下肯定有等价的机制,但具体是什么我不知道。
我认为您不想深入研究内核编程。
从用户空间应用程序的角度来看,最低级别是系统调用。
用于写入和读取的系统调用分别是数字 3 和 4(参见 here),在 BSD 衍生的操作系统中,如 OS X,它们变为 2000003h 和 2000004h (见here)。
由于您使用的是 Apple 计算机,因此此 IA32e 特定。
文件可以通过内存映射来读取/写入,因此您还需要劫持系统调用sys_mmap。
这更复杂,因为您需要检测页面错误或用于实现文件映射的任何机制。
要劫持系统调用,你需要一个内核模块。
下一个更高层次的抽象是运行时,那可能是 Obj C 运行时(根据数据,Swift 仍然使用 Obj C 运行时 AFAIK)。
Obj C 应用程序使用 Cocoa 框架,并且可以通过 [NSData dataWithContentOfFile: myFileName] 或 [myData writeToFile: myFileName atomically:myAtomicalBehavior] 之类的调用读取/写入文件。
有很多 Cocoa 方法可以写入或读取文件,但在内部框架将使用来自 Obj C 运行时的少数方法。
我不是 Cocoa 内部的专家,因此您需要使用调试器并查看调用链是什么。
一旦找到读取或写入文件的“低级”方法,您就可以使用method swizzling。
如果目标应用程序将您的代码作为库的一部分加载,这真的很简单,否则您需要更聪明的技术(例如直接感染或操纵其他进程的内存)。您可以在 Google 上搜索更多信息。
老实说,这仍然是很多工作,尽管可以管理。
您可以考虑简单地劫持一组有限的 Cocoa 方法,例如 NSData 的 writeToFile 或 NSString 的类似方法,并将该项目视为正在进行中的演示。
here 有人提出并回答了类似的问题。