某个VPN的收费功能

0x01 介绍

iOS ■■软件,开发Tweak,技术研究。

这篇文章介绍会比较详细,作为一个入门的文章来做技术讨论(不会具体说到哪个类,但会提供一个方向性的解答)。

0x02 目标

名称:Surge

包名:com.nssurge.inc.surge-ios

版本:5.2.3

难度:容易

0x03 效果

■■前:

■■后:

0x04 目的:■■收费功能

■■之前,可以稍微想象一下如果让你来做一个收费的程序,会是怎么样?

其实也比较简单,就是:

进入收费页面 → 请求验证 → 数据返回 → 如果已经付费(返回付费之后license数据) → 校验数据 → 如果校验通过,数据写入本地(Keychain 或 UserDefault 或 Sqlite) → 内存也会保存一份凭证(用来直接查询是否是付费用户等功能)

接下来,尝试■■收费功能。

方法1: 本地方法判断修改返回值

hook本地3个函数:isProTrial、isFreeTrialAvailable、SGUPro_isProActive

hook之后确实有效果,但是后面想到了一个问题,就是直接修改内存数据可能不够完整,在数据写入阶段可能还有其他一些数据会保存(留给以后再次验证),所以这种方法后来放弃继续尝试了。

在此处键入或粘贴代码

方法2: license 直接写入keychain

想到的第二个方法就是直接写入Keychain,但是可能跟上面一样的问题,后来也是放弃了。

方法3: 伪装请求响应回来

hook里面的request,然后mock一个假的数据回去。如果你有一个真的付费帐号,返回的数据(license)会比较清楚,这里我发一个例子:

{
"license": {
"policy": "...", // 主要内容的base64编码内容
"sign": "..." // 用来验证policy的签名
},
"messages": [] // 暂时用不到
}

主要的内容在 policy 里面,存储了 deviceIDexpirationDate 等一些重要属性,返回来的就是一个字典经过base64编码的字符串而已。在这里,可以修改一些信息达到■■的目的。

接下来就是一个验证的问题,sign的具体怎么验证没具体看(应该是RSA),不过这里只要返回1就行了(1是验证成功,0是验证失败)。

到了这里,主APP的■■已经完成了。

0x05 最后

上面只是一半的■■而已,要真的开启VPN,还要■■里面的Network Extension。

■■的方法也都跟主APP差不多,只不过Network Extension里面多了个加密验证。

最后,贴上我自己■■的完整版本。

repo:codwam's Repo

1 个赞

然而 GitHub - NyaMisty/Surge4Advanced: Surge 4 Patch

我没看4的版本,手机大概看了一下代码,surge 5应该是不行的。

这东西以前patch破解过,用flex探查UI出处可以定位到检测点

要越狱肯定没什么人愿意,但是如果配合签名用就会有人愿意了,不过vpn国内做有法律风险

就你这水平还敢来评价我?笑死我了。
《surge 5应该是不行的》

附:

完全照抄我的思路还在这里装逼,你是想笑死人?

我仔细想了想你这个菜逼为什么会理解不了我如此清晰的代码。
要我猜的话,大概是因为你都不知道EVP_DigestVerifyFinal是干什么用的,也不知道RSA验证到底在哪里验证的,导致你看不懂patchfinder的代码。
看不懂就算了却要在这里装逼,何其可悲哈哈哈。

2 个赞