是否有可能取代Mac的登录屏幕?(Is it possible to replace the Mac

2019-06-24 13:33发布

是否有可能取代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中,不明白是什么有伐木做(除了可能把登录在当前用户的工作对话框上)。

即使是不可能实现登录窗口的替代品,我很想知道什么可以沿着这些路线来完成(由谁不为苹果工作的人)。

Answer 1:

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

从理论上讲,你可以换成你自己的登录窗口,但我不知道你在新的应用程序做什么 - 我想在登录窗口确实有点多,然后验证和建立用户会话 - >除其他外,它看起来像其做一些launchd的相关家务。

我编译调用CGSCreateLoginSession,一旦你运行它过渡到通过旋转立方体的登录窗口的应用程序。 我想这就是为什么它需要CoreGraphics中 - 它只是一个图形功能,在结束电话注销。

你可以尝试的输入管理,看看它的登录窗口中加载代码- >如果这样做,然后你可以改变登录窗口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

代码加载基于插入所以登录窗口的定义的launchd必须包含一个额外的条目(以启用动态连接器插入),即:

<key>EnvironmentVariables</key>
<dict>    
    <key>DYLD_INSERT_LIBRARIES</key>
    <string>path_to/Desktop/libinterposers.dylib</string>
</dict>


Answer 2:

是的,你可以使用SFAuthorizationPluginView

在这里,在ADC的参考链接



文章来源: Is it possible to replace the Mac login screen?