关于iOS9 NetworkExtension VPN API 调用问题


#1

最近在学习 iOS9 NetworkExtension VPN API ,选取了最火的两个App来参考学习,分别是 Surge 和 土豆丝(Potatso)。

其中Surge是传统OC 书写的闭源软件,Potatso是开源,swift3.0书写。

尝试用Potatso的一些思路 自己hook Surge来做一些改变。

但发现一个问题,大家都没提过。就是用ldid一对Surge 或者 Potatso 签名后,就丧失了 VPN API的调用权限。

尝试dump出二进制文件中的签名信息entitlement.plist 再通过ldid签名 也无法调用这个 API 提示

Premission denied

打印出全部error 为

(Error Domain=NEVPNErrorDomain Code=5"premession denied" UserInfo ={NSLocalized Description=premission denued})


PS 砸壳 出来的 App 越狱机能直接用,可以正常调用VPN Api 。但是只要ldid 签名后就不行了。

大家讨论下 问题出在哪里呗。


#2

先ldid -e 看看?


#3

就是用ldid -e dump 出 entitlement.plist

然后签名时用的 ldid -Sentitlement.plist (这个plist就是ldid-e dump出的文件)

一签名 App就无法调用这个VPNAPI了

ldid 与codesign 都一样。猜测签名可能覆盖了某个 调用ApI 的授权文件


人多力量大 还请大家 一起努力解决这个问题

我爬了下国外论坛,说是要向苹果写邮件申请这个特殊的授权文件

但我仅是在越狱环境下调试一下,能不能自己构建文件解决呢?


#4
<key>com.apple.private.networkextension.configuration</key>
<string>super</string>
<key>com.apple.private.network.socket-delegate</key>
<true/>
<key>com.apple.networkd.modify_settings</key>
<true/>
<key>com.apple.networkd.set_account_identifier</key>
<true/>

#5

猜测是和这个有关,建议新建一个appid,然后打开和目标app想通的所有权限,再打开相同的Capabilities,再替换bundle里的entitlement,再用这个appid的描述文件签名试试看


#6

:sweat:自己创建个工程,把VPN开关打开,就有这个entitlements的文件,跟着改改试试。现在不用申请,个人开发证书,添加使用这个框架就行了。正向可以先试试,再逆向看看。


#7

需要这个权限,之前苹果未开放,现在开发者后台都可以配置。


#8

非常感谢


#9

根据楼主的帖子 我重签名了Shadow Rocket 可以添加vpn,但是只要点连接 一直显示连接中,不知道楼主有没碰到过


#10

守护进程 可以自己构建这个 entitlement.plist 文件吗?


#11

估计是vpn plugin在被加载的时候,权限不对被系统杀死了.可以看一下日志