是否可以使用自定义登录窗口应用程序替换 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>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top