Pages

Sunday, 5 May 2024

OS X 解包 pkg

 

刚用 OS X 的同学会发现,Mac OS X 的 App 安装包,有两种形式,一种就是 .app,可以直接运行,类似于 Windows 下的绿色版;另一种是 .pkg 安装包,需要一路 next 安装好后才能使用。

在 OS X 下,PKG 包的卸载非常不人性化,最讨厌的是,只要是个 pkg 安装包,基本都要请求 root 权限。

于是,网上溜达一圈,找到直接解包 pkg 文件的方法,获取有用部分来使用。

我们以招商银行的网银插件为例,下载获取 dmg 镜像文档:CMBSecurityPlugin.dmg,双击打开,将 CMB Security Plugin.pkg 文件拖出来。

现在我们来解包:

$ pkgutil --expand CMB\ Security\ Plugin.pkg CMB\ Security\ Plugin
$ cd CMB\ Security\ Plugin
$ ls -l
total 8
-rw-r--r--  1 havee  staff  2794 12 25  2012 Distribution
drwxr-xr-x  3 havee  staff   102  9  9 14:06 Resources
drwxr-xr-x  5 havee  staff   170  9  9 14:06 cmbsecurityplugin.pkg

实际上,CMB Security Plugin.pkg 本身就是一个 xar 包:

$ file CMB\ Security\ Plugin.pkg
CMB Security Plugin.pkg: xar archive - version 1

可以用如下命令直接解压:

$ mkdir CMB\ Security\ Plugin; cd CMB\ Security\ Plugin
$ xar -xf ../CMB\ Security\ Plugin.pkg
$ ls -l
total 8
-rw-r--r--  1 havee  staff  2794 12 25  2012 Distribution
drwxr-xr-x  3 havee  staff   102 12 25  2012 Resources
drwxr-xr-x  5 havee  staff   170 12 25  2012 cmbsecurityplugin.pkg

可以看到,以上两种方式,都可以解压。

接下来,我们看到,又出现一个 pkg 文件,再看下文件类型:

$ file cmbsecurityplugin.pkg
cmbsecurityplugin.pkg: directory

是一个文件夹,进去:

$ cd cmbsecurityplugin.pkg; ls -l
total 304
-rw-r--r--  1 havee  staff   36348 12 25  2012 Bom
-rw-r--r--  1 havee  staff     216 12 25  2012 PackageInfo
-rw-r--r--  1 havee  staff  114278 12 25  2012 Payload

对三个文件分别查看下类型:

$ file Bom
Bom: Mac OS X bill of materials (BOM) file
$ file PackageInfo
PackageInfo: ASCII text
$ file Payload
Payload: gzip compressed data, from Unix

可以看到,三个文件中 Payload 文件是一个 gzip 压缩包,解开看下:

$ tar xvf Payload
x .
x ./._.DS_Store
x ./CMBSecurity.plugin
x ./CMBSecurity.plugin/Contents
x ./CMBSecurity.plugin/Contents/embedded.provisionprofile
x ./CMBSecurity.plugin/Contents/Info.plist
x ./CMBSecurity.plugin/Contents/MacOS
x ./CMBSecurity.plugin/Contents/MacOS/CMBSecurity
x ./CMBSecurity.plugin/Contents/Resources
x ./CMBSecurity.plugin/Contents/Resources/en.lproj
x ./CMBSecurity.plugin/Contents/Resources/en.lproj/InfoPlist.strings
x ./Contents
x ./Contents/_CodeSignature
x ./Contents/_CodeSignature/CodeResources
x ./Contents/embedded.provisionprofile
x ./Contents/Info.plist
x ./Contents/MacOS
x ./Contents/MacOS/CMBSecurity
x ./Contents/Resources
x ./Contents/Resources/en.lproj
x ./Contents/Resources/en.lproj/InfoPlist.strings

OK,至此,我们得到了招商银行大众版网银插件 CMBSecurity.plugin,直接复制到 ~/Library/Internet Plug-Ins/ 目录下即可。

总结下,三步走:

$ pkgutil --expand "name.pkg" "name"
$ cd name/package.pkg/
$ tar xvf Payload

当然,有些 pkg 会附带证书、启动 plist 文件等等,需要具体情况具体分析。

----------------------------------------------------------------------------------

OS X下,卸载 pkg 包

以下所说的只适用于 OS X Yosemite 下,之前的版本不做考虑。

一、准备

首先,安装的 pkg 软件包,都记录在以下

/Library/Receipts/InstallHistory.plist
/private/var/db/receipts

下面介绍的是一个命令工具:pkgutil

$ pkgutil -h
Usage: pkgutil [OPTIONS] [COMMANDS] ...

Options:
  --help                 Show this usage guide
  --verbose, -v          Show contextual information and format for easy reading
  --force, -f            Perform all operations without asking for confirmation
  --volume PATH          Perform all operations on the specified volume
  --edit-pkg PKGID       Adjust properties of package PKGID using --learn PATH
  --only-files           List only files (not directories) in --files listing
  --only-dirs            List only directories (not files) in --files listing
  --regexp               Try all PKGID arguments as regular expressions

Receipt Database Commands:
  --pkgs, --packages     List all currently installed package IDs on --volume
  --pkgs-plist           List all package IDs on --volume in plist format
  --pkgs=REGEXP          List package IDs on --volume that match REGEXP
  --groups               List all GROUPIDs on --volume
  --groups-plist         List all GROUPIDs on --volume in plist format
  --group-pkgs GROUPID   List all PKGIDs in GROUPID
  --files PKGID          List files installed by the specified package
  --lsbom PKGID          List files in the same format as 'lsbom -s'
  --pkg-groups PKGID     List all GROUPIDs that PKGID is a member of
  --export-plist PKGID   Print all info about PKGID in plist format
  --verify PKGID         Verify file permissions of the specified package
  --repair PKGID         Repair file permissions of the specified package
  --pkg-info PKGID       Show metadata about PKGID
  --pkg-info-plist PKGID Show metadata about PKGID in plist format
  --file-info PATH       Show metadata known about PATH
  --file-info-plist PATH Show metadata known about PATH in plist format
  --forget PKGID         Discard receipt data for the specified package
  --learn PATH           Update --edit-pkg PKGID with actual metadata from PATH

File Commands:
  --expand PKG DIR       Expand the flat package PKG to DIR
  --flatten DIR PKG      Flatten the files at DIR as PKG
  --bom PATH             Extract any Bom files from the pkg at PATH into /tmp
  --payload-files PATH   List the paths archived within the (m)pkg at PATH

二、方法

pkgutil 的帮助文件已经说明的很清楚了,步骤:

1. 查找下你需要卸载的软件包ID
$ pkgutil --pkgs
2.列出该 pkg 包含的文件列表
$ pkgutil --files PKGID
3. 检查下软件包信息,路径
$ pkgutil --pkg-info PKGID

譬如招行的插件信息

$ pkgutil --pkg-info com.cmbchina.CMBSecurityPlugin.pkg
package-id: com.cmbchina.CMBSecurityPlugin.pkg
version: 1.0
volume: /
location: Library/Internet Plug-Ins
install-time: 1401513557

从以上我们要获取的信息是,PKGID 为 com.cmbchina.CMBSecurityPlugin.pkg,在根目录 / 下的 Library/Internet Plug-Ins 目录,也就是 /Library/Internet Plug-Ins 目录下,这个下面用得到。

4. 执行删除操作

你当然可以通过 pkgutil --files PKGID 得到的文件列表,手动的去删除,我们还是读软件包的 bom 文件去删除,仍然以招行插件为例:

$ lsbom -fls  /private/var/db/receipts/com.cmbchina.CMBSecurityPlugin.pkg.bom | (cd /Library/Internet\ Plug-Ins; sudo xargs rm)
$ lsbom -dls  /private/var/db/receipts/com.cmbchina.CMBSecurityPlugin.pkg.bom | (cd /Library/Internet\ Plug-Ins; sudo xargs rm -r)

cd 路径,即第 3 步中的目录。

lsbom 的具体用法可以参考 lsbom --help

5. 最后清除包管理数据库中的pkg包信息
$ sudo pkgutil --forget PKGID

三、App

上面的都是一些基础的介绍,当然如今已经有现成的 app 可以使用,譬如 PackageUninstallerUninstallPKG,前者免费,后者收费。

参考:

 

No comments:

Post a Comment