【问题标题】:Which methods/calls perform the disk I/O operations and how to find them?哪些方法/调用执行磁盘 I/O 操作以及如何找到它们?
【发布时间】:2015-07-23 07:23:58
【问题描述】:
  1. 我应该挂钩哪些方法和系统调用,以便我可以替换 OS X 应用程序(目标)读取和写入 HD 的“方式”?
  2. 如何确定函数或系统调用列表?

添加更多上下文: 这是一个最终项目,我正在寻求建议。目标是改变 OS X 应用程序的行为,为其添加数据加密和解密功能。

  1. 我可以使用哪些工具来实现我的目标,为什么?

例如,假设目标应用是文本编辑。它不会将“hello world”作为纯文本保存在 HD 的 .txt 文件中,而是保存:“ifmmnXxnpme”。打开文件将显示原始文本。

【问题讨论】:

    标签: macos assembly reverse-engineering system-calls ptrace


    【解决方案1】:

    我认为最好变得更加现实,或者至少意识到自己想要做什么。


    软件的最低层是存储模块之上的内核模块,它“加密”数据。
    在 Windows 中,您可以堆栈驱动程序,因此从概念上讲,您只需拦截读取/写入调用,对其进行编辑并将其传递到驱动程序堆栈。
    BSD下肯定有等价的机制,但具体是什么我不知道。

    我认为您不想深入研究内核编程。


    从用户空间应用程序的角度来看,最低级别是系统调用。
    用于写入和读取的系统调用分别是数字 3 和 4(参见 here),在 BSD 衍生的操作系统中,如 OS X,它们变为 2000003h2000004h (见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 方法,例如 NSDatawriteToFileNSString 的类似方法,并将该项目视为正在进行中的演示。


    here 有人提出并回答了类似的问题。

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 2019-04-12
      • 2019-12-07
      • 2012-10-10
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多