哪个 methods/calls 执行磁盘 I/O 操作以及如何找到它们?
Which methods/calls perform the disk I/O operations and how to find them?
- 我应该挂接哪些方法和系统调用,以便我可以替换 'how' 一个 OS X 应用程序(目标)读取和写入 to/from HD?。
- 我如何确定函数或系统调用的列表?。
添加更多上下文:
这是一个最终项目,我正在寻找建议。目标是改变 OS X 应用程序的行为,为其添加数据加密和解密功能。
- 我可以使用哪些工具来实现我的目标,为什么?
例如,假设目标应用是文本编辑。它不会将 "hello world" 保存为 HD 中的 .txt 文件中的纯文本,而是保存:"ifmmnXxnpme"。打开文件会显示原文。
我认为最好更现实一点,或者至少清楚自己想做什么。
软件中的最低层是存储模块之上的内核模块,即 "encrypt" 数据。
在 Windows 中,您可以堆叠驱动程序,因此从概念上讲,您只需拦截对 read/write 的调用,对其进行编辑并将其传递到驱动程序堆栈中。
在 BSD 下肯定有一个等效的机制,但我不知道它到底是什么。
我认为你不想深入研究内核编程。
从用户 space 应用程序的角度来看,最低级别是系统调用。
用于写入和读取的系统调用分别是数字 3 和 4(参见here), in BSD derived OS, like OS X, they becomes 2000003h and 2000004h (see here)。
因为您使用的是 Apple 计算机,所以这个 IA32e 是特定的。
文件可以通过内存映射read/written,所以你也需要劫持系统调用sys_mmap。
这更复杂,因为您需要检测页面错误或用于实现文件映射的任何机制。
要劫持系统调用,您又需要一个内核模块。
下一个更高层次的抽象是运行时,可能是 Obj C 运行时(根据数据,Swift 仍然使用 Obj C 运行时 AFAIK)。
一个 Obj C 应用程序使用 Cocoa 框架,并且可以 read/write 通过 [NSData dataWithContentOfFile: myFileName]
或 [myData writeToFile: myFileName atomically:myAtomicalBehavior]
.
之类的调用来归档
有很多 Cocoa 方法可以写入文件或从文件读取,但在内部框架将使用 Obj C 运行时中的少数方法。
我不是 Cocoa 内部专家,所以你需要调试器看看调用链是什么。
找到 "low level" 读取或写入文件的方法后,您可以使用 method swizzling。
如果目标应用程序加载您的代码作为库的一部分,这真的很简单,否则您需要更聪明的技术(例如直接感染或操纵其他进程的内存)。您可以 google 了解更多信息。
老实说,这仍然是很多工作,尽管可以管理。
您可能会考虑简单地劫持一组有限的 Cocoa 方法,例如 NSData
的 writeToFile
或 NSString
的类似方法,并将该项目视为正在进行的演示。
有人提出并回答了类似的问题 here。
- 我应该挂接哪些方法和系统调用,以便我可以替换 'how' 一个 OS X 应用程序(目标)读取和写入 to/from HD?。
- 我如何确定函数或系统调用的列表?。
添加更多上下文: 这是一个最终项目,我正在寻找建议。目标是改变 OS X 应用程序的行为,为其添加数据加密和解密功能。
- 我可以使用哪些工具来实现我的目标,为什么?
例如,假设目标应用是文本编辑。它不会将 "hello world" 保存为 HD 中的 .txt 文件中的纯文本,而是保存:"ifmmnXxnpme"。打开文件会显示原文。
我认为最好更现实一点,或者至少清楚自己想做什么。
软件中的最低层是存储模块之上的内核模块,即 "encrypt" 数据。
在 Windows 中,您可以堆叠驱动程序,因此从概念上讲,您只需拦截对 read/write 的调用,对其进行编辑并将其传递到驱动程序堆栈中。
在 BSD 下肯定有一个等效的机制,但我不知道它到底是什么。
我认为你不想深入研究内核编程。
从用户 space 应用程序的角度来看,最低级别是系统调用。
用于写入和读取的系统调用分别是数字 3 和 4(参见here), in BSD derived OS, like OS X, they becomes 2000003h and 2000004h (see here)。
因为您使用的是 Apple 计算机,所以这个 IA32e 是特定的。
文件可以通过内存映射read/written,所以你也需要劫持系统调用sys_mmap。
这更复杂,因为您需要检测页面错误或用于实现文件映射的任何机制。
要劫持系统调用,您又需要一个内核模块。
下一个更高层次的抽象是运行时,可能是 Obj C 运行时(根据数据,Swift 仍然使用 Obj C 运行时 AFAIK)。
一个 Obj C 应用程序使用 Cocoa 框架,并且可以 read/write 通过 [NSData dataWithContentOfFile: myFileName]
或 [myData writeToFile: myFileName atomically:myAtomicalBehavior]
.
之类的调用来归档
有很多 Cocoa 方法可以写入文件或从文件读取,但在内部框架将使用 Obj C 运行时中的少数方法。
我不是 Cocoa 内部专家,所以你需要调试器看看调用链是什么。
找到 "low level" 读取或写入文件的方法后,您可以使用 method swizzling。
如果目标应用程序加载您的代码作为库的一部分,这真的很简单,否则您需要更聪明的技术(例如直接感染或操纵其他进程的内存)。您可以 google 了解更多信息。
老实说,这仍然是很多工作,尽管可以管理。
您可能会考虑简单地劫持一组有限的 Cocoa 方法,例如 NSData
的 writeToFile
或 NSString
的类似方法,并将该项目视为正在进行的演示。
有人提出并回答了类似的问题 here。