感受本文涉及內容有點多的,可是本身不肯意寫太多,就簡單的謝謝關於ios上手的東西吧php
初級入手難免要用到,pp助手,i4 tools等html
iOS逆向-ipa包重簽名及非越獄手機安裝多個應用node
1.常識ios
Mach-o
可執行文件。當咱們將程序打包成
ipa
文件,上傳到App Store的時候,期間就是進行了一些加殼操做,好比:數字證書籤名等。重簽名的目的就是將別人的程序從新簽上咱們的證書信息。也能夠簡單理解爲將別人的加密文件解密,加上咱們本身的加密算法。
將下載好的ipa
包解壓縮以後,拿到裏面的Mach-o
文件,cd
到所在目錄,執行以下命令:git
3.查看應用支持架構
其中表明是否加殼,表明加殼,表明已脫殼。其實表明着該可執行文件支持兩種架構和.otool -l 可執行文件路徑 | grep cryptcryptid10armv7arm64
lipo -info 文件路徑
PP助手
、iTools
等GitHub
上開源的一些工具,經常使用的有Clutch、dumdecrypted。具體如何使用,請自行Google其實重簽名的方式有不少,好比:能夠利用sigh resign
命令,在終端下操做,還能夠藉助一些逆向相關的重簽名工具github
.ipa
或者.app
路徑 ---已經脫殼好的app 能夠從皮皮助手下載Extension
文件,因此要刪除ipa
包中包含的相應文件,包括Watch
裏面的Extension
,爲了方便通常直接將Watch
文件刪除:將對用的ipa
文件解壓,修改一些東西算法
Profile
文件,默認項Re-Sign Only
是無效的,選擇證書下存在的Profile
文件)Bundle identifier
(選擇了Profile
文件,通常會自動填寫)ipa
包 ---注意:利用iOS App Signer
重簽名,在刪除掉相應的Extension
,選擇路徑的時候,必定要選擇Payload
文件夾下對應的.app
文件,不然會報找不到Payload
文件夾的錯誤:6.安裝重簽名以後的微信緩存
能夠用PP助手安裝
,也能夠用Xcode
安安全
備註:多個證書能夠屢次從新簽名,安裝多個相同的應用微信
幾乎ipad,iPhone等對應不一樣版本偶不一樣的越獄技巧
簡單的說經過組件漏洞來進行文件控制,達到控制內核,進而提高用戶權限。
下面我簡單說幾個關鍵名詞 一下轉自http://blog.sina.com.cn/s/blog_655dac9e01017wv3.html
越獄的內部工做原理是徹底不知道的。許多人把越獄當黑匣子看待;當他們在越獄工具選項裏點擊jailbreak按鈕,認爲工做起來像魔術同樣。這是因爲對於他們所進行的越獄操做並不須要知道越獄的內部工做原理,如用戶層漏洞。
越獄的保持(Jailbreak Persistence)
依賴越獄使用的漏洞,越獄的效果可能長期的,也可能在設備關機再開啓後消失。爲了描述兩種不一樣的越獄,越獄社區把這兩種方式叫作 完美越獄(tethered jailbreak)和非完美越獄(untethered jailbreak)。
非完美越獄
完美越獄(Untethered Jailbreaks)
漏洞類型(Exploit Type)
漏洞的存在位置影響你對設備的存取級別。一些容許低級別的硬件存取。另外一些受限於沙盒內的許可權限。 由高到低
Bootrom級別 =硬件版本
iBoot級別 <=硬件版本
Userland級別 =軟件版本
理解越獄過程(Understanding the Jailbreaking Process)
,把你的iPhone設置爲設備固件升級(DFU)狀態
當你點擊Jailbreak越獄按鈕後,紅雪指導設置你的iPhone爲DFU模式,根據你鏈接上的設備,提供你可選擇的不一樣的越獄特性。你簡單選擇你的選項(如多任務手勢),點擊Next繼續按鈕,等待紅雪完成它的工做。
從用戶角度看這是很是簡單的過程,可是這這些操做後面發生了不少事情,而且除了越獄社區的少數人,沒人真的知道發生了什麼。當你讀完下面章節後,你將成爲了解紅雪內部工做的少數人之一。
經做者的容許,下面章節的全部信息都來自一個反編譯版本的紅雪越獄。因爲A5處理器的iPad2或iPhone 4S設備沒有一個公開知曉的bootrom漏洞,這些設備的全部越獄必須是用戶層面級別的。 這表示bootrom破解和啓動ramdisk的頭兩個步驟必須由MobileSafari漏洞和一個內核漏洞替代,其他的越獄過程工做是同樣的。
破解Bootrom(Exploiting the Bootrom)
紅雪的越獄開始時利用the limera1n 的DFU bootrom漏洞來使在高權限級別執行代碼成爲可能。這個漏洞是一個前A5處理器設備的bootrom中USB DFU堆棧中的基於堆的緩衝區溢出漏洞。咱們這裏不討論漏洞的細節。若是感興趣,你能夠在諸如THEiPHONEWiKi(http://theiphonewiki.com/wiki/index.php?title=Limera1n_Exploit)的一些地方找到這個漏洞的說明和源代碼。
對越獄來講,你惟一須要知道的是這個漏洞用來給bootrom裏的簽名驗證代碼打補丁修改,容許你啓動專門的ramdisk,給Low-Level-Bootloader (LLB)、 iBoot和內核的版本打補丁。 Chronic Dev Team團隊已在GitHub(https://github.com/Chronic-Dev/syringe)上釋放了一樣執行效果的源代碼。因爲紅雪沒有公開源代碼,若是你想重頭編寫本身的越獄工具,這些代碼是一個很好的起點。
啓動Ramdisk(Booting the Ramdisk)
紅雪利用 limera1n 漏洞啓動一個打補丁修改過的內核和一個預先定製的ramdisk。內核被打了一些越獄補丁以便容許執行未簽名的代碼。然而,它並沒包括在已完美越獄的系統中發現全部內核補丁。依據用戶在越獄時設置的開關選項,ramdisk在每次運行時都在根目錄建立不一樣的文件,造成定製的ramdisk。這些文件的存在在晚些時候會被ramdisk上的越獄執行過程檢測到,以此決定紅雪的哪一種特性被激活。例如noUntetherHacks文件的存在會使紅雪跳過完美越獄漏洞的安裝。
ramdisk啓動時,內核會運行 ramdisk的/sbin/launchd的二進制文件,它包括一個初始化越獄的小型stub程序。這個程序首先在系統裏裝載root根文件系統和數據分區,爲修改須要,以上裝載好的文件系統和數據分區是可讀寫。最終,一個越獄的執行程序會接管並執行全部接下來的步驟。
越獄文件系統(Jailbreaking the Filesystem)
iPhone的文件系統缺省分紅2個分區,第一個分區是root根文件系統,存放iOS的操做系統文件和如MobileMail,MobileSafari的標準應用程序集。早期的iOS版本里,root根文件系統的大小接近分區的容量大小,分區沒有多少剩餘空間。雖然root文件系統是假設爲不可修改的,分區也缺省裝載爲只讀的,但現在root根文件系統接近1GB大小,分區有200MB左右空間剩餘。設備的其他存儲空間分配給第二個分區,即數據分區,它裝載在/private/var目錄下,能夠讀寫。在根目錄的 /etc/fstab文件裏有如下配置:
/dev/disk0s1 / hfs ro 0 1
/dev/disk0s2 /private/var hfs rw,nosuid,nodev 0 2
你能夠看到,數據分區的裝載配置文件有 nodev 和nosuid標誌。爲了防止文件系統層面的攻擊,nodev標誌是確保設備節點在可寫的數據分區裏的存在將會被忽略。nosuid標誌是告知內核在數據分區裏執行時忽略suid位。suid位表示執行時須要以超級用戶root身份執行,或與當前用戶不一樣的一個用戶來執行。這些標誌都是iOS內部用來防止權限提高漏洞的防護措施。
無論是bootrom級別,仍是用戶層面級別的漏洞,這個缺省的配置是全部越獄面臨的難題。由於他們一般須要對root根文件系統進行修改,使程序在設備重啓後還能存在,或能增長服務和守護進程。因此每次越獄得到超級用戶root的權限後的第一個動做就是從新裝載root根文件系統,使之可讀可寫。爲了使設備重啓後修改也生效,下一個步驟就是用下面相似的配置替換系統的/etc/fstab文件:
/dev/disk0s1 / hfs rw 0 1
/dev/disk0s2 /private/var hfs rw 0 2
這個新的文件系統的配置文件將裝載root根目錄文件爲可讀可寫,並從第二個分區的裝載配置中移去nosuid和nodev標誌。
安裝完美越獄破解(Installing the Untethering Exploit)
每次當一個新版本的iOS出現,原先的已知漏洞就被修復了。 因此在一個有限的時間窗口裏,紅雪在老設備上能越獄新的固件,但不能安裝完美越獄漏洞。
一旦獲得了一個新的完美越獄漏洞,紅雪的做者就會修改程序來安裝新的漏洞。 因爲每一個漏洞都是不一樣的,因此都須要不一樣的安裝步驟。
雖然實際的完美越獄漏洞安裝是不一樣的,但都是在root根文件系統裏重命名和移動一些文件,並拷貝一些文件到它上面。當你反編譯當前的紅雪軟件版本,你會發現它從4.2.1到5.0.1的大部分iOS版本上都支持安裝完美越獄漏洞,發現每一個完美越獄漏洞須要那些文件。
安裝 AFC2服務(Installing the AFC2 Service)
蘋果文件鏈接 (AFC)是一個運行在每臺iPhone上的文件傳送服務,它容許你經過USB連線存取iPhone的/var/mobile/Media的目錄裏的文件。AFC服務由lockdownd守護進程提供,被命名爲com.apple.afc 。但lockdownd守護進程只提供存取服務,實際由afcd守護進程實現。在MAC上經過MobileDevice.framework,在Windows PC上經過 iTunesMobileDevice.dll來使用。
afcd還提供lockdownd的第二個服務,它註冊爲com.apple.crashreportcopymobile。它用來從設備向電腦複製CrashReporter報告,並只限制於/var/mobile/Library/Logs/CrashReporter目錄和子目錄的讀寫存取 。
因爲這些服務運行於mobile用戶的許可權限下,被鎖定於特定目錄下,他們對於越獄的做用是受限的。因此紅雪和其餘越獄工具向lockdownd註冊了一個額外的服務,叫作com.apple.afc2。這個服務利用afcd守護進程提供對整個文件系統的root超級用戶權限的讀寫存取,這是一個大部分用戶都不知道的至關危險的越獄特性。這意味着一臺沒有密碼保護或在未鎖定狀態的越獄過的iPhone,只要鏈接上一個USB充電站或其餘人的電腦,就給了另外一方在沒有用戶交互下的整個文件系統的讀取存取權限。他們能夠竊取你的全部數據或安裝系統後門。
com.apple.afc2服務經過更改在/System/Library/Lockdown/Services.plist文件裏的lockdownd配置來安裝。這是一個正常的.plist 文件,能夠經過 .plist文件的標準工具或API來修改。
安裝基本程序庫(Installing Base Utilities)
應用程序隱藏(Application Stashing)
當從蘋果的應用程序商店安裝應用時,它們被安裝在/var/mobile/Applications目錄裏,該目錄駐留在iPhone的大容量的數據分區裏。能夠安裝的應用程序的數量依賴於數據分區的空閒空間。空閒空間一般有上GB 容量,因此對安裝應用程序數量來說不是真正的限制.
Cydia是越獄者製作的至關於蘋果AppStore的應用程序商店,經過Cydia下載的越獄應用的安裝地點是不一樣的。像Cydia自身和其餘內置的二進制文件安裝在root根目錄的/Application目錄下。前面提到,root根文件系統的容量取決於固件的版本、容量和設備類型。一般在1GB和1.5GB之間,有大約200MB的空閒,這點容量對安裝應用程序來講是很少的。
另外,牆紙和鈴聲也存放在根目錄的 /Library/Wallpaper 和 /Library/Ringtones目錄下,因此從Cydia安裝的每一個牆紙和鈴聲也也會佔用掉有限的應用程序空間。
爲解決這個問題,各類越獄都實現了應用程序隱藏技術。它是在iPhone的數據分區建立了/var/stash的新目錄,並把一些正常狀況下位於root根文件系統下的應用程序移到/var/stash目錄下,原來的目錄替換爲連接到新目錄的符號連接。
如下清單是經過程序隱藏轉移到/var/stash下的目錄:
然而,不是全部的越獄工具和全部版本的越獄工具都進行應用程序隱藏。由於這樣,Cydia建立時在第一次調用時會進行檢測,這是Cydia裏的從新組織文件系統(「Reorganizing Filesystem」)的耗時較長的步驟。
安裝程序包 (Bundle Installation)
安裝後過程(Post-Installation Process)
內核payload。
執行內核Payloads並修改內核(Executing Kernel Payloads and Patches)
雖然每一個內核漏洞和每一個payload是不一樣的,但能把越獄所用的內核級的payload分爲爲4個部分:
(1)修復內核狀態Kernel State Reparation
(2)權限提高Privilege Escalation
(3)修改內核Kernel patching
(4)清理並返回Clean return
接下來的章節對他們進行詳細描述
修復內核狀態(Kernel State Reparation)
權限提高(Privilege Escalation)
因爲iPhone上的全部應用程序的都以權限較少的用戶(如mobile,_wireless,_mdsnresponder,_securityd)角色運行,一個內核漏洞的payload執行後,一般要把應用程序的運行進程的權限提高到root超級用戶權限。 若是少了這一步驟,有些操做是不可能完成的的,像從新裝載root根文件系統到可寫狀態,或修改屬於root超級用戶的文件。全部這些在越獄的初始安裝時都時須要的。只用於完美越獄的重啓後執行的內核漏洞不須要這一步驟,由於一般已經已root超級用戶角色運行。
在內核內部,提高當前運行進程的權限是很容易的。只須要修改進程的proc_t結構的信用值。這個結構在XNU源代碼的/bsd/sys/proc_internal.h文件的proc結構裏定義。依據不一樣的內核漏洞payload開始運行方法的不一樣,取得當前進程的proc_t結構的指針的方法是不一樣的。在之前公開的許多iOS內核漏洞裏,用於覆蓋系統調用表裏的系統調用程序的地址的辦法是不一樣的。內核漏洞的payload由調用被覆蓋的系統調用來觸發。在這種狀況下,它得到的proc_t結構是微不足道的,由於它是系統調用程序的第一參數。
獲得proc_t結構的地址的更通用的方法是調用current_proc()內核函數,它能取回這個結構的的地址。這個函數是一個內核輸出的符號,很容易找到。因爲剛開始的內核漏洞能檢測使用的內核版本,而且內核裏沒有地址隨機化,因此它能夠把函數的地址硬編碼到內核漏洞裏。
取到proc_t結構的地址的第三個方法是使用經過sysctl接口泄露的內核地址信息。這項技術是由noir在破解OpenBSD內核的過程當中首先發表的(詳見www.phrack.org/issues.html?issue=60&id=06),並被nemo用於XNU內核(詳見www.phrack.org/issues.html?issue=64&id=11)。這個泄露的信息容許用戶態進程經過一個簡單的sysctl系統調用取到proc結構的內核地址。
在取到進程proc_t結構的地址後,結構裏的p_ucred成員用來修改鏈接的ucred結構。 這個元素能夠經過proc_ucred()函數讀取,或直接讀取。下面的反彙編代碼代表在當前iOS版本里結構裏p_ucred域的偏移量是0×84.
_proc_ucred:
LDR.W R0, [R0,#0x84]
BX LR
在/bsd/sys/ucred.h文件裏有ucred結構的定義。結構裏還包含擁有這個結構的進程的用戶ID和組ID。
struct ucred {
TAILQ_ENTRY(ucred) cr_link;
u_long cr_ref;
struct posix_cred {
uid_t cr_uid;
uid_t cr_ruid;
uid_t cr_svuid;
short cr_ngroups;
gid_t cr_groups[NGROUPS];
gid_t cr_rgid;
gid_t cr_svgid;
uid_t cr_gmuid;
int cr_flags;
} cr_posix;
struct label *cr_label;
struct au_session cr_audit;
};
爲了提高擁有這個結構的進程的權限,結構偏移量0x0c處的cr_uid域被設置爲0。如你預料的,偏移量是0x0c,而不是0×08,是由於一個TAILQ_ENTRY條目是8byte的。固然,其餘元素也能被修改。然而一旦uid值等於0,用戶態的進程就能利用系統調用更改它的許可權限。
修改內核(Kernel Patching)
內核級payload最重要的部分是對內核代碼和數據進行內核級別的修改,使安全功能失效,
然而,接下來的章節向你介紹這些補丁和它們背後的原理,你能夠用它們來開發你本身的內核修改補丁,運用於將來的iOS版本。
security.mac.proc_enforce變量
security.mac.proc_enforce是個系統調用變量,它控制着是否在進程操做中使能MAC策略。變量禁止時,各類進程策略檢查和限制就被關掉了。例如,對fork(), setpriority(), kill() 和 wait() 系統調用的限制。 除此之外,這個變量還控制着代碼簽名blob的數字簽名是否合法。變量禁止時,代碼簽名blob的數字簽名是非法的二進制代碼也能夠被執行。
內核的cs_enforcement_disable變量
/osfmk/vm/vm_fault.c文件的頁錯誤處理程序的源代碼裏有一個cs_enforcement_disable變量,它控制着頁錯誤處理程序的代碼簽名是否起做用。
AMFI模塊的cs_enforcement_disable變量
只有在一些咱們知道的未公開的越獄裏proc_enforce標誌沒有更改,在這種狀況下,補丁是有效的。
PE_i_can_has_debugger函數
iOS內核有一個PE_i_can_has_debugger()函數,內核和一些內核擴展裏都用它來決定是否容許調試。在一些iOS內核擴展裏設置調試啓動參數會引發內核錯誤。因此當前的大部分越獄再也不修改這個函數代碼,而是修改內核裏的debug_enable 變量。爲了肯定這個變量的地址,必須分析PE_i_can_has_debugger()函數的代碼。由於這個變量位於一個未初始化的數據段裏,修改只能在運行時進行。爲了查找啓動時初始化這個變量的代碼,須要搜索debug-enabled字符串,能夠直接找到把值複製到變量的代碼。
vm_map_enter函數
當內存映射到進程的地址空間時,內核函數vm_map_enter()被用於分配一段虛擬地址映射。
vm_map_protect函數
vm_map_protect() 是內核函數,它在映射內存的保護改變時被調用。
由於這個修改,越獄減弱了iOS設備的內存保護。咱們建議當用戶想運行須要修改自身代碼的應用程序時才進行這個補丁修改。這些修改的問題是禁止了非執行內存的限制,以至對iPhone應用程序的遠程攻擊不須要實現百分百的ROP操做。相反,這些攻擊或惡意程序只須要一個利用 mprotect()函數來注入執行代碼的簡短的ROP stub。
AMFI二進制信任緩衝區(AMFI Binary Trust Cache)
AMFI內核模塊負責檢查簽名代碼blob的數字簽名的合法性。它註冊了一些MAC的策略處理句柄,如vnode_check_signature鉤子,它在每次內核增長一個新的簽名代碼blob時都會被調用;AMFI處理程序對來自蘋果的證書驗證簽名。
0號進程任務陷阱(Task_for_pid 0)
雖然這個補丁修改對大部分越獄者都是沒有必要的,咱們把它記錄下來是由於它涉及一個mach陷阱,下面咱們會向你介紹一種在iOS二進制內核裏尋找mach陷阱表(mach_trap_table)的策略。
task_for_pid()是一個mach陷阱,會返回另外一個進程的任務端口,以它的進程ID命名。這侷限於用戶ID相同的進程,除非請求任務端口的進程是特權的。
修改沙盒 (Sandbox Patches)
Comex的內核修改補丁的最後一步就是改變沙盒的行爲。沒有這個修改補丁,越獄過的iPhone不能運行相似MobileSafari 和 MobileMail的應用程序。由於越獄後/Applications 目錄已經移到/var/stash/Applications目錄了,這違反了沙盒機制。 奇怪的是目前咱們只知道這兩個應用程序受影響。即便沒有修改沙盒,其餘全部的內置應用程序看起來都能完美運行。
這個修改補丁包括兩塊:第一塊是用鉤子(hook)覆蓋sb_evaluate()函數的開始部分;第二塊是在內核裏的未用區域寫入新代碼。這個函數的更多信息,能夠回顧第5章。這個修改補丁改變了沙盒仿真的修爲,去存取處理不一樣的特定的目錄。
在描述新的仿真功能前,因爲沒有符號表可用,咱們要找到在內核代碼裏定位sb_evaluate()函數的方法。一個可能性是在沙盒內核擴展裏搜索mac策略處理程序表。一些mac策略處理程序會用到sb_evaluate()函數。當前的iOS內核裏很容易搜索到錯誤操做碼的字符。由於只能在你的函數裏使用它,一旦找到它的數據引用,你要找到它所用的函數的開始的地方。
定位到sb_evaluate()函數的地址後,能夠給它安裝一個鉤子函數,讓它跳轉到一個內核未使用的區域,在那裏你能夠放置其他代碼。咱們在第9章裏已經討論過如何找到未用的區域。在comex的GitHub程序庫裏能夠找到datautils0程序的源代碼,它模擬了鉤子的功能,咱們如今要仔細研究它。代碼的整體想法是對/private/var/mobile和private/var/mobile/Library/Preferences裏的文件避免進行沙盒檢查。代碼開始時檢查提供的vnode是否爲0,若是爲0,不調用鉤子函數,只是跳過檢查,執行原來的處理程序。
清空緩存(Clearing the Caches)
清理並返回(Clean Return)
提高權限,修改安全特性,脫離內核的掌控後,惟一要作的是讓內核空間保持在清潔的狀態,防止內核不穩定或當即崩潰。一般只須要把廣泛意義上的CPU寄存器的值恢復到調用內核payload前的值,並返回保存的程序指針。萬一內核堆棧被溢出了,因爲真實的堆棧的值被溢出的緩衝區覆蓋,致使不可能恢復。這種狀況下,能夠返回一個未被破壞的之前的堆棧幀。
另外一個退出內核的辦法是調用內核的thread_exception_return()函數。因爲這個函數在內核裏沒有符號表,須要經過模式匹配掃描和交叉引用掃描找到這個函數。當內核堆棧幀不可能回退時須要執行完當前內核線程的例外狀況,須要調用這個函數來恢復內核。所以,能夠用它來離開漏洞payload後的內核。可是,內核應該儘量經過返回正確的堆棧幀的來離開,否者,離開後內核不能保證還在穩定狀態。
以上參考:做者:czj_warrior
連接:https://www.jianshu.com/p/25e1f44c90f7
http://blog.sina.com.cn/s/blog_655dac9e01017wv3.html