iOS 逆向開發(fā)11:iOS應(yīng)用簽名原理

iOS 逆向開發(fā) 文章匯總

目錄


一、代碼簽名

代碼簽名是對(duì)可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名。用來確認(rèn)軟件在簽名后未被修改或損壞的措施。和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已。

簡單的代碼簽名

  • 在iOS出來之前,以前的主流操作系統(tǒng)(Mac/Windows)軟件隨便從哪里下載都能運(yùn)行,系統(tǒng)安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等.那么蘋果希望解決這樣的問題,要保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的,怎樣保證呢?就是通過代碼簽名。

  • 如果要實(shí)現(xiàn)驗(yàn)證.其實(shí)最簡單的方式就是通過蘋果官方生成非對(duì)稱加密的一對(duì)公私鑰.在iOS的系統(tǒng)中內(nèi)置一個(gè)公鑰,私鑰由蘋果后臺(tái)保存,我們傳APP到AppStore時(shí),蘋果后臺(tái)用私鑰對(duì)APP數(shù)據(jù)進(jìn)行簽名,iOS系統(tǒng)下載這個(gè)APP后,用公鑰驗(yàn)證這個(gè)簽名,若簽名正確,這個(gè)APP肯定是由蘋果后臺(tái)認(rèn)證的,并且沒有被修改過,也就達(dá)到了蘋果的需求:保證安裝的每一個(gè)APP都是經(jīng)過蘋果官方允許的.(安裝AppStore的APP只需要一層簽名

  • 如果我們iOS設(shè)備安裝APP只從App Store這一個(gè)入口這件事就簡單解決了,沒有任何復(fù)雜的東西,一個(gè)數(shù)字簽名搞定.

  • 但是實(shí)際上iOS安裝APP還有其他渠道.比如對(duì)于我們開發(fā)者iOSER而言,我們是需要在開發(fā)APP時(shí)直接真機(jī)調(diào)試的.而且蘋果還開放了企業(yè)內(nèi)部分發(fā)的渠道,企業(yè)證書簽名的APP也是需要順利安裝的.? 蘋果需要開放這些方式安裝APP,這些需求就無法通過簡單的代碼簽名來辦到了。

蘋果的需求

那么我們來分析一下,它有些什么需求:

  • 安裝包不需要上傳到App Store,可以直接安裝到手機(jī)上.
  • 蘋果為了保證系統(tǒng)的安全性,又必須對(duì)安裝的APP有絕對(duì)的控制權(quán)
    • 經(jīng)過蘋果允許才可以安裝
    • 不能被濫用導(dǎo)致非開發(fā)APP也能被安裝

為了實(shí)現(xiàn)這些需求,iOS簽名的復(fù)雜度也就開始增加了,蘋果這里給出的方案是雙層簽名.


二、雙層代碼簽名--用于真機(jī)調(diào)試或企業(yè)簽

為了實(shí)現(xiàn)蘋果驗(yàn)證應(yīng)用的一些需求,iOS簽名的復(fù)雜度也就開始增加了,蘋果給出的方案是雙層簽名.

雙層代碼簽名簡介

???iOS的雙層代碼簽名流程這里簡單梳理一下,這也不是最終的iOS簽名原理.iOS的最終簽名在這個(gè)基礎(chǔ)上還要稍微加點(diǎn)東西.?
???首先這里有兩個(gè)角色.一個(gè)是iOS系統(tǒng) 還有一個(gè)就是我們的Mac系統(tǒng).因?yàn)閕OS的APP開發(fā)環(huán)境在Mac系統(tǒng)下.所以這個(gè)依賴關(guān)系成為了蘋果雙層簽名的基礎(chǔ).

  1. 在Mac系統(tǒng)中生成非對(duì)稱加密算法的一對(duì)公鑰\私鑰(你的Xcode幫你代辦了).這里稱為公鑰M 私鑰M . M = Mac

  2. 蘋果自己有固定的一對(duì)公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺(tái),公鑰在每個(gè)iOS系統(tǒng)中.這里稱為公鑰A , 私鑰A. A=Apple

  3. 公鑰M 以及一些你開發(fā)者的信息,傳到蘋果后臺(tái)(這個(gè)就是CSR文件),用蘋果后臺(tái)里的私鑰 A 去簽名公鑰M。得到一份數(shù)據(jù)包含了公鑰M以及其簽名,把這份數(shù)據(jù)稱為證書。

  4. 在開發(fā)時(shí),編譯完一個(gè) APP 后,用本地的私鑰 M(今后你導(dǎo)出的P12) 對(duì)這個(gè) APP 進(jìn)行簽名,同時(shí)把第三步得到的證書一起打包進(jìn) APP 里,安裝到手機(jī)上。

  5. 在安裝時(shí),iOS 系統(tǒng)取得證書,通過系統(tǒng)內(nèi)置的公鑰 A,去驗(yàn)證證書的數(shù)字簽名是否正確。

  6. 驗(yàn)證證書后確保了公鑰 M 是蘋果認(rèn)證過的,再用公鑰 M 去驗(yàn)證 APP 的簽名,這里就間接驗(yàn)證了這個(gè) APP 安裝行為是否經(jīng)過蘋果官方允許。(這里只驗(yàn)證安裝行為,不驗(yàn)證APP 是否被改動(dòng),因?yàn)殚_發(fā)階段 APP 內(nèi)容總是不斷變化的,蘋果不需要管。

有了上面的過程,已經(jīng)可以保證開發(fā)者的認(rèn)證,和程序的安全性了。 但是,你要知道iOS的程序,主要渠道是要通過APP Store才能分發(fā)到用戶設(shè)備的,如果只有上述的過程,那豈不是只要申請(qǐng)了一個(gè)證書,就可以安裝到所有iOS設(shè)備了?


三、描述文件

描述文件(Provisioning profile)一般包括三樣?xùn)|西:證書、App ID、設(shè)備UUID。當(dāng)我們?cè)谡鏅C(jī)運(yùn)行或者打包一個(gè)項(xiàng)目的時(shí)候,證書用來證明我們程序的安全性和合法性。

蘋果為了解決應(yīng)用濫用的問題,所以蘋果又加了兩個(gè)限制.

  • 第一、限制在蘋果后臺(tái)注冊(cè)過的設(shè)備才可以安裝.
  • 第二、限制簽名只能針對(duì)某一個(gè)具體的APP.(免費(fèi)賬號(hào)只能安裝3個(gè)APP,有效期為7天)

???并且蘋果還想控制App里面的iCloud/PUSH/后臺(tái)運(yùn)行/調(diào)試器附加這些權(quán)限,所以蘋果把這些權(quán)限開關(guān)統(tǒng)一稱為Entitlements(授權(quán)文件).并將這個(gè)文件放在了一個(gè)叫做Provisioning Profile(描述文件)文件中.
???描述文件是在AppleDevelop網(wǎng)站創(chuàng)建的(在Xcode中填上AppleID它會(huì)代辦創(chuàng)建),Xcode運(yùn)行時(shí)會(huì)打包進(jìn)入APP內(nèi).?所以我們使用CSR申請(qǐng)證書時(shí),我們還要申請(qǐng)一個(gè)東西!! 就是描述文件!
???在開發(fā)時(shí),編譯完一個(gè) APP 后,用本地的私鑰M對(duì)這個(gè)APP進(jìn)行簽名,同時(shí)把從蘋果服務(wù)器得到的 Provisioning Profile 文件打包進(jìn)APP里,文件名為embedded.mobileprovision,把 APP 安裝到手機(jī)上.最后系統(tǒng)進(jìn)行驗(yàn)證。



查看描述文件:

security cms -D -I embedded.mobileprovision

<?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>AppIDName</key>
    <string>XC com ztkj ----</string>
    <key>ApplicationIdentifierPrefix</key>
    <array>
    <string>885A4JY8FM</string>
    </array>
    <key>CreationDate</key>
    <date>2021-04-15T07:39:21Z</date>
    <key>Platform</key>
    <array>
        <string>iOS</string>
    </array>
    <key>IsXcodeManaged</key>
    <true/>
    <key>DeveloperCertificates</key>
    <array>
        <data>MIIFyTCCBLGgAwIBAgIQEcNVKVXyZ/c0gI1KsGASIjANBgkqhkiG9w0BAQsFADB1MUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBDZXJ0.....</data>
    </array>


    <key>Entitlements</key>
    <dict>

                <key>application-identifier</key>
        <string>885A4JY8FM.com.ztkj.----</string>

                <key>keychain-access-groups</key>
        <array>
                <string>885A4JY8FM.*</string>
        </array>

                <key>get-task-allow</key>
        <true/>

                <key>com.apple.developer.team-identifier</key>
        <string>885A4JY8FM</string>

    </dict>
    <key>ExpirationDate</key>
    <date>2021-04-22T07:39:21Z</date>
    <key>Name</key>
    <string>iOS Team Provisioning Profile: com.ztkj.----</string>
    <key>ProvisionedDevices</key>
    <array>
        <string>10c9615caae8791513aeb7c67c634fcedc0a1180</string>
        <string>23593fe6a941b68ba5ed5e8ee56ca8f30a8801b4</string>
        <string>00008020-001158EE3E04003A</string>
    </array>
    <key>LocalProvision</key>
    <true/>
    <key>TeamIdentifier</key>
    <array>
        <string>885A4JY8FM</string>
    </array>
    <key>TeamName</key>
    <string>My Name</string>
    <key>TimeToLive</key>
    <integer>7</integer>
    <key>UUID</key>
    <string>0d472f7e-f9bb-46f5-9266-02f9b1dbb557</string>
    <key>Version</key>
    <integer>1</integer>
</dict>
</plist>%

注意:這個(gè)plist文件也是經(jīng)過簽名認(rèn)證的,無法篡改



查看Mach-O簽名信息:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容