首页 iOS.& Swift Books 高级Apple调试& Reverse Engineering

20
代码签名 由Derek Selander撰写

啊,代码签名:iOS开发人员的克星。代码签名几乎在每个IOS开发人员议程的顶端,但对代码签名工作的强烈了解对于解决问题,以及在您的开发团队中将自己建立为Lichpin。没有什么比一个人可以重新签署过时的Swift 2.2 iOS应用程序的开发者更多的东西,而不是在时间反对你时必须修复潜在数千个Swift编译器错误。

本章将为您提供代码签名的基本概述,通过您选择Open-Source IOS WordPress v10.9应用程序

在发送到iTunes Connect Store之前,您将浏览应用程序代码签名的阶段。此外,您还会重新签署WordPress应用程序,以便它可以在您自己的iOS设备上运行!

配置

要完成本章中的所有内容,您将需要许多项目。首先,你需要一个适当的 iOS.Apple开发人员帐户 to generate Provisioning Profiles. You’ll also need a physical iOS device to install the Wordpress iOS application.

您还需要抓住并安装我的 mobdevim. 命令,此处可用:

此小命令行工具执行许多事项,包括将应用程序安装到设备上,查询设备信息并在连接到IOS设备时抓取控制台日志。使用此工具使得在设备上安装iOS应用程序明显更容易,如果应用程序已错误签名,则会在设备上寻找错误。您可以通过Xcode在Xcode中安装iOS应用程序 设备和模拟器 窗口,但Xcode作者真的让这是一个痛苦的事情。

Follow the instructions on the mobdevsim repo to install the tool. Once you have mobdevim. setup, plug in your iOS device via cable and give it a test run.

mobdevim. -f

这将查询设备信息。提供它的工作,你会得到类似的东西:

Connected to: "LOLz" (c3a8533d6dc4fa74d6748a2cd935f00e1e949af1)

name    LOLz
UDID    c3a8533d6dc4fa74d6748a2cd935f00e1e949af1

State   Activated
Type    iPhone
Version 12.0.0
Number  (555) 867-5309
Region  LL/A
Battery 65%
... truncated ...

You can get a full list of the available commands by executing mobdevim. -h.

安装此命令后,并确保使用Developer帐户签署IOS应用程序的有效方法,您将全部设置本章的其余部分!

术语

为了真正欣赏代码签名的工作原理,您需要了解三个关键组件: 公共/私钥, 权利, 和 配置个人资料。你将从广度首先看,然后潜入深度的潜水。

公共/私钥

这可能是在学习代码签名过程时最难以理解的事情,因为公共/私钥引入了加密,这迅速成为知识,格式,格式化和GotChas的兔洞。

安全 find-identity -p codesigning -v
1) 2DFE888B7BD07710444C2E4A7B9847BA8B55C220 "iPhone Developer: Derek Selander (8AW8QLCX5U)"

安全 find-certificate -c "iPhone Developer: Derek Selander (8AW8QLCX5U)" -p
安全 find-certificate  -c "iPhone Developer: Derek Selander (8AW8QLCX5U)"  -p > /tmp/public_cert.cer
cat /tmp/public_cert.cer 
-----BEGIN CERTIFICATE-----
MIIFnDCCBISgAwIBAgIIFMKm2AG4HekwDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js
ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3
...
openssl x509 -in /tmp/public_cert.cer -inform PEM -text -noout

权利

嵌入(几乎)每个编译的应用程序都是一组 权利:Againt,这是一个古老的应用程序中的一个古代嵌入式,说到了什么应用程序,不能做。其他PRGGM将检查权限(或缺少REMASTS和GRANNMENTS并授予或拒绝requstcorstly。想想 能力 在Xcode中找到的部分。

codesign -d --entitlements :- /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder

配置个人资料

最后,供应配置文件是为了讨论。配置文件包括公共X509证书,批准的设备列表,以及所有嵌入到一个文件中的权利。

~/Library/MobileDevice/Provisioning Profiles/
ls ~/Library/MobileDevice/Provisioning\ Profiles/
PP_FILE=$(ls ~/Library/MobileDevice/Provisioning\ Profiles/*mobileprovision | head -1)
security cms -D -i "$PP_FILE"

探索the WordPress app

就像iOS设备上的典型调试工作流程一样,在将应用程序发送到Apple iTunes Connect Mothership之前,您必须使用配置文件编译应用程序。该配置文件包括在每一个 应用前商店 .app 以...之名 embedded.mobileProvision.。这是这个配置文件,告诉iOS申请有效并来自于您。

WORDPRESS="/full/path/to/WordPress.app/"

供应简介

找出 embedded.mobileProvision. 在WordPress应用程序内部提供配置文件并使用 安全 command on it.

安全 cms -D -i "$WORDPRESS/embedded.mobileProvision."
CERT_DATA=MIIFozCCBIu...
echo "$CERT_DATA" | base64 -D > /tmp/wordpress_cert.cer
openssl x509 -in /tmp/wordpress_cert.cer -inform DER -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 786948871528664923 (0xaebcdd447dc4f5b)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Apple Inc., OU=Apple Worldwide Developer Relations, CN=Apple Worldwide Developer Relations Certification Authority
        Validity
            Not Before: Jan 17 13:26:41 2018 GMT
            Not After : Jan 17 13:26:41 2019 GMT
        Subject: UID=PZYM8XX95Q, CN=iPhone Distribution: Automattic, Inc. (PZYM8XX95Q), OU=PZYM8XX95Q, O=Automattic, Inc., C=US
... truncated ...

嵌入式可执行文件

提供了一个应用程序包含扩展(即共享扩展,今天小部件或其他人),在此处发现了更具签名的包装捆绑包 ./plugins. 包含自己的应用程序标识符和的目录 embedded.mobileProvision. 供应配置文件。

_codesignature目录

包含在真实的iOS应用程序包(但不在模拟器中)是名为的文件夹 _codesignature. 其中包括命名的单个文件 代码源。这是一个XML Plist文件,它是在此目录中找到的每个非可执行文件的校验和。

cat "$WORDPRESS/_CodeSignature/CodeResources"  | head -10
openssl sha1 -binary "$WORDPRESS/AboutViewController.nib"  | base64

辞职WordPress应用程序

一些代号有趣的时间!

(可选)生成有效的配置文件

如果您没有符合上述要求的配置个人资料(UDID,未过期),则需要达到 //developer.apple.com/ 并创造一个新的。

安全 find-certificate -c "iPhone Developer: Derek Selander (8AW8QLCX5U)" -p > /tmp/public_cert.PEM
openssl x509 -in /tmp/public_cert.PEM -inform pem -noout -text | grep OU=
Issuer: C=US, O=Apple Inc., OU=Apple Worldwide Developer Relations, CN=Apple Worldwide Developer Relations Certification Authority

Subject: UID=V969KV7V2B, CN=iPhone Developer: Derek Selander (8AW8QLCX5U), OU=H4U46V6494, O=Derek Selander, C=US

复制供应配置文件

此时,您应该具有有效的配置配置文件,通过创建新的配置配置文件或使用现有的配置配置文件来使用该配置文件来恢复WordPress应用程序。分配 pp_path. 终端变量到配置配置文件的完整路径,您希望为此实验使用。

pp_path.=~/Downloads/Code_Signing_Example_ProvisProfile_92618.mobileprovision
cp "$PP_PATH" "$WORDPRESS/embedded.mobileProvision."

删除插件

The WordPress application has several extension applications embedded into the main app found in the ./plugins. directory. Each of these contains a unique provisioning profile with a unique application identifier. You could sign each of these extensions itself with a unique provisioning profile, but that will get way too complicated for this demo.

修改Info.Plist.

我希望您已经记住了供应配置文件的应用程序ID的名称!您需要将其插入Info.Plist的密钥 cfbundleidifier 如果您不记得它,则可以从供应配置文件查询它。

安全 cms -D -i "$PP_PATH" | grep application-identifier -A1
<key>application-identifier</key>
<string>H4U46V6494.com.selander.code-signing</string>
plutil -replace CFBundleIdentifier -string H4U46V6494.com.selander.code-signing "$WORDPRESS/Info.plist"
plutil -replace CFBundleDisplayName -string "Woot" "$WORDPRESS/Info.plist"

提取权利

你快到了!

codesign -d --entitlements :/tmp/ent.xml "$WORDPRESS/WordPress"
cat /tmp/ent.xml
安全 cms -D -i "$PP_PATH" > /tmp/scratch
xpath /tmp/scratch '//*[text() = "权利"]/following-sibling::dict' | pbcopy 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>keychain-access-groups</key>
    <array>
        <string>H4U46V6494.*</string>       
    </array>
    <key>get-task-allow</key>
    <true />
    <key>application-identifier</key>
    <string>H4U46V6494.com.selander.code-signing</string>
    <key>com.apple.developer.team-identifier</key>
    <string>H4U46V6494</string>
</dict>
</plist>

最后,签署WordPress应用程序

You now have performed all the setup. You have a valid signing identity; you have a valid provisioning profile embedded in the WordPress application at embedded.mobileProvision.; you have removed the Plugins directory; and you have the entitlements of the new provisioning profile found at /tmp/ent.xml..

codesign -f -s "iPhone Developer: Derek Selander (8AW8QLCX5U)" "$WORDPRESS"/Frameworks/*
codesign --entitlements /tmp/ent.xml -f -s "iPhone Developer: Derek Selander (8AW8QLCX5U)" "$WORDPRESS"
mobdevim. -i "$WORDPRESS"

它成功了吗?

只要你遵循了这些步骤 确切地,您将看到一个新的应用程序,其中包含wordpress标志,其中包含“woot”下面的名称!

mobdevim. -d $WORDPRESS
(lldb) run -AppleLanguages "(es)"

它失败了吗?

如果输出说“成功”,那么你很高兴。如果没有,请打开新终端窗口并执行以下操作:

mobdevim. -c | grep installd 

然后去哪儿?

本章仅划伤了代码签名的表面。那里有很多很好的内容,专注于代码签名的其他组件。

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里.

有反馈分享在线阅读体验吗? 如果您有关于UI,UX,突出显示或我们在线阅读器的其他功能的反馈,您可以将其发送到设计团队,其中表格如下所示:

© 2021 Razeware LLC

您可以免费读取,本章的部分显示为 混淆了 文本。解锁这本书,以及我们整个书籍和视频目录,带有Raywenderlich.com的专业订阅。

现在解锁

要突出或记笔记,您需要在订阅中拥有这本书或自行购买。