教你动手做一个 iOS 越狱 app
前言
俗话说得好, 万事开头难. 仅仅是上图一个如此简单地不能再简单的小app, 其实都不算是app, 只是注入了一段代码进系统中, 等到特定的函数方法调用的时候就会被我们hook掉, 执行我们写的代码, 仅此而已.
哈哈, 就是这样一个小功能, 搞得我焦头烂额了一个晚上, 所以大家不用害怕, 连我这样的菜鸟都能实现, 大家只要认真看我的总结, 就一定可以自己也动手在自己越狱iPhone, iPad上嗨起来!
ps : 为了纪念这神圣的一刻, 就算是这么简单的程序我也把它放到了我的Github上, 也算是一个里程碑吧. 还有就是万一哪天我自己忘了的时候能回头看看就能把这些知识捡回来. GitHub入口 -> 第一个越狱程序代码
https://github.com/Jerry4me/JRFirstJailBreakApp
废话不多说, 我们直入正题!
准备动作
你需要准备的是 :
一台Mac
一部已经越狱的iPhone or iPad
Theos
Xcode
Xcode Command Line Tools
dpkg
Mac
这个..就不说了吧. 再不行虚拟机也可以顶着上啊
越狱iPhone
越狱的方法网上已经有很多成熟的方法了, 我的4s用PP助手真的就接近一键越狱了. 当然这台越狱iPhone还需要配置.
安装OpenSSH
由于接着要在电脑上用命令行直接连接到手机给手机安装, 所以这里必须配置好. 方法也很简单, Cydia的主界面拉下去就有OpenSSH的配置方法了, 这里不再赘述.
ps : 友情提示以下, 配置好之后是有一个原始的root密码的, 必须修改掉, 否则容易让不安好心的人连接到你的手机.
方法如下 :
进入命令行工具
ssh root@你的手机的IP地址
passwd
修改好之后输入logout就能断开连接了
由于每次用ssh链接手机都需要输入密码比较麻烦, 有一种一劳永逸的方法, 大家可以自行Google~
安装apt与ldid
直接在Cydia搜索apt和ldid, 安装即可.
Xcode
相信做iOS开发的都有吧..这里就不再说了, 只是如果你Mac上有多个Xcode的话, 需要用以下指令指定一个Theos默认使用的Xcode
sudo xcode-select -s /Application/Xcode.app/Contents/Developer 大家根据自己实际Xcode的位置来定.
Xcode Command Line Tools
在命令行下执行xcode-select --install即可
dpkg
首先安装MacPort, 在官网下载安装就行了. 安装好之后可以通过在命令行中输入port version来查看是否安装成功.
然后输入sudo port install dpkg就能安装dpkg了, dpkg是用来把我们写的Tweak代码打包成deb的工具
ps : 越狱app安装包后缀为.deb, 而没越狱的为.ipa.
Theos
我们的主角终于上场了. 我们的代码就是用这个软件来编写.
下载Theos
export THEOS=/opt/theos 配置环境变量, 以后THEOS就相当于theos的绝对路径, 即/opt/theos
sudo git clone git://github.com/DHowett/theos.git $THEOS 从GitHub上下载Theos
配置ldid
从这里下载ldid, 把他放到/opt/theos/bin/下, 并用以下命令赋予它可执行权限
http://joedj.net/ldid
sudo chmod 777 /opt/theos/bin/ldid
解决Theos的bug
首先在Cydia中搜索安装CydiaSubstrate, 然后用iFunBox或scp等方式, 将iOS上的/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate拷贝到Mac上, 重命名为libsubstrate.dylib之后放到/opt/theos/lib/下, 替换掉无效的文件即可. (我这部Mac上lib文件夹是空文件夹).
ok, 大功告成, 我们终于可以用Theos大展拳脚啦!!!
创建Theos工程
依然是使用命令行进行创建Theos项目
/opt/theos/bin/nic.pl : 自动NIC(New Instance Creator).
然后这里会有许多个模板, 就跟Xcode我们创建项目的时候也有许多模板给我们选择, 是Command Line Tool or Single View Application …. 这里也是. 我们选择iphone/tweak这个.
Project Name : 项目名称
Package Name : 打包成deb包的名称(类似于bundle identifier)
Author/Maintainer Name : 作者名
MobileSubstrate Bundle filter : 该工程作用的对象的bundle identifier, 想hook哪个app, 就输入哪个app的bundle identifier. 例如微信有可能是com.tencent.wechat
List of application to terminate upon installation : 该tweak安装完成后需要重启的应用, 一般重启SpringBoard. (相当于重启桌面). 不用的话就输入 -
ok, 工程创建完成啦
Theos基本知识
创建完后一般会有4个文件
Makefile
Tweak.xm
control
xxx.plist
Makefile
该文件指定工程用到的文件, 框架,库等信息. 例如你的Tweak.xm文件用到了UIKit, Foundation等其他什么框架, 都在这里描述. 里面具体可以写些什么大家可以自行Google啦.
这里需要注意的是, 如果要把程序通过ssh的方式安装在手机上, 就必须在里面加一段
THEOS_DEVICE_IP = 手机的IP地址
Tweak.xm
我们写代码的文件, 后缀中的x代表这个文件支持Logos语法. m代表支持C++. 如果只有一个单独的x代表支持Logos和C, xm则支持Logos和C/C++. 跟我们的.m和.mm一个意思.
这个文件默认内容就是一个注释, 简易的指导书. 这里介绍一些我们用到的概念
%hook
%hook ClassName : 代表要hook这个类.
%hook SpringBoard
/* 这里则为你要hook的函数, 方法 */
%end
%orig
用在钩住(hook)的函数内部, 代表调用被钩住的函数的原始代码
%log
用在钩住(hook)的函数内部, 用来打印函数的类名, 参数等信息, 还可自己追加想要打印的信息.
%new
用在%hook的内部, 用于给一个现有的类添加新函数.
ps : 还有一些例如%group, %ctor, %init, %c等大家可自行Google其用法, 这里不再赘述
control
该文件记录了deb包管理系统所需的基本信息, 会被打包进deb包中.
xxx.plist
跟我们应用中的info.plist作用类似.
开始编码
由于我们的app非常小, 只是在iPhone启动SpringBoard.app完成的时候显示一个alertView而已, 所以我们的代码非常精简
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)application
{
%orig; // 调用原来的代码
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome to iPhone 4s!" message:nil delegate:self cancelButtonTitle:@"Goddamn!" otherButtonTitles:nil];
[alert show]; // 显示弹窗
}
%end
编译 + 打包 + 安装
在项目文件夹下使用make命令, 就可以编译Theos工程了. 编译完成当前目录下会多一个obj文件夹
make package命令, 打包程序. 打包成功后当前目录下会多一个package文件夹, 你的deb文件就在里边
make package install : 编译+打包+安装一条龙服务, 直接将程序编译打包后通过ssh连接的方式安装在你的手机上. 当然你也可以把deb文件先放到手机上再利用iFile或其他应用安装.
done! enjoyourself!
ps : 配置文件和代码都能在我的GitHub上找到, 有什么不懂的可以Google或者在这里留个言, 我都会尽可能快地回复, 相互学习, 共同进步! Good luck!
教你动手做一个 iOS 越狱 app的更多相关文章
- 做一个阅读管理APP
背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...
- 用 JSQMessagesViewController 创建一个 iOS 聊天 App - 第 2 部分
原文链接 : Create an iOS Chat App using JSQMessagesViewController – Part 2 原文作者 : Mariusz Wisniewski 译者 ...
- 告别收费BI!如何自己动手做一个免费的可视化数据报表还支持文档在线预览?
本人大学刚毕业目前在一家互联网公司从事产品运营工作,一季度刚过,公司需要我出一份产品运营数据报表,由于产品用户数据.订单数据等数据量太大,我希望找一款Bi产品,支持我做出一个精美的可视化报表,还可以让 ...
- 怎样做一个iOS App的启动分层引导动画?
一. 为什么要写这篇文章? 这是一个很古老的话题,从两年前新浪微博开始使用多层动画制作iOS App的启动引导页让人眼前一亮(当然,微博是不是历史第一个这个问题值得商榷)之后,各种类型的引导页层出不穷 ...
- 自己动手写一个iOS 网络请求库的三部曲[转]
代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary 开源项目:Pitaya,适合大 ...
- [js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件
这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形[已完成] 2,填充颜色和描边颜色的选择[已完成] 3,描边和填充功能的选择[已完成 ...
- 教你如何做一个优雅的Ecmascripter /转
看看这些被同事喷的JS代码风格你写过多少 殷荣桧 JavaScript 今天 现在写代码比以前好多了,代码的格式都有eslint,prettier,babel(写新版语法)这些来保证,然而,技术手段再 ...
- 【按键精灵篇】如何做一个自动打开APP进入注册页面自动输入自己手机号
按键精灵,虽然很早听过,但是一直没有真正使用过,所以最近有点时间也简单试一下,通过脚本自动清理APP缓存,打开百家号并自动进入注册页面输入自己的手机号. 软件清单 1. 雷电手机模拟器:https:/ ...
- 图标网站,IcoMoon,自己动手做一个 font
很有用的IcoMoon,在线制作工工具:https://icomoon.io/app/#/select/font 大神解说:如何灵活利用免费开源图标字体-IcoMoon篇http://www.zhan ...
随机推荐
- PhpSpreadsheet生成Excel时实现单元格自动换行
PhpSpreadsheet是PHPExcel的替代版本,PHPExcel的作者已经停止了更新,今天尝试了使用PhpSpreadsheet生成Excel的时候支持单元格内的自动换行,发现用法其实差不多 ...
- 启动Memcached报错:/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.1.so.6: cannot open shared object file: No such file or directory
1.查找文件放在哪里 sudo find / -name libevent-2.1.so.6 发现放在/usr/local/lib/libevent-2.1.so.6下. 2.创建软链接 sudo l ...
- 如何高效把一字节的位对换, bit0和bit7,bit1和bit6,以此类推.
#include<stdio.h> #include<stdlib.h> //异或法 unsigned char byteReverse(unsigned char val) ...
- 我所遭遇过的游戏中间件---SpeedTree
我所遭遇过的游戏中间件---SpeedTree SpeedTree是一个专门用于渲染植被的中间件,并提供了一套完善的植物编辑工具.在它官方提供的DEMO中,你会看到高度逼真的树木和植物,在风的影响下树 ...
- 最小均方算法(LMS Algorithm)理论及DSP实现
LMS算法可认为是机器学习里面最基本也比较有用的算法,神经网络中对参数的学习使用的就是LMS的思想,在通信信号处理领域LMS也非常常见,比如自适应滤波器. 本文主要对LMS(Least Mean Sq ...
- 《Linux总线、设备与驱动》USB设备发现机制
说明:本分析基于mstar801平台Linux2.6.35.11内核,其他内核版本仅供参考. 一.程序在内核中的位置 1.usb host做为pci总线下的一个设备存在(嵌入式系统中有可能也会直接挂在 ...
- 理解 CSS 的 z-index 属性
通常认为HTML页面是二维的,但实际上,CSS还有一个z-index属性,允许层叠元素. 所有的盒模型元素都处于三维坐标系中. 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着“z轴”层叠摆放, ...
- 【翻译自mos文章】CRS显示 正在执行的db instance 是offline状态
CRS显示 正在执行的db instance 是offline状态 转自: CRS shows Running Instance Status as OFFLINE (Doc ID 1673397.1 ...
- 如何在模板中引用参数类中的一个特定member
C++模板有很多特性需要我们去挖掘,很多新的设计模式也都与模板使用相关,我们知道模板的一个基本特性就是可以根据传入的类型产生新的类型.围绕这个特性,可以衍生出很多的其它特性,比如自动为不同的类生成st ...
- C# 中奇妙的函数–8. String Remove() 和 Replace()
http://www.cnblogs.com/multiplesoftware/archive/2011/09/27/2192710.html 当对字符串进行操作时,我们经常要删除或者是替换一部分子字 ...