6

是否可以用自定义登录窗口应用程序替换 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,并且不明白这与登录有什么关系(除了可能在当前用户的工作上放置一个登录对话框)。

即使无法替代登录窗口,我也很想知道可以按照这些方式做什么(由不为 Apple 工作的人)。

4

2 回答 2

18

登录窗口应用程序在/System/Library/LaunchDaemons/com.apple.loginwindow.plist中定义为启动配置的一部分。

从理论上讲,您可以用自己的登录窗口替换登录窗口,但我不知道您在新应用程序中必须做什么 - 我认为登录窗口比身份验证和设置用户会话要多一些 -> 除其他外,它看起来它正在做一些与启动相关的家务。

我编译了一个调用CGSCreateLoginSession的应用程序,一旦你运行它,它就会通过旋转立方体转换到登录窗口。我想这就是它需要 CoreGraphics 的原因——它只是一个在最后调用注销的图形函数。

您可以尝试使用 InputManager 并查看登录窗口是否加载代码 -> 如果确实如此,则可以更改 loginwindow NIB ( LoginWindowUI.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 的启动定义必须包含一个附加条目(以启用动态链接器中的插入),即:

<key>EnvironmentVariables</key>
<dict>    
    <key>DYLD_INSERT_LIBRARIES</key>
    <string>path_to/Desktop/libinterposers.dylib</string>
</dict>
于 2009-07-01T11:56:33.103 回答
3

是的,您可以使用 SFAuthorizationPluginView

这里是 ADC 的参考链接

于 2009-07-01T15:17:31.810 回答