Infuse PRO之密码保存
本帖最后由 nmweizi 于 2024-9-22 13:55 编辑Infuse支持 Apple 全家桶播放视频,支持所有常用格式的视频文件。同时,Infuse 还是一款剧集管理工具,能够自动下载元数据,还能保持影视资源库的整洁有序。支持网盘、ftp等文件存储。
infuse pro的破解网上已经很多了,在此不再赘述。仅就密码保存方式分析。
#### 密码保存方法
infuse使用钥匙串保存密码,当重签名后,密码不能被保存到钥匙串中,错误提示。
> 2024-05-05 18:16:34.591 Infuse OSStatus error: [-34018] Security error has occurred.
>
#### 跟踪报错,分析
可以找到是ObjC.classes.UICKeyChainStore["+ storeUsername:andPassword:forService:"]方法,用于保存用户名、密码。
跟踪这个函数调用,可以看到具体调用了
实际具体调用的函数是SecItemAdd, 其是macOS 和 iOS 系统中 Security 框架的一部分,用于将钥匙串项(如密码、证书、密钥等)添加到系统钥匙串中。
函数定义
```
OSStatus SecItemAdd( CFDictionaryRef attributes, CFTypeRef *result);
```
参数说明
> attributes 一个包含钥匙串项属性的字典(CFDictionaryRef),用于指定添加项的各种信息。包括要存储的数据类型(密码、证书等)、服务名、账号名等。
> result 一个可选参数。如果你希望返回新添加项的引用,可以传递一个指向 CFTypeRef 的指针。如果你不需要此项引用,可以传入 NULL。
#### 函数替换
既然重签名后不能使用,找到一个类似函数替换即可。
SecKeychainAddGenericPassword
定义如下
```
OSStatus SecKeychainAddGenericPassword (
SecKeychainRef keychain,
UInt32 serviceNameLength,
const char *serviceName,
UInt32 accountNameLength,
const char *accountName,
UInt32 passwordLength,
const void *passwordData,
SecKeychainItemRef *itemRef
);
```
注意事项
>权限问题:在 macOS 应用中使用此 API 时,可能需要申请适当的权限。如果应用启用了沙箱(App Sandbox),则需要在 Entitlements 文件中启用钥匙串访问权限。
>
隐私提示:当应用第一次访问钥匙串时,macOS 可能会提示用户进行授权。
调用参数
> t2 username
t3 password
t4 devicename
#### 具体实现
```
const objectForKeyedSubscript = ObjC.classes.UICKeyChainStore["+ storeUsername:andPassword:forService:"];
Interceptor.attach(objectForKeyedSubscript.implementation, {
onEnter(args) {
mylog("patch storeUsername:andPassword:forService:");
var t2 = new ObjC.Object(args);
var t3 = new ObjC.Object(args);
var t4 = new ObjC.Object(args);
passwordAdd(t4.toString(), t2.toString(), t3.toString());
mylog("run passwordAdd");
},
onLeave: function (retval) {
mylog("patch storeUsername:andPassword:forService:end");
}
})
```
passwordadd函数实现
```
mylog("serviceName:", serviceName);
var serviceNameUtf8 = Memory.allocUtf8String(serviceName);
mylog("serviceNameUtf8:", serviceNameUtf8);
var serviceNameLength = serviceName.length;
var accountNameUtf8 = Memory.allocUtf8String(accountName);
var accountNameLength = Memory.readUtf8String(accountNameUtf8).length;
var passwordUtf8 = Memory.allocUtf8String(password);
var passwordLength = Memory.readUtf8String(passwordUtf8).length;
var itemRefPtr = Memory.alloc(Process.pointerSize);
var keychainPtr = NULL;
var SecKeychainAddGenericPassword = new NativeFunction(Module.findExportByName('Security', 'SecKeychainAddGenericPassword'), 'int', ['pointer', 'uint32', 'pointer', 'uint32', 'pointer', 'uint32', 'pointer', 'pointer']);
var status = SecKeychainAddGenericPassword(keychainPtr, serviceNameLength, serviceNameUtf8, accountNameLength, accountNameUtf8, passwordLength, passwordUtf8, itemRefPtr);
```
#### 读取密码
有写就有读,读取方法同写方法类似,大家可以找找看。 本帖最后由 nmweizi 于 2024-9-23 19:05 编辑
Vvvvvoid 发表于 2024-9-23 18:45
这个api 似乎过期了
同样是 sec 打头的 为啥这个 api 没有签名要求
是Deprecated,目前还能用:lol
其实换个思路,也可以写到standardUserDefaults里,就是安全性差点。
也可以自己实现个加密逻辑写盘。 求一个Apple tv可以用的infuse pro,之前在小黄鱼上买过一次,结果用了没多久就提示要输入账号密码才能继续用了。唉 学习了,不错,感谢分享 squallzcy 发表于 2024-9-23 09:31
求一个Apple tv可以用的infuse pro,之前在小黄鱼上买过一次,结果用了没多久就提示要输入账号密码才能继续 ...
拼了一个买断的授权,一年多了了,偶尔需要track下,然后车主也很热情。目前看稳。 justlook 发表于 2024-9-23 09:33
拼了一个买断的授权,一年多了了,偶尔需要track下,然后车主也很热情。目前看稳。
羡慕有稳定车 这个api 似乎过期了
同样是 sec 打头的 为啥这个 api 没有签名要求 nmweizi 发表于 2024-9-23 18:53
是Deprecated,目前还能用
其实换个思路,也可以写到standardUserDefaults里,就是安全性差点。
也 ...
我记着 add 的 item 是个 dict , 有好几个属性;
直接当字符串存 也不太好弄 Vvvvvoid 发表于 2024-9-23 20:21
我记着 add 的 item 是个 dict , 有好几个属性;
直接当字符串存 也不太好弄
dict和字符串转换,例子挺多的。key可以用md5之类的 squallzcy 发表于 2024-9-23 14:11
羡慕有稳定车
海鲜市场应该有很多的呀。
页:
[1]
2