iOS Simulator(模擬器)是否可以越獄?為什麼?

應該是不可以的,但請詳細解釋原理,比如我知道的,模擬器並非虛擬機,而是重新按照 Darwin Kernel 編譯的,從而這個系統是個半吊子系統,與 Mac OS X 共享大多數的後台… 概念不完善,請大家補充。此 Simulator 是不是沒有「獄」?非簽名代碼都能運行?還有其他什麼是「獄」內的?


要討論能不能越獄,首先要明白 iOS 模擬器究竟有沒有「監獄」。根據我的觀察, iOS 模擬器上運行的應用程序應該沒有沙盒訪問限制,即模擬器上可以跑的代碼可以不受限制地訪問任何路徑,包括系統路徑。

舉個例子?

以前做 iOS 開發時,需要一些 UI 資源圖片,於是在 GitHub 找到了一個名為 UIKit Artwork Extractor 的開源代碼。這份代碼在模擬器上編譯運行後,就可將當前模擬器系統的所有圖片資源文件(如鎖屏界面、SpringBoard、顏文字等)保存到 OS X 系統桌面的一個文件夾上。也就是說,這份代碼沒有受沙盒限制訪問了系統所有的圖片資源文件。這個是訪問系統目錄的部分代碼:

static NSString *systemRoot()
{
static NSString *systemRoot = nil;
if (systemRoot)
return systemRoot;

// Extract images from actual firmware if mounted instead of simulator
// Use https://github.com/kennytm/Miscellaneous/blob/master/ipsw_decrypt.py
for (NSString *volumeName in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/Volumes" error:NULL])
{
NSString *volumePath = [@"/Volumes" stringByAppendingPathComponent:volumeName];
NSString *systemVersionPath = [volumePath stringByAppendingPathComponent:@"/System/Library/CoreServices/SystemVersion.plist"];
NSDictionary *systemVersion = [NSDictionary dictionaryWithContentsOfFile:systemVersionPath];
NSString *productName = [systemVersion objectForKey:@"ProductName"];
NSString *productVersion = [systemVersion objectForKey:@"ProductVersion"];
if ([productName isEqualToString:@"iPhone OS"] [productVersion hasPrefix:[UIDevice currentDevice].systemVersion])
{
NSString *wallpaperPath = [volumePath stringByAppendingPathComponent:@"/Library/Wallpaper"];
NSArray *wallpapers = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:wallpaperPath error:NULL];
NSString *model = [wallpapers count] == 1 ? [wallpapers lastObject] : @"iPhone";
if ([[UIDevice currentDevice].model hasPrefix:model])
{
systemRoot = [volumePath retain];
return systemRoot;
}
}
}

return [[[NSProcessInfo processInfo] environment] objectForKey:@"IPHONE_SIMULATOR_ROOT"] ?: @"/";
}

因此,iOS 模擬器並沒有「監獄」的概念,所以也沒有越獄這一說法。只要能搞到代碼,並且代碼正確,iOS 模擬器是不會有限制的。如果不能搞到代碼只能搞到一個刪掉簽名的 IPA 應用程序包,那不能在模擬器上運行,因為 IPA 包里的應用程序是 ARM 架構,而模擬器只是在 API 層級上進行模擬,並不是去執行真正的 ARM 機器代碼。

PS: 我有一個很二的朋友,想裝微信但沒有智能手機,於是他試圖在 PC 上裝一個虛擬機

虛擬一個 Mac,然後再裝 Xcode,最後用 Xcode 自帶的模擬器裝微信。然後,就沒有然後了......再然後,他從 PC 上裝了一個 Android 模擬器,然後在這個模擬器里安裝安卓版的微信,終於成功用上了。另外,他還不是學計算機相關專業的,怎麼想到這些的我也不知道。 = =

---

?UIKit Artwork Extractor 的 GitHub 地址:0xced/UIKit-Artwork-Extractor 路 GitHub


xCode包含的模擬器,只是能夠運行在x86環境下編譯的非簽名程序(Developer Account)

而實體機運行的是ARM環境下編譯的非簽名(Developer Account)/簽名程序(User Account)

由於無論是模擬器還是實體機,開發者賬號無需越獄即可運行任何Object-C代碼,所以只要有開發者賬號就無需越獄(也可以理解為沒任何限制)

也正因為如此,越獄開發者通常都是首先在開發者賬號中實現實體機越獄,但此階段僅用於研究漏洞,不會發布給普通用戶(因為沒意義)。

PS:如果手上有開發者賬號(Team Member賬號都行),可以直接去掉一個IPA程序的原始簽名,並使用開發者證書重新簽名後,安裝到有開發者證書的機器上,效果跟越獄無區別(例如把別人購買的Angry Bird的IPA文件原始簽名幹掉,用自己的開發證書重新簽名,再將自己手上的這台機器加入到開發者賬號中,就可以實現「免費」玩遊戲了)


推薦閱讀:

為什麼不能買蘋果第一代產品?比如 New MacBook
iOS 系統限制性很多,為什麼還有這麼多人使用 iPhone?
關於微軟2017年10月17日秋季新品發布會,你有什麼期待?
拿著iPhone的人們是不是真的很會運用iTunes?
對於 Retina Display 有哪些誤解?

TAG:iPhone | iOS | iOS越獄 | iOS開發 |