正常途径下, 我们编写的程序发布在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.

iOS越狱之程序获得root权限相关推荐

  1. 看我如何利用Mac官方AppStore中的应用程序获取root权限

    一.前言 在本篇文章中,"Objective by the Sea"的演讲者Csaba Fitzl撰写了一篇有趣的方法,通过官方Mac AppStore中的应用程序来获取root权 ...

  2. 再谈Linux修改应用程序获得root权限

    我之前写过一篇关于怎样就可以使你的应用程序获得root权限运行,那个对于一些测试程序或小工程的程序时比较实用,但如果你的工程文件多达几十个甚至上百,那么这种方法就不太适用了. 在Ubuntu下面,我选 ...

  3. Android应用程序获得root权限

    我在博文<Android程序的安全系统>中提到两种让root权限的办法.最近在网上发现很多朋友转载那篇文章,但是对那篇文章中提到的第一种方法怎样实现,不是很明白.本文将会以一个例子实现来演 ...

  4. android应用程序永久获取root权限方法,怎么使Android应用程序获得root权限

    一般来说, Android 下的应用程序可以逗直接地得到的最大的权限为 system ,但是如果我们需要在程序中执行某些需要 root 权限的命令,如 ifconfig 等,就需要 root 权限了. ...

  5. Android应用程序获得root权限 基于NVidia平台Android应用修改cpu频率

    问题和目标       有时候希望在java应用程序中来使用root权限,如修改/system权限,亦或者如题. 思路和原理       这里介绍2种我已经实现的方法,但是建议使用第2种,因为第2种适 ...

  6. 如何使Android应用程序获得root权限

    写这篇文章前,首先要感谢Simon_fu,他的两篇关于root权限的文章对于我的工作起到了非常大的帮助,这篇文章可以说是对他的文章的一个补充.Simon_fu的文章可以参考如下两个网页: Androi ...

  7. Android程序获取root权限问题的最终解决与分析

          为了方便给出上一篇上一篇地址:  http://blog.csdn.net/up1up2up3/article/details/7380651,调了几天这个root权限获取问题终于搞定了, ...

  8. Android应用程序获取ROOT权限的方法

    android中如何通过代码检测是否有root权限? public class MainActivity extends Activity { @Override     protected void ...

  9. android程序root权限,android – 如何从源代码授予对特定应用程序的root访问权限而不是root权限?...

    我正在从源代码编译Android ROM,我有一个应用程序,我希望它预先安装并让它以root权限运行. 如何在不支持整个ROM的情况下授予对此特定应用程序的root访问权限? 解决方法: 希望你不需要 ...

最新文章

  1. 解决Word 2007启动时弹出“无法访问您试图使用功能所在的网络位置”的问题...
  2. poj 2777Count Color
  3. GetMemeory(char *p);GetMemeory(char **p);char* GetMemeory()用法!
  4. algorithm头文件下的常用函数
  5. Android中Service类onStartCommand
  6. 工作多年,怀才不遇你该怎么办?
  7. 系统架构设计上需要注意的
  8. 我们自身的认知可以改变吗?
  9. hdu 1698 Just a Hook
  10. hightopo学习之旅一 -- 节点动画
  11. 一篇文章带你发中文核心期刊《计算机科学》
  12. stc 串口收发 c语言,STC12C5A60S2 串口中断接收程序
  13. 数字化门店管理|如何让门店数字化管理,更加贴合日常运营细节?
  14. mysql数据库配置_mysql数据库怎么配置
  15. 多对一(Many2One)
  16. 论程序员成长中不可避免的选择,薪资与积累
  17. 2021端午大厂员工福利一览,网友:大厂爽啊。。。
  18. 2020 swapidc自适应模板v4.4.5
  19. 【matlab】华氏温度与摄氏温度转换函数
  20. GHOST系统封装教程 系统封装工具 XP系统封装(二)

热门文章

  1. android6.0 设为只充电模式,Android6.0空闲状态下低电耗模式
  2. Metasploitable3-Joker 第七个flag
  3. 生态与农田主流碳库分解模型及 CO2、CH4、N2O 排放模拟
  4. Linq学习——更新数据库操作
  5. 读邹欣老师的师生关系有感
  6. 什么是Sql Server游标
  7. SQL无法修改数据类型-解决方法
  8. 24 Hours: 小米618三平台狂揽156项第1 科创板第1股花落华兴源创
  9. 车载监控对消防有多重要?如何助力消防车辆智慧化监管?
  10. yarn 或者 pnpm 不是内部或外部命令