是否可以更换 Mac 登录屏幕?
-
21-08-2019 - |
题
是否可以使用自定义登录窗口应用程序替换 Mac OS X 登录窗口 /System/Library/CoreServices/loginwindow.app?(看看我这样做的理由.)
恐怕我的 Cocoa 编程技能还很初级。我确实发现有趣的是,当我运行探针 CGSession (即 一个未记录的实用程序,可以执行快速用户切换) 通过执行以下操作来查看它使用的功能
nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession
链接函数之一是:
(undefined [lazy bound]) external _CGSCreateLoginSession (from ApplicationServices)
我还没有找到有关 ApplicationServices 框架的文档。我怀疑我正在深入研究服务提供商接口而不是应用程序程序员接口。
我确实发现了这个非常有趣的片段:(谷歌缓存) (直接链接到下页;似乎该网站正在进行重组),该应用程序声称即使禁用快速用户切换也可以切换到登录窗口。
#include "CGSInternal.h"
int main (int argc, const char * argv[]) {
// switch to the login window
CGSCreateLoginSession(NULL);
return 0;
}
我认为 CG 是指 CoreGraphics,并且不明白这与登录有什么关系(除了可能在当前用户的工作上放置一个登录对话框)。
即使不可能实现登录窗口的替换,我也有兴趣知道可以沿着这些思路做些什么(由不为苹果工作的人做)。
解决方案
登录窗口应用程序被定义为 launchd 配置的一部分 /System/Library/LaunchDaemons/com.apple.loginwindow.plist.
理论上,您可以用自己的登录窗口替换登录窗口,但我不知道您必须在新应用程序中做什么 - 我认为登录窗口的作用比身份验证和设置用户会话更多 - >除其他外,它看起来它正在做一些与 launchd 相关的杂务。
我编译了一个调用的应用程序 CGS创建登录会话 一旦你运行它,它就会通过旋转立方体转换到登录窗口。我想这就是它需要 CoreGraphics 的原因 - 它只是一个在最后调用注销的图形函数。
您可以尝试使用 InputManager 并查看登录窗口加载代码 -> 如果加载了代码,您可以更改登录窗口 NIB (登录窗口UI.nib)并添加一些按钮以使用用户浏览器显示新窗口。一旦学生选择了他/她自己的照片,您就可以在登录窗口中自动填写用户名和密码字段。
节点这都是理论,看起来 非常 脆弱且不安全。
祝你好运。
稍后编辑
请注意,这是非常不安全的,所以请小心使用 - 在尝试这个东西时,我确实用软管冲洗了我的系统几次
这是一个在登录窗口中注入代码的概念验证实现。
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <strings.h>
#include <syslog.h>
#import <Cocoa/Cocoa.h>
#include <execinfo.h>
@interface LLApp:NSApplication
@end
@implementation LLApp
- (void)run
{
syslog(LOG_ERR, "LLApp being run");
[super run];
}
@end
void my_openlog(const char *ident, int logopt, int facility);
typedef struct interpose_s
{
void * new_func;
void * orig_func;
} interpose_t;
int MyNSApplicationMain(int argc, const char ** argv);
static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose"))) = {
{ (void *) my_openlog, (void *) openlog },
};
void my_openlog(const char *ident, int logopt, int facility)
{
openlog(ident, logopt, facility);
if(!strcmp(ident, "/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow"))
{
[LLApp poseAsClass:[NSApplication class]];
}
else
{
syslog(LOG_ERR, "Ignoring unknown indent: >%s<", ident);
}
return;
}
该代码编译为:
gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa
代码加载基于插入,因此 loginwindow 的 launchd 定义必须包含一个附加条目(以在动态链接器中启用插入),即:
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>path_to/Desktop/libinterposers.dylib</string>
</dict>
其他提示
是的,你可以使用SFAuthorizationPluginView
这里在ADC <参考链路/ p>