iphone上面编写具有root权限的程序
2013-06-21 08:34
274 查看
from: http://www.cocoachina.com/bbs/simple/?t38151.html
from:http://bbs.weiphone.com/read-htm-tid-669283.html
iphone上面编写具有root权限的程序
正常途径下, 我们编写的程序发布在App store上, 使用官方规定的SDK. 但有些时候, 正常途径实现不了的功能, 可以在破解的iphone上面实现. 以cydia上文件管理软件iFile为例, iFile可以修改系统的任何文件, 这需要iFile具有root权限, 在iphone没有破解的情况之下, 是无论如何都实现不了的. 我个人并不支持破解, 但之前接到个任务编写的一个程序只要求运行在破解了的iphone上,
以cydia方式发布, 并要有root权限, 就研究了一下.
对于iphone系统, 有两个目录会安装应用程序
1. /Application
2. /var/mobile/Applications
/var/mobile/Applications下的应用程序会有很多限制, 似乎系统会认为此目录下的程序一定会运行在沙盒中, 不管怎么设置权限也无用. /Application目录下的程序限制会小一些, 要取得root权限, 第一步就是要将程序安装在/Application目录下.
幸好有cydia. 系统破解之后, 绝大多数都会安装上cydia. 自己搭建cydia源, 第三方软件也可以通过cydia来发布. 搭建cydia源中有一步是将编译出的程序打包成deb. 打包的时候, 可以指定最终安装后的目录结构. 至于如何搭建cydia源, google一下会有详细的教程, 这里不多说, 下面已假设可以将程序安装在/Application目录下.
先简单复习一下unix的权限管理, iOS系统其实是个小的unix.
unix下面每个文件都有自己所属, 和访问权限.
比如用户complex_ok是组mobile的成员, 他登录的时候创建了一个文件A, 默认下, A就属于用户complex_ok, 组为mobile.
另外文件A还可以指定自己的访问权限, 分成用户, 组, 其它人三个级别, 三个级别都可以指定自身的 是否可读, 是否可写, 是否可执行.
比如 文件A属于用户complex_ok, 组为mobile
它的访问权限指定为 用户可读可写可执行, 组可读可写, 其他人为只读.
这个时候用户complex_ok登录的时候, 可以执行文件A, 如果用户HelloKitty, 也属于组mobile, HelloKitty对文件A可以进行读写, 但不可以执行, 而其它非同组的人, 就只读.
当我们使用iphone的时候, 我们实际上是以用户mobile, 组mobile的身份登录的. 当某文件属于root用户, 权限设为组和其它人都只读, 正常时候就不能修改这文件.
幸好unix还可以为文件的访问权限指定setuid位, 这个位很重要
比如可执行程序A, 程序也是文件, 程序A是属于root用户的. 假设用户mobile运行程序A, 如果没有为程序A设置setuid位, 程序A是以用户mobile的权限运行. 如果指定了setuid位, 就算用户是mobile, 并非root, 但因为程序A是属于root用户的, 程序A也可以以root的权限运行.
明白setuid位的作用, 似乎取得运行root权限的程序就很简单了. 比如我们也想编写自己的文件管理程序aFile, 使aFile也运行在root权限, 我们就将aFile程序的修改成属于root用户, 再将权限位设置成可执行, 并有setuid位. 使用cydia将程序安装到/Application, 用户点击iFile的图标, 这样iFile就以root权限运行了.
想法是好的, 但是这样还不行. 当用户点击程序的图标时, 是通过iphone系统调用程序的, iphone系统会有一个安全检查, 它会检查到程序将以root权限运行应用程序, 就不会执行, 你会看到程序闪一下, 就被结束了.
所以我们还需要一个间接层, 编写一个引导程序A, 再通过A调用B.
首先将A的权限设置为其它人可读可执行, B的所属设置为root, 权限设置为其它人可读可执行, 并有setuid为.
当用户点击图标, iphone系统调用程序A, 它判断出程序A并没有root权限, 正常执行, 程序A这时候去调用B, 因为B是A调用的, 程序A是我们自己写的, 并不做安全检查, 这样B有setuid位之后, 所属为root, 就可以以root执行了.
那如何使iphone系统调用引导程序A而不是调用正常程序B呢? 很简单, 改改名字就可以了.
比如你建立的工程为aFile, 正常编译出一个aFile.app文件, 右键, 显示包内容, 将里面的可执行文件aFile, 修改名字为aFile_, 再将你的引导程序改成aFile, 这样安装之后, 点击图标系统就会自动调用你的引导程序. 引导程序的编写很简单, 大体为
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* string = [[NSBundle mainBundle] pathForResource:@"aFile_" ofType:nil];
argv[0] = (char*)[string UTF8String];
execve([string UTF8String], argv, NULL);
[pool release];
return 0;
}
取得root权限后, 就可以做很多事情了, 你的程序编写时候也要小心一点.
在打包成deb时候, 可以用脚本自动修改文件权限和所属.
权限修改的命令为chmod, 所属修改的命令为chown.
from:http://bbs.weiphone.com/read-htm-tid-669283.html
iphone上面编写具有root权限的程序
iphone上面编写具有root权限的程序正常途径下, 我们编写的程序发布在App store上, 使用官方规定的SDK. 但有些时候, 正常途径实现不了的功能, 可以在破解的iphone上面实现. 以cydia上文件管理软件iFile为例, iFile可以修改系统的任何文件, 这需要iFile具有root权限, 在iphone没有破解的情况之下, 是无论如何都实现不了的. 我个人并不支持破解, 但之前接到个任务编写的一个程序只要求运行在破解了的iphone上,
以cydia方式发布, 并要有root权限, 就研究了一下.
对于iphone系统, 有两个目录会安装应用程序
1. /Application
2. /var/mobile/Applications
/var/mobile/Applications下的应用程序会有很多限制, 似乎系统会认为此目录下的程序一定会运行在沙盒中, 不管怎么设置权限也无用. /Application目录下的程序限制会小一些, 要取得root权限, 第一步就是要将程序安装在/Application目录下.
幸好有cydia. 系统破解之后, 绝大多数都会安装上cydia. 自己搭建cydia源, 第三方软件也可以通过cydia来发布. 搭建cydia源中有一步是将编译出的程序打包成deb. 打包的时候, 可以指定最终安装后的目录结构. 至于如何搭建cydia源, google一下会有详细的教程, 这里不多说, 下面已假设可以将程序安装在/Application目录下.
先简单复习一下unix的权限管理, iOS系统其实是个小的unix.
unix下面每个文件都有自己所属, 和访问权限.
比如用户complex_ok是组mobile的成员, 他登录的时候创建了一个文件A, 默认下, A就属于用户complex_ok, 组为mobile.
另外文件A还可以指定自己的访问权限, 分成用户, 组, 其它人三个级别, 三个级别都可以指定自身的 是否可读, 是否可写, 是否可执行.
比如 文件A属于用户complex_ok, 组为mobile
它的访问权限指定为 用户可读可写可执行, 组可读可写, 其他人为只读.
这个时候用户complex_ok登录的时候, 可以执行文件A, 如果用户HelloKitty, 也属于组mobile, HelloKitty对文件A可以进行读写, 但不可以执行, 而其它非同组的人, 就只读.
当我们使用iphone的时候, 我们实际上是以用户mobile, 组mobile的身份登录的. 当某文件属于root用户, 权限设为组和其它人都只读, 正常时候就不能修改这文件.
幸好unix还可以为文件的访问权限指定setuid位, 这个位很重要
比如可执行程序A, 程序也是文件, 程序A是属于root用户的. 假设用户mobile运行程序A, 如果没有为程序A设置setuid位, 程序A是以用户mobile的权限运行. 如果指定了setuid位, 就算用户是mobile, 并非root, 但因为程序A是属于root用户的, 程序A也可以以root的权限运行.
明白setuid位的作用, 似乎取得运行root权限的程序就很简单了. 比如我们也想编写自己的文件管理程序aFile, 使aFile也运行在root权限, 我们就将aFile程序的修改成属于root用户, 再将权限位设置成可执行, 并有setuid位. 使用cydia将程序安装到/Application, 用户点击iFile的图标, 这样iFile就以root权限运行了.
想法是好的, 但是这样还不行. 当用户点击程序的图标时, 是通过iphone系统调用程序的, iphone系统会有一个安全检查, 它会检查到程序将以root权限运行应用程序, 就不会执行, 你会看到程序闪一下, 就被结束了.
所以我们还需要一个间接层, 编写一个引导程序A, 再通过A调用B.
首先将A的权限设置为其它人可读可执行, B的所属设置为root, 权限设置为其它人可读可执行, 并有setuid为.
当用户点击图标, iphone系统调用程序A, 它判断出程序A并没有root权限, 正常执行, 程序A这时候去调用B, 因为B是A调用的, 程序A是我们自己写的, 并不做安全检查, 这样B有setuid位之后, 所属为root, 就可以以root执行了.
那如何使iphone系统调用引导程序A而不是调用正常程序B呢? 很简单, 改改名字就可以了.
比如你建立的工程为aFile, 正常编译出一个aFile.app文件, 右键, 显示包内容, 将里面的可执行文件aFile, 修改名字为aFile_, 再将你的引导程序改成aFile, 这样安装之后, 点击图标系统就会自动调用你的引导程序. 引导程序的编写很简单, 大体为
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* string = [[NSBundle mainBundle] pathForResource:@"aFile_" ofType:nil];
argv[0] = (char*)[string UTF8String];
execve([string UTF8String], argv, NULL);
[pool release];
return 0;
}
取得root权限后, 就可以做很多事情了, 你的程序编写时候也要小心一点.
在打包成deb时候, 可以用脚本自动修改文件权限和所属.
权限修改的命令为chmod, 所属修改的命令为chown.
相关文章推荐
- iphone上面编写具有root权限的程序
- iphone上面编写具有root权限的程序
- iphone上面编写具有root权限的程序
- iphone上面编写具有root权限的程序
- 破解的iphone上, 如何编写具有root权限的程序
- 破解的iphone上, 如何编写具有root权限的程序
- 破解的iphone上, 如何编写具有root权限的程序
- 定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
- 8.9 编写函数打开文件用于输入,将文件内容读入 string 类型的 vector 容器,每一行存储为该容器对象 的一个元素。8.10 重写上面的程序,把文件中的每个单词存储为 容器的一个元素
- Delphi编写的Android程序获取Root权限实现(2015.4.15更新,支持Android 4.4)
- 编写高质量代码改善C#程序的157个建议——建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的
- python程序 添加具有root权限的 linux 用户
- Windows 上面搭建 Spark + Pycharm/idea scala/python 本地编写Spark程序,测试通过后再提交到Linux集群上
- 汇编学习笔记-实验5 编写,调试具有多个段的程序[1]
- 如何是iPad/iPhone程序满屏显示【也就是没有上面的电量条】
- 编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按
- 编写具有临时root权限的应用
- 汇编语言 实验5 编写,调试具有多个段的程序(转载)