若是咱們想遠程登陸或者控制一臺機器,能夠在被操控的設備上安裝ssh服務。不管是本地設備使用命令行仍是可視化工具都須要預先登陸到遠程設備中,登陸過程須要輸入用戶名和密碼。咱們還可使用scp
命令來實現本地設備和遠程設備之間的文件拷貝。不少操做系統好比Linux、macOS都內置了ssh服務和客戶端相關的功能。要想具體瞭解ssh能夠參考下面幾個很是有用的連接:html
由於iOS系統並無內置ssh服務,因此對於一臺越獄設備來講要想被遠程控制則須要安裝這個服務。安裝的方法就是從cydia這個應用中搜索openssh
,而後安裝便可。你也能夠參考下面兩篇教程:git
當咱們經過各類方法開發一些工具程序時,每每都須要將這些程序複製到越獄設備中去。從工具的開發到打包通常都會藉助腳原本實現,而最後的遠程文件傳輸部分由於須要登陸因此須要手動輸入用戶和密碼而沒法進行自動化處理,即便是在腳本中使用輸入重定向也是無用。這個時候咱們可使用expect來解決這個問題。github
expect是一個免費的編程工具語言,用來實現自動和交互式任務進行通訊,而無需人的干預。expect須要Tcl編程語言的支持,要在系統上運行expect必須首先安裝Tcl。shell
一個好消息就是macOS系統內置了expect。編程
你能夠從利用expect命令實現Shell自動化交互的方法詳解這篇中獲取詳細的expect腳本的使用方法。bash
聰明的你是否想到了什麼?ssh
咱們先暫停一下關於shell和expect相關的東西。編程語言
熟悉越獄開發的同窗都知道只要動態庫放到越獄設備的/Library/MobileSubstrate/DynamicLibraries/目錄中並配備一個同名的plist文件就能夠實現任意應用程序啓動時加載這些動態庫的能力。其原理在Cydia的基石:MobileSubstrate有說明。ide
你能夠藉助一些第三方工具來建立一個Tweak程序,也能夠在Xcode直接建立動態庫。方法以下:工具
選擇菜單:File -> New -> Project... -> iOS -> Cocoa Touch Static Library
系統默認建立的是靜態庫。建立成功後進入項目的Build Settings中,搜索"Mach-O Type"並將這個選項中的文件類型改成:Dynamic Library。而後再搜索"Executable Extension"並將這個選項中的內容改成dylib便可。
創建並添加一個和動態庫同名的plist文件(File->new->File...->Property List)。編輯這個plist文件,這個plist文件用於過濾加載動態庫的應用程序列表,裏面具體的格式和內容定義請參考Tweak相關的教程。
構建出動態庫的真機運行版本。
將生成的動態庫文件和對應的plist文件一同拷貝到越獄設備的**/Library/MobileSubstrate/DynamicLibraries/**目錄下,而後運行相關的應用。
上面第5步的拷貝操做,可使用scp命令完成,這須要登陸到越獄設備上。也能夠經過一些可視化界面工具來完成拷貝。
你是否但願第5步的操做經過腳原本自動完成,而無需人工的干預呢?爲了解決這個問題你是否又想到了藉助expect腳原本完成上述的功能!這就是下面要介紹的方法。
咱們在Xcode中添加expect腳原本實現無交互的遠程文件的拷貝的能力,從而快速的安裝和運行Tweak插件。這個腳本不能添加到Build Phases中,由於動態庫的簽名是最後執行的一步操做,是在Build Phases中的指定的腳本執行後才進行。所以只能將腳本添加到Scheme 中的Post actions中,在這裏添加腳本的好處在於能夠在構建完成後執行特定的腳本。具體的處理以下:
#設置幾個環境變量,這幾個環境變量其實就是用於指定plist文件和動態庫文件的路徑和名稱。
#您的應用中的路徑可能和demo中的路徑不一致,這裏須要保證路徑變量的正確設置。
set prjpath $env(PROJECT_DIR)
set prdname $env(PRODUCT_NAME)
set libprefix $env(EXECUTABLE_PREFIX)
set libpath $env(TARGET_BUILD_DIR)
set libname $env(EXECUTABLE_NAME)
#越獄設備的IP地址
set devip "172.19.212.21"
#拷貝動態庫到設備對應的目錄下去。這裏使用了expect腳本的spawn來執運行遠程文件拷貝scp命令
spawn scp $libpath/$libname root@$devip:/Library/MobileSubstrate/DynamicLibraries/
#在用戶密碼輸入處添加expect命令來指定輸入的密碼,並設定30秒的超時。
expect {
"*assword" {set timeout 30; send "alpine\r";}
"yes/no" {send "yes\r"; exp_continue;}
}
expect eof
#拷貝配置文件到設備對應的目錄下去,注意這裏的配置文件的路徑。
spawn scp $prjpath/$libprefix$prdname.plist root@$devip:/Library/MobileSubstrate/DynamicLibraries/
expect {
"*assword" {set timeout 30; send "alpine\r";}
"yes/no" {send "yes\r"; exp_continue;}
}
expect eof
複製代碼
這段腳本很容易弄懂,就是開始設置環境變量,而後執行2個文件的遠程拷貝,並指定特定的遠程登陸密碼。這裏要記住的就是要將devip改成你越獄設備上的IP地址,同時要注意plist文件的存放路徑。
爲了更好的演示經過expect腳本直接實現動態庫的注入處理,我在github中創建了一個項目:
這個項目實現的功能就是簡單的經過動態庫的注入方法,在相機應用的拍照界面按鈕上植入一個笑臉的圖標。由於這個動態庫只在相機應用啓動時才加載因此在對應的plist文件中只添加了相機應用的bundleid。
當你將工程下載後,記得將上面介紹的expect腳本處將IP地址改成某臺越獄手機的IP地址,而且確保越獄手機安裝了ssh以及MobileSubstrate。而後在編譯示例工程後打開相機應用。最終相機運行的效果以下:
本教程的越獄開發方法,只用於我的學習之用,不能用於商業目的,出現問題概不負責!!!