iOS 重簽名

聲明:此文章僅是學(xué)術(shù)探討類文章,僅僅用于學(xué)習(xí)研究,也請(qǐng)讀者不要用于商業(yè)或其他非法途徑上,否則一律與筆者無(wú)關(guān)。

App簽名:

  為了確保安裝到手機(jī)上的應(yīng)用是經(jīng)過(guò)認(rèn)證的合法應(yīng)用,以期能夠根據(jù)應(yīng)用得知其發(fā)布者,蘋(píng)果制定了一個(gè)簽名機(jī)制,所有的安裝到設(shè)備中的應(yīng)用必須擁有一個(gè)合法的應(yīng)用。在正向開(kāi)發(fā)中,若是個(gè)人開(kāi)發(fā)者,需要購(gòu)買(mǎi)個(gè)人證書(shū)或者使用蘋(píng)果的個(gè)人賬號(hào)免費(fèi)證書(shū),若是企業(yè)開(kāi)發(fā)者則需要購(gòu)買(mǎi)企業(yè)證書(shū)。在App Store 上架的應(yīng)用都有蘋(píng)果證書(shū)簽名。

概述:

  在正向開(kāi)發(fā)中,通常會(huì)直接配置Xcode的簽名,而不會(huì)深究。但是在逆向中,常常需要對(duì)應(yīng)用進(jìn)行修改,這就破解了應(yīng)用本身的簽名。所以,需要重新簽名了才能將應(yīng)用安裝到非越獄的手機(jī)上,而在越獄手機(jī)上可以使用插件繞過(guò)簽名驗(yàn)證。因此,我們需要了解簽名的原理,從而更好的實(shí)現(xiàn)重簽名。

簽名原理

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

蘋(píng)果手機(jī):公鑰
App Store:私鑰

1.App上傳到App Store時(shí),蘋(píng)果公司拿到App的HASH(MD5,SHA等)值,然后用私鑰進(jìn)行加密(簽名),這時(shí)候只有手機(jī)上的公鑰才可以解密;
2.手機(jī)下載應(yīng)用安裝App時(shí),先用公鑰解密(驗(yàn)證簽名),拿到HASH值,然后將此HASH值,與要安裝的App的HASH值進(jìn)行校驗(yàn),如果App有被修改過(guò),則校驗(yàn)失敗。這樣就可以有效的保證每個(gè)App都是經(jīng)過(guò)蘋(píng)果公司官方認(rèn)證的。

image.png

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

mac電腦:私鑰M和公鑰M(電腦生成)
蘋(píng)果服務(wù)器:私鑰A
iPhone手機(jī):公鑰A

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

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

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

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

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

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

弊端:只要申請(qǐng)一個(gè)證書(shū),就可以安裝在所有的iOS設(shè)備。

最終簽名原理:

mac電腦:私鑰M和公鑰M(電腦生成)
蘋(píng)果服務(wù)器:私鑰A
iPhone手機(jī):公鑰A

蘋(píng)果為了解決應(yīng)用濫用的問(wèn)題,所以蘋(píng)果又加了兩個(gè)限制.
第一限制在蘋(píng)果后臺(tái)注冊(cè)過(guò)的設(shè)備才可以安裝.
第二限制簽名只能針對(duì)某一個(gè)具體的APP.
并且蘋(píng)果還想控制App里面的iCloud/PUSH/后臺(tái)運(yùn)行/調(diào)試器附加這些權(quán)限,所以蘋(píng)果把這些權(quán)限開(kāi)關(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ū)時(shí),我們還要申請(qǐng)一個(gè)東西!! 就是描述文件!
在開(kāi)發(fā)時(shí),編譯完一個(gè) APP 后,用本地的私鑰M對(duì)這個(gè)APP進(jìn)行簽名,同時(shí)把從蘋(píng)果服務(wù)器得到的 Provisioning Profile 文件打包進(jìn)APP里,文件名為embedded.mobileprovision,把 APP 安裝到手機(jī)上.最后系統(tǒng)進(jìn)行驗(yàn)證。

  一旦改變了應(yīng)用的二進(jìn)制文件,或者增加或者修改了應(yīng)用里的資源,應(yīng)用本身的簽名就會(huì)被破壞。如果想將修改的文件安裝到手機(jī)上,就需要對(duì)應(yīng)用重新進(jìn)行簽名。

iOS應(yīng)用有正版應(yīng)用(為破殼),越獄應(yīng)用(破殼)。

非越獄手機(jī)我們可以通過(guò)PP助手獲取破殼后的越獄應(yīng)用。

在越獄手機(jī)上我們可以通過(guò)工具對(duì)app store中的應(yīng)用就行破殼。

工具有:

dumpdecrypted

Clutch

frida-ios-dump

本篇文章以非越獄手機(jī)的環(huán)境為主。越獄手機(jī)的工具使用可以網(wǎng)上查詢,或者后續(xù)會(huì)寫(xiě)一篇相關(guān)文章。

我們今天介紹三種重簽名方法:

1.手動(dòng)重簽名

2.Xcode重簽名

3.shell腳本重簽名

準(zhǔn)備工作:

1.PP助手下載好的越獄應(yīng)用,解壓ipa包解壓得到Payload。

2.可以自己破殼得到的ipa包解壓得到Payload。

1.手動(dòng)重簽名具體操作如下:

(1).終端cd Payload目錄下

1.png

(2).終端命令查看應(yīng)用是否為一破殼。(我們下載的是越獄版,一定是破殼的)

將Payload中的WeChat可執(zhí)行文件拷貝到Payload同級(jí)目錄下執(zhí)行一下命令

命令:otool -l WeChat | grep crypt

加密標(biāo)識(shí)為0,代表沒(méi)有加密(因?yàn)橐呀?jīng)砸殼了)兩個(gè)標(biāo)識(shí)代表這個(gè)可執(zhí)行文件支持兩個(gè)架構(gòu)arm64、armv7

2.png

(3).終端命令查詢簽名情況:codesign -vv -d WeChat.app(xxxxx.app)

3.png

(4).終端命令搜索本機(jī)證書(shū):security find-identity -v -p codesigning

可以使用免費(fèi)的個(gè)人賬號(hào)即蘋(píng)果ID。

4.png

(5).刪除Sign.app包中不可重簽的文件:Plugins和Watch文件

(6).進(jìn)入Sign.app包內(nèi),對(duì)Framework文件夾下的所有framework進(jìn)行重簽名。每一個(gè)framework都要重簽名,也就是說(shuō)有幾個(gè)framework就執(zhí)行幾次下面的語(yǔ)句。這里的證書(shū)也是上面拷貝和xcode選擇的證書(shū)。

codesign -fs "iPhone Developer: xxx (XXXX)" xxx.framework

111566869284_.pic_hd.jpg

(7).使用chmod命令修改Sign.app中的可執(zhí)行文件權(quán)限(可執(zhí)行文件為二進(jìn)制文件,默認(rèn)為可執(zhí)行權(quán)限)

chmod 777 app的二進(jìn)制文件

或者

chmod +x app的二進(jìn)制文件

(8).新建一個(gè)xcode工程,選擇證書(shū),然后真機(jī)運(yùn)行一下或者Build,生成描述文件,然后找到APP包,右鍵顯示包內(nèi)容,拷貝出其中的embedded.mobileprovision描述文件留著備用。

8.png

(9).查看剛才拷貝的描述文件信息,復(fù)制entitlements下面的內(nèi)容

security cms -D -I embedded.mobileprovision

121566869829_.pic_hd.jpg

(10).新建entitlements.plist文件,并把上面那一段復(fù)制進(jìn)去。然后保存該文件,將該文件復(fù)制到Sign.app的同級(jí)目錄。

9.png

(11).在Sign.app找到info.plist,并修改其中的BundleId為manualTest的BundleId

10.png

(12).進(jìn)入Payload目錄對(duì)步驟9中的WeChat.app 使用新的描述文件進(jìn)行重簽

codesign -fs 「證書(shū)串」 --no-strict --entitlements=entitlements.plist xxx.app

11.png

(13).查看重簽名是否成功,重復(fù)步驟2。可以看到從騰訊變成我個(gè)人賬號(hào)信息,重簽名成功。

12.png

(14).壓縮Playload,更改后綴為.ipa包,即可以通過(guò)Xcode,PP助手,iTunes等安裝。

    a.如果閃退,刪除應(yīng)用,先運(yùn)行一遍上面創(chuàng)建的項(xiàng)目,然后在手機(jī)設(shè)置 通用 信任一下描述文件,再安裝生成的ipa包。

    b.如果還閃退,請(qǐng)嘗試下面使用xcode重簽名方法。

安裝成功后即可在你的設(shè)備上看到2個(gè)微信了

WechatIMG7.jpeg

總結(jié)手動(dòng)重簽名步驟:

(1).終端cd Payload目錄下

(2).終端命令查看應(yīng)用是否為一破殼

(3).終端命令查詢簽名情況

(4).終端命令搜索本機(jī)證書(shū)

(5).刪除WaChat.app中不可重簽的文件

(6).重簽名framework

(7).授權(quán)可執(zhí)行文件

(8).拷貝embedded.mobileprovision描述文件

(9).查看embedded.mobileprovision描述文件,復(fù)制entitlements下面的內(nèi)容

(10).新建entitlements.plist文件,粘貼entitlements下面的內(nèi)容

(11).在WeChat.App找到info.plist,并修改其中的BundleId為textAPP的BundleId

(12).進(jìn)入Payload目錄對(duì)步驟9中的WeChat.app 使用新的描述文件進(jìn)行重簽

(13).查看重簽名是否成功,重復(fù)步驟2??梢钥吹綇尿v訊變成我個(gè)人賬號(hào)信息,重簽名成功。

(14).壓縮Playload,更改后綴為.ipa包,即可以通過(guò)Xcode,PP助手,iTunes等安裝。

2.Xcode重簽名

a.重復(fù)手動(dòng)簽名中(1)~(7)步驟??截惓觯?)步驟完成后的,Sign.app備用(xx.app)。

b.新建項(xiàng)目,工程名要和需要重簽名的xx.app名一直,這里我們創(chuàng)建的工程為SignAPP。

將1步驟中的SignAPP.app中Info.plist文件內(nèi)BundleId 改為新建項(xiàng)目的BundleId,保存?zhèn)溆谩?/p>

WechatIMG10.png

c.選擇好證書(shū)真機(jī)運(yùn)行一下或者Build一下新的項(xiàng)目,會(huì)根據(jù)證書(shū)生成app包文件,在手機(jī)中配置app證書(shū)權(quán)限 設(shè)置-通用-描述文件與設(shè)備管理-個(gè)人蘋(píng)果ID-信任應(yīng)用(驗(yàn)證app)

Show in Finder 查看新建項(xiàng)目的App包并且替換為步驟b保存的WeChat.app包。

WechatIMG14.png

d.運(yùn)行項(xiàng)目,重簽名成功。

WechatIMG9.jpeg

Xcode 重簽名總結(jié)

a.重復(fù)手動(dòng)中的如下步驟

(1).終端cd Payload目錄下

(2).終端命令查看應(yīng)用是否為一破殼

(3).終端命令查詢簽名情況

(4).終端命令搜索本機(jī)證書(shū)

(5).刪除WaChat.app中不可重簽的文件

(6).重簽名framework

(7).授權(quán)可執(zhí)行文件

b.創(chuàng)建同名項(xiàng)目。

c.替換xx.app包

d.運(yùn)行。

3.shell腳本重簽名

1.shell腳本。


# ${SRCROOT} 它是工程文件所在的目錄

TEMP_PATH="${SRCROOT}/Temp"

#資源文件夾,我們提前在工程目錄下新建一個(gè)APP文件夾,里面放ipa包

ASSETS_PATH="${SRCROOT}/APP"

#目標(biāo)ipa包路徑

TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"

#清空Temp文件夾

rm -rf "${SRCROOT}/Temp"

mkdir -p "${SRCROOT}/Temp"

#----------------------------------------

# 1\. 解壓IPA到Temp下

unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"

# 拿到解壓的臨時(shí)的APP的路徑

TEMP_APP_PATH=$(set --"$TEMP_PATH/Payload/"*.app;echo"$1")

# echo "路徑是:$TEMP_APP_PATH"

#----------------------------------------

# 2\. 將解壓出來(lái)的.app拷貝進(jìn)入工程下

# BUILT_PRODUCTS_DIR 工程生成的APP包的路徑

# TARGET_NAME target名稱

TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"

echo "app路徑:$TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH"

mkdir -p "$TARGET_APP_PATH"

cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"

#----------------------------------------

# 3\. 刪除extension和WatchAPP.個(gè)人證書(shū)沒(méi)法簽名Extention

rm -rf "$TARGET_APP_PATH/PlugIns"

rm -rf "$TARGET_APP_PATH/Watch"

#----------------------------------------

# 4\. 更新info.plist文件 CFBundleIdentifier

#  設(shè)置:"Set : KEY Value" "目標(biāo)文件路徑"

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

#----------------------------------------

# 5\. 給MachO文件上執(zhí)行權(quán)限

# 拿到MachO文件的路徑

APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`

#上可執(zhí)行權(quán)限

chmod +x "$TARGET_APP_PATH/$APP_BINARY"

#----------------------------------------

# 6\. 重簽名第三方 FrameWorks

TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"

if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];

then

for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*

do

#簽名

/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"

done

fi

2.新建工程"shell",在工程目錄下新建APP文件夾放置需要重簽名的ipa包,同時(shí)腳本復(fù)制到根目錄。

131566872544_.pic.jpg

3.Xcode的Build Phases中添加腳本

image
image

4.運(yùn)行項(xiàng)目,成功后會(huì)看到又多出一個(gè)Sign.app。

WechatIMG10.jpeg

注意:自己寫(xiě)的demo 來(lái)做腳本重簽名,那么這里的.ipa包不能直接壓縮demo的xxx.app文件,需要新建一個(gè)Payload文件夾,將xxx.app拷貝進(jìn)去,壓縮Payload文件并且更改為Payload.ipa在放入APP文件夾中,否則會(huì)提示如下錯(cuò)誤:

121566551942_.pic_hd.jpg

若果出現(xiàn)如下錯(cuò)誤,刪除app重新運(yùn)行。

image

如果運(yùn)行這個(gè)腳本報(bào)錯(cuò),需要給這個(gè)腳本執(zhí)行權(quán)限


chmod +x 腳本文件名稱

補(bǔ)充:現(xiàn)今已經(jīng)有很多重簽名工具,都是封裝了上述的方法,下面介紹兩款可視化工具和一款Xcode 插件。

可視化重簽名工具有:

ResignForiOS

Impactor

Xcode 插件:MonkeyDev

可以使用Xcode開(kāi)發(fā)CaptainHook Tweak、Logos Tweak 和 Command-line Tool,在越獄機(jī)器開(kāi)發(fā)插件,這是原來(lái)iOSOpenDev功能的遷移和改進(jìn)。

只需拖入一個(gè)砸殼應(yīng)用,自動(dòng)集成class-dump、restore-symbol、Reveal、Cycript和注入的動(dòng)態(tài)庫(kù)并重簽名安裝到非越獄機(jī)器。

支持調(diào)試自己編寫(xiě)的動(dòng)態(tài)庫(kù)和第三方App

支持通過(guò)CocoaPods第三方應(yīng)用集成SDK以及非越獄插件,簡(jiǎn)單來(lái)說(shuō)就是通過(guò)CocoaPods搭建了一個(gè)非越獄插件商店。

這是一款逆向神器,感興趣的朋友可以去GIthua中查看一下使用方法。

Xcode安裝ipa方法

Xcode安裝ipa - 簡(jiǎn)書(shū)

重要:溫馨提示,請(qǐng)不要長(zhǎng)時(shí)間使用重簽名的微信,有封號(hào)危險(xiǎn)!

重要:溫馨提示,請(qǐng)不要長(zhǎng)時(shí)間使用重簽名的微信,有封號(hào)危險(xiǎn)!

重要:溫馨提示,請(qǐng)不要長(zhǎng)時(shí)間使用重簽名的微信,有封號(hào)危險(xiǎn)!

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 最近有朋友需要幫忙用公司企業(yè)證書(shū)打包企業(yè)內(nèi)側(cè)應(yīng)用,經(jīng)過(guò)本人搜集、采坑,目前最簡(jiǎn)單、可靠地重簽名解決方案(企業(yè)證書(shū)可...
    歌白尼閱讀 9,336評(píng)論 17 16
  • 一.理解iOS簽名機(jī)制 網(wǎng)上有很多資料,這里不展開(kāi)細(xì)說(shuō),重點(diǎn)參考這三篇文章: https://www.objccn...
    huig游影閱讀 1,094評(píng)論 0 1
  • 一.理解iOS簽名機(jī)制 網(wǎng)上有很多資料,這里不展開(kāi)細(xì)說(shuō),重點(diǎn)參考這三篇文章: https://www.objccn...
    huig游影閱讀 1,277評(píng)論 0 0
  • 001你對(duì)一件事有怎樣的看法,決定著你會(huì)收獲什么樣的結(jié)果。 曾經(jīng)有3個(gè)兄弟在建筑工地砌墻。此時(shí)有個(gè)人走過(guò)來(lái),問(wèn)他們...
    tyj芯愿成真閱讀 114評(píng)論 0 0
  • 本文大量參考Thinking in java(解析,填充)。 定義:多態(tài)算是一種泛化機(jī)制,解決了一部分可以應(yīng)用于多...
    谷歌清潔工閱讀 519評(píng)論 0 2

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