mac

macos彻底卸载清理软件

日常使用中,经常遇到网络下载的mac软件不好删除,平时也只是在Finder中的Applications文件夹中将对应软件移动到废纸篓解决。但是偶然发现移除到废纸篓之后并清除的软件,居然在Activity Monitor中看到了还存在一些相关进程在跑,没想到这种垃圾软件居然恶意驻留一些程序没有被彻底清理,让人气愤。下面简要介绍下我清理写在软件的步骤:

Application

一般在appstore下载的软件可以直接在launchpad中按住等待出现x的删除按钮,点击删除即可。
不出现类似删除按钮的,基本上都是不在appstore下载的程序,这时候可以进入finder,找到Applications文件夹中需要删除的软件,移动到废纸篓,再在废纸篓彻底删除。这也是我开篇说的情况,一般都是用dmg下载安装的程序,在此步已经结束了卸载操作。但是一些恶意软件通过其他方式驻留在主机并通过launchd启动,这就需要了解下launchd的启动了。

launchd

launchd其实与linux中的systemd类似,它的作用主要有两个,一个是引导系统,一个是加载并保持服务。而那些恶意软件驻留也主要是利用第二点来实现。先简要理解launchd在整个系统加载启动过程中的流程:

  1. EFI固件(intel)激活,初始化硬件并加载boot.efi
  2. boot.efi加载内核,并去加载所需的内核扩展
  3. 内核加载launchd(可以在Activity Monitor中的Hierarchically模式看到结构)
  4. 加载launchdaemons对应目录下的plist,根据plist加载调用launchctl,调用loginwindow提示用户登录
  5. 在用户登录后,会扫描该用户对应的plist,扫描LaunchAgents对应目录下的plist并加载程序。

而Launchd管理的服务进程有四种:

  1. Launch Daemon:在开机时加载
  2. Launch Agent:在使用者登录时加载
  3. XPC Service:好像是10.7才有的
  4. Login Items:在User登录时执行

下面来清理垃圾软件的驻留服务,首先使用launchctl list 查看是否有对应的服务。

找到对应的服务使用launchctl unload -w [service name] 或者 launchctl remove [service name]

上述移除了launchd对于服务的调用,也就是解除了lauchd调用服务的关系,但是服务的一些文件还是存在于机器之中,如果一定要删除它们,可以在下列目录中查看并清理。

LaunchAgents

路径:

  • /System/Library/LaunchAgents
  • /Library/LaunchAgents
  • /Users/***/Library/LaunchAgents

LauchDaemons

路径:

  • /System/Library/LaunchDaemons
  • /Library/LaunchDaemons
  • /Users/***/Library/LauchDaemons

login item

程序的一些登录项还没删除干净,这时候可以点击左上角的苹果按钮,然后系统偏好设置[System Preferences],找到用户群组[Users & Groups],点击当前用户的登录项[login items],查看是否有程序相关的登录项,如果有就删除。

pkgutil

如果是pkg安装,可能还是存在一些关系和文件存在,这时候需要使用pkgutil --pkgs查看是否有对应的pkg,如果有的话使用pkgutil --forget [name]来让计算机认为这些pkg没有安装过,因为本身不会对与磁盘数据抹除,所以还是去/private/var/db/receipts找到对应文件进行删除

参考链接: