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
里面,存储了 deviceID
、expirationDate
等一些重要属性,返回来的就是一个字典经过base64编码的字符串而已。在这里,可以修改一些信息达到■■的目的。
接下来就是一个验证的问题,sign的具体怎么验证没具体看(应该是RSA),不过这里只要返回1就行了(1是验证成功,0是验证失败)。
到了这里,主APP的■■已经完成了。
0x05 最后
上面只是一半的■■而已,要真的开启VPN,还要■■里面的Network Extension。
■■的方法也都跟主APP差不多,只不过Network Extension里面多了个加密验证。
最后,贴上我自己■■的完整版本。
repo:codwam's Repo