É possível substituir a tela de login do Mac?
-
21-08-2019 - |
Pergunta
É possível substituir a janela de login do Mac OS X, /System/Library/CoreServices/loginwindow.app, com uma aplicação de janela de login personalizado? ( Ver o meu racional para fazê-lo .)
Eu tenho medo minhas habilidades de programação de cacau são rudimentares. Eu acho interessante que, quando eu corro sonda CGSession (que é um indocumentado utilitário que executa troca rápida de usuário) para ver quais funções ele usa, fazendo
nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession
que uma das funções ligadas é:
(undefined [lazy bound]) external _CGSCreateLoginSession (from ApplicationServices)
Eu não encontrei a documentação sobre o quadro ApplicationServices. Eu suspeito que eu estou recebendo em profundidade de Serviços Interfaces Provider em vez de aplicação programador Interfaces.
Eu não encontrar este trecho realmente interessante: ( google cache de ) ( link direto para a página de baixo ; parece que o local está passando por re-organização) de um aplicativo que reivindicações para mudar para a janela de login mesmo se troca rápida de usuário está desativada
#include "CGSInternal.h"
int main (int argc, const char * argv[]) {
// switch to the login window
CGSCreateLoginSession(NULL);
return 0;
}
Eu tomo CG para CoreGraphics médios, e não entendo o que isso tem a ver com o log in (exceto talvez com colocando um login de diálogo ao longo do trabalho do usuário atual).
Mesmo se não for possível alcançar um substituto para a janela de login, eu estaria interessado em saber o que pode ser feito ao longo destas linhas (por pessoas que não trabalham para a Apple).
Solução
A aplicação janela de login é definida como parte do launchd configuração no /System/Library/LaunchDaemons/com.apple.loginwindow.plist .
Em teoria, você pode substituir a janela de login com o seu próprio, mas eu não sei o que você tem a fazer no novo app - Eu acho que a janela de login faz um pouco de autenticação mais então e configurar a sessão do usuário -> entre outros, parece que sua fazendo algum launchd tarefas relacionadas.
Eu compilei uma aplicação que chama CGSCreateLoginSession e uma vez que você executá-lo que ele passa para a janela de login por meio do cubo giratório. Imagino que é por isso que exige CoreGraphics. - É apenas uma gráfica função que chama o logout no final
Você poderia tentar um InputManager e ver as cargas janela de login do código -> se isso acontecer, você pode então alterar o loginwindow NIB ( LoginWindowUI.nib ) e adicionar alguns botões para exibir uma nova janela com o navegador do usuário. Uma vez que o aluno escolhe uma imagem de ele / ela mesma que você poderia preencher automaticamente os campos de nome de usuário e senha no loginwindow.
Nó de tudo isso é teoria, e parece muito frágil e inseguro.
Boa sorte.
editar Posterior
Por favor note que este é uso, de modo muito inseguro com cuidado - eu fiz mangueira meu sistema um par de vezes quando a experimentar este material
Aqui está uma implementação de prova de conceito de que o código injeta na loginwindow.
#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;
}
Os compila o código com:
gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa
Código de carga é baseada na interposição de modo a definição launchd de loginwindow tem que conter uma entrada adicional (para permitir a interposição no vinculador dinâmico), ou seja:.
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>path_to/Desktop/libinterposers.dylib</string>
</dict>
Outras dicas
Sim, você pode usar o SFAuthorizationPluginView