“拆解” 应用程序

“拆解” 应用程序

2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

操作系统上的应用程序

Core Utilities (coreutils)

  • Standard programs for text and file manipulation
  • 系统中默认安装的是 GNU Coreutils

系统/工具程序

  • bash, binutils, apt, ip, ssh, vim, tmux, gcc, python, ffmpeg, ...
    • 原理不复杂 (例如 apt 是 dpkg 的套壳),但琐碎
  • All-in-one 工具合集:busybox, toybox

其他各种应用程序

  • Vscode、OBS-Studio、浏览器、音乐播放器:它们在各种工具程序基础上建立起来 (例:ffmpeg)
2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

所以这些程序……

和 minimal.S 有任何区别吗?

  • 简短的答案:没有
  • 任何程序 = minimal.S = 状态机

可执行文件是操作系统中的对象

  • 与 minimal 的二进制文件没有本质区别
  • 我们甚至可以像文本一样直接编辑可执行文件
2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

为了帮大家记住这一点

死去的记忆复活了

center

存档用 0x00, 0x01, 0x02 表示状态,嘿嘿嘿……

Demo: 修改 Hello World

2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

死去记忆的意义

如果那时候有人告诉我……

  • 同样的方式也可以去 hack Windows binary
  • Binary 太大?用正确的工具把 “不在意” 的部分屏蔽掉
    • 调试程序,在运行时观察哪里变了
    • 就入门了逆向工程
  • (其实大家离 “做点不一样的东西” 并不远)

对《操作系统》课的反思

  • 做减法:把 “不重要” 的部分屏蔽掉
  • “简单” 也可以深刻
  • 推广到学习:如果觉得 “难”,应该有简化的方法
2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

正确的工具

打开程序的执行:Trace (追踪)

In general, trace refers to the process of following anything from the beginning to the end. For example, the traceroute command follows each of the network hops as your computer connects to another computer.

System call trace (strace)

  • “理解程序是如何与操作系统交互的”
    • (观测状态机执行里的 syscalls)
    • Demo: 试一试最小的 Hello World
2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

操作系统中的 “任何程序”

任何程序 = minimal.S = 状态机

  • 总是从被操作系统加载开始
    • 通过另一个进程执行 execve 设置为初始状态
  • 经历状态机执行 (计算 + syscalls)
    • 进程管理:fork, execve, exit, ...
    • 文件/设备管理:open, close, read, write, ...
    • 存储管理:mmap, brk, ...
  • 最终调用 _exit (exit_group) 退出

感到吃惊?

  • 浏览器、游戏、杀毒软件、病毒呢?都是这些 API 吗?
2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

自己动手做实验:观察程序的执行

工具程序代表:编译器 (gcc)

  • strace -f gcc a.c (gcc 会启动其他进程)
    • 可以管道给编辑器 vim -
    • 编辑器里还可以 %!grep
      • 对于开发者来说,工具的组合是非常重要的

图形界面程序代表:编辑器 (xedit)

  • strace xedit
    • 图形界面程序和 X-Window 服务器按照 X11 协议通信
    • 虚拟机中的 xedit 将 X11 命令通过 ssh (X11 forwarding) 转发到 Host
2024 南京大学《操作系统:设计与实现》
“拆解” 应用程序

想象 “一切应用程序” 的实现

应用程序 = 计算 + 操作系统 API

  • 窗口管理器
    • 能直接管理屏幕设备 (read/write/mmap)
      • 能画一个点,理论上就能画任何东西
    • 能够和其他进程通信 (send, recv)
  • 任务管理器
    • 能访问操作系统提供的进程对象 (M1 - pstree)
  • 杀毒软件
    • 文件静态扫描 (read)、主动防御 (ptrace)

操作系统的职责:提供令应用程序舒适的抽象 (对象 + API)

2024 南京大学《操作系统:设计与实现》