gpt4 book ai didi

macos - 在运行时为沙盒应用程序设置DYLD变量

转载 作者:行者123 更新时间:2023-12-01 03:49:41 28 4
gpt4 key购买 nike

我有一个使用多个系统框架和第三方框架的Cocoa应用程序,其中一些框架衍生了XPC服务。我想将自己的库插入那些XPC服务的进程空间中,以便可以将信息反馈给我的主应用程序。作为具体示例,通过插入或马赫数拦截播放正在播放的音频数据。

TL; DR:当我的应用程序启动时,如何以编程方式为沙盒应用程序设置DYLD环境变量?

较长的版本…

我可以通过在启动应用程序之前设置一些shell变量来轻松地插入库(与this question建议相反):

$ export __XPC_DYLD_FORCE_FLAT_NAMESPACE=1 
$ export __XPC_DYLD_INSERT_LIBRARIES=`pwd`/My.app/Contents/Frameworks/XpcMonitor.dylb
$ open My.app

我以为我现在有空,所以在我的应用程序启动时需要“设置”这些变量:
int main(int argc, const char * argv[])
{
NSString* libPath = [[[NSBundle mainBundle] privateFrameworksPath] stringByAppendingPathComponent:@"XpcMonitor.dylib"];
setenv("__XPC_FORCE_FLAT_NAMESPACE", "1", 1);
setenv("__XPC_DYLD_INSERT_LIBRARIES", [libPath UTF8String], 1);
return NSApplicationMain(argc, argv);
}

但这没有效果。这似乎很奇怪,因为据我所知,XPC流程尚未启动。显然,Launch Services已经决定了在到达main()之前如何处理子流程。为了确保它不在库构造函数中发生,我将所有应用程序逻辑都移到了dylib,并在设置变量后动态加载了它。相同的结果。

我尝试将它们添加到Info.plist的LSEnvironment部分。
 <key>LSEnvironment</key>
<dict>
<key>__XPC_DYLD_FORCE_FLAT_NAMESPACE</key>
<string>1</string>
<key>__XPC_DYLD_INSERT_LIBRARIES</key>
<string>/Applications/My.app/Contents/Frameworks/XpcMonitor.dylib</string>
</dict>

这可行,但是将库的绝对路径硬编码到我的应用程序中。因此,如果我的包放置在/Applications之外的其他位置,它将崩溃并显示“无法找到插入的库”消息。

我尝试将该路径更改为“@executable_path/../Frameworks/XpcMonitor.dylib”。如果我只是将一个库插入自己的应用程序(即使用DYLD_INSERT_LIBRARIES),但是找不到用于XPC服务的库,那可能是可行的,这可能是因为这些服务是具有不同路径的独立可执行文件。我尝试使用“@ rpath/XpcMonitor.dylib”并将应用程序的搜索路径设置为“@executable_path/../Frameworks”,但也未能找到该库。这里可能有一些魔术,但我一直无法弄清楚。

我尝试设置变量,然后重新启动应用程序:
 [NSTask launchedTaskWithLaunchPath:[[NSBundle mainBundle] executablePath] 
arguments:[NSArray array]];

在沙箱外部运行良好,但在沙箱内部运行失败:拒绝禁止沙箱重新初始化。

我尝试使用-[NSWorkspace launchApplicationAtURL:options:configuration:error]使用NSWorkspaceLaunchNewInstance和NSWorkspaceLaunchAsync标志重新启动应用程序,并在配置字典中传递环境变量。这在沙箱外部非常有效,但是在沙箱中时,配置字典的内容将被忽略。

我尝试了几种设置变量的方法,然后使用[NSTask launchedTaskWithLaunchPath:arguments]启动了子进程,包括一个嵌套的应用程序 bundle 包(在Frameworks,MacOS,Helpers,PlugIns中试用),以及带有和不带有 embedded Info.plist的第二个可执行文件。所有这些变体都可以运行并起作用,但是会引发一些令人担忧的沙箱错误,其中包括许多错误:
 5/30/14 9:55:04.000 AM kernel[0]: Sandbox: appleeventsd(57) deny file-read-metadata /Library

其中一些:
 5/30/14 9:55:04.000 AM kernel[0]: Sandbox: appleeventsd(57) deny mach-lookup com.apple.ocspd

最后这:
 appleeventsd[57]: <rdar://problem/11489077> A sandboxed application with pid 2119, "MyAppHelper" checked in with appleeventsd, but its code signature could not be validated ( either because it was corrupt, or could not be read by appleeventsd ) and so it cannot receive AppleEvents targeted by name, bundle id, or signature. Error=ERROR: #-67061  { "NSDescription"="SecCodeCheckValidity() returned -67061, <SecCode 0x7fa30bc0bd20 [0x7fff7b46ff00]>." }  (handleMessage()/appleEventsD.cp #2072) client-reqs-q

…并且此应用程序的Sparkle更新未通过Sparkle的预安装代码签名检查。 Spctl checkout :
 $ spctl --verbose=4 --assess --type execute ~/Desktop/MyApp.app/
/Users/Jason/Desktop/MyApp.app/: accepted
source=Developer ID

这似乎仍然是最可能成功的方法,但是我对如何设置代码签名感到困惑,要么是可以访问主应用程序的资源和框架的帮助程序可执行文件(因为整个UI都在帮助程序中),或作为子进程运行的嵌套应用程序 bundle 包。 Google搜索上述错误并没有发现我可以找到的任何有用信息,除上面链接的信息外,所有有关代码签名帮助程序可执行文件的信息均用于登录项。

(顺便说一句,我不能为此使用XPC服务,因为我需要使用大部分UI(Web View 等)来设置这些变量,并且您不能在XPC中执行UI服务)。

哇……我​​认为这就是一切,但是如果需要更多信息,请告诉我。再次如此:当我的应用程序启动时,如何以编程方式为沙盒应用程序设置DYLD环境变量? (或者根本不可能,在这种情况下,我可以怀着明确的良心将其搁置一旁,并停止令人困惑的事情?)

最佳答案

行。您有几件事不正确:

首先,Setting DYLD variables for sandboxed app at runtime答案是正确的:DYLD将限制自己处理var的原因有三个,其中一个原因是应用程序使用权利进行了代码签名(另外两个是strictBySetGUid或strictedBySegment)。之所以对您有用,是因为当时您可能没有对应用程序代码进行签名。

其次,__ XPC_ *环境变量只是普通变量的包装器,libxpc.dylib在_xpc_collect_environment中使用了它们:具体来说,检查10.10.3的代码,您将看到:

__xpc_collect_environment:
0000000000004970 pushq %rbp
....
00000000000049f7 leaq 0x1daa1(%rip), %rsi ## literal pool for: "__XPC_"
00000000000049fe callq __xpc_has_prefix

在生成xpc服务之前,变量将通过XPC传递(并启动)。产生服务时,__ XPC_前缀会被剥夺,从而再次具有DYLD_ * ..而您又回到了平方-dyld将忽略该服务是否已签名(即具有权利,因此受限制),这您的说法证实了该字典被忽略(非DYLD变量不受影响)。

而且,在启动后设置DYLD变量时,它们不再起作用。它们仅由DYLD在Mach-O负载下处理。别再困惑了。如果您找到了解决方法,那么您将偶然发现0天漏洞(尤其是DYLD_INSERT_LIBRARIES,因为它是万恶之源。)

关于macos - 在运行时为沙盒应用程序设置DYLD变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23957069/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com