背景
前几天 @9BD83913 的 Protein 被群里的暴躁老哥吐槽国行机器网络设置问题 ,于是 Lakr 就让我去看看连个锤子的实现,并把它集成到 Protein 里来做网络修复。
过程
对连个锤子简单分析可知,有两个核心类 AppWirelessDataUsageManager 和 PSAppDataUsagePolicyCache 用于管理 App 的网络权限,在 iOS 12 之后使用的是后者。
我们只需要加载特定的 PrivateFramework,然后执行相应的设置操作即可。
但这里有个问题,在 userland 去做这样的设置需要什么样的前提条件,可能是 uid 也可能是 ent,经过分析和实验发现核心问题在于 ent,我们只要给 App 签上如下的 ent 就可以操作私有类去设置 App 的网络权限了:
<key>com.apple.CommCenter.fine-grained</key>
<array>
<string>spi</string>
<string>phone</string>
<string>identity</string>
<string>data-usage</string>
<string>data-allowed</string>
<string>data-allowed-write</string>
</array>
设置方法也非常的直截了当:
[[c(PSAppDataUsagePolicyCache) sharedInstance] setUsagePoliciesForBundle:bundleId
cellular:YES
wifi:YES];
非越狱
越狱情况下可以轻易的给一个 binary 签上上面的 ent 来达到效果,非越狱则可以利用 Siguza 先前公布的 0day 结合 @ChiChou 大佬的签名脚本配合实现,iOS 13.4.5 beta 3 之前可食用。
项目在此: