若是咱们想远程登陆或者控制一台机器,能够在被操控的设备上安装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。而后在编译示例工程后打开相机应用。最终相机运行的效果以下:
本教程的越狱开发方法,只用于我的学习之用,不能用于商业目的,出现问题概不负责!!!