ログインウィンドウアプリケーションは、/ System / Library / LaunchDaemons/com.apple.loginwindow.plistのlaunchd構成の一部として定義されています。
理論的には、ログインウィンドウを独自のものに置き換えることができますが、新しいアプリで何をする必要があるのかわかりません-ログインウィンドウは、認証とユーザーセッションの設定よりも少し多くのことを行うと思います->とりわけ、いくつかの起動された関連する雑用をしているように見えます。
CGSCreateLoginSessionを呼び出すアプリケーションをコンパイルしました。実行すると、回転するキューブを介してログインウィンドウに移行します。これがCoreGraphicsを必要とする理由だと思います-それは最後にログアウトを呼び出す単なるグラフィック関数です。
InputManagerを試して、ログインウィンドウがコードをロードすることを確認できます->ロードする場合は、ログインウィンドウ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のlaunchd定義には、追加のエントリが含まれている必要があります(ダイナミックリンカへのインターポーズを有効にするため)。
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>path_to/Desktop/libinterposers.dylib</string>
</dict>