一、简单介绍

一看这个标题就有点诡异,接下来介绍的确实是在没有源码的情况下给一个 ipa 文件重新签名与打包。接下来的这个实验确实有点荒谬,但是作为一种以技术学习的心态来看待这个实验,应该会学习到更多,尤其是如果你没有听说过 command 文件的话。

这个实验的步骤是这样的:

  • 1、获取一个线上并已经砸壳的 ipa 文件。
  • 2、解压之后提取 .app 文件, 放于另外的空文件中。
  • 3、将我的两个脚本文件一同放入这个文件夹中,然后双击 command 文件。
  • 4、会重新生成一个 ipa 文件,那么这个新的 ipa 文件就是使用我们自己的证书重新签名之后的 ipa 包。虽然是从AppStore下载的,当从签名之后,就与我们平时的Ad Hoc包一样了。

结果图:

python 双击entry打开文件选择_python

点击 command 文件之前的文件夹

python 双击entry打开文件选择_python_02

点击 command 文件之后的文件夹

可以看到多出了一个 Target.ipa 文件,这个文件与之前的 ipa 文件的主要区别是数字签名的证书换成了我们自己的证书,这种事情往往发生在逆向开发中。当然,没什么事情不要恶意的乱搞别人的线上 APP,正向防逆向 ZTND 难搞,主要是现在防不住了。

二、核心技术细节

从上面的简单介绍中可以看出,我简单的实现了两个文件:python 与 command 文件。代码链接在文档后面。

2.1 python 文件

python 文件主要负责的是对 .app 文件进行重签名,这里里面的重签名包括两个部分 动态库的重签名与即 .app 文件本身签名。里面的代码很简单:

python 双击entry打开文件选择_python_03

总的来说就是获取所有的动态库文件,然后进行重签名,最后对 .app 文件再次重签名。

但是在文档的头部需要配置一些参数:

python 双击entry打开文件选择_签名文件_04

其中 APP 名称 与 证书编号 很好理解,接下来简单的介绍一下 签名文件的路径。

当我们使用 Xcode 打包之后,会发现在打包文件夹中会有这么一个文件 ExportOptions.plist,这个文件与打包之前的数字签名息息相关。但是对于别人的 ipa 包使用我们自己的证书打包的时候,如何获取类似这样的文件呢?

方法很简单,创建一个空的项目,将 bundle ID 改成即将打包的 bundleID 一样,然后选择成 Release 模式,选择真机设备,最后 build 一下,找到下图中的地方。

python 双击entry打开文件选择_python_05

红框框就是就是我的证书编号,下滑线就是我需要的 签名文件的路径,直接拷贝过去就行了。会发现这张图,其实就是我的 python 文件中的第二个步骤。

这样,简单的 签名文件就结束了。

2.2 command 文件

其实,我们已经看出来了,上面的 python 文件只能在终端执行,每次运行都需要先打开终端,再执行,非常麻烦。我们能否不打开终端,点击某个东西就直接执行呢。答案肯定是有的,在 Mac 电脑上就是 command 文件,在 Windows 电脑是是 bat 文件。

在上面的 python 文件中,功能仅仅是签名。在接下来的 command 文件中主要处理的是生成一个 ipa 结构的文件夹,然后在压缩成一个 ipa 文件即可。在这里还需要强调的是,这个过程可以完全在 python 中完成,也可以像【神气的 iOS 打包】中一样,使用 shell 脚本,这次使用 command 文件的主要目的是,这个文件不用调取终端,双击文件就可以直接执行。实现的代码也很少:

python 双击entry打开文件选择_签名文件_06

哥们,不要笑,我都听到你坏笑的声音了,的确这个文件我是重 MonkeyDev 中经过简单修改后的,这是技术交流,感谢作者alonemonkey。

看完了这两个文件的简单介绍,应该已经差不多理解了。这两个脚本文件的地址在这里:

UploadPackageUploadPackage

主要代码请见目录【signAndPackage】。

三、总结

主要就是将一个直接从 App Store 下载的 ipa,经过砸壳之后,使用自己的证书重新数字签名再打包。我想写这篇简书的原意:是想介绍 command 文件的强大之所在的,后来发现没有必要再次强调,本来就很强大。这种文件的功能在我们的实际工作中,能减少很多的开发流程,提高开发效率。

可借助第三方平台(如:ds.fubi.hk)获得苹果企业签名服务,这也是一个不错的办法。