Cli*_*ore 6 macos cocoa login sfauthorizationpluginview
是否可以使用自定义登录窗口应用程序替换Mac OS X登录窗口/System/Library/CoreServices/loginwindow.app?(参见我的理性这样做.)
我担心我的Cocoa编程技巧还不成熟.我觉得有趣的是,当我运行探测CGSession(这是一个执行快速用户切换的未记录的实用程序)来查看它使用的功能时,通过执行
nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession
Run Code Online (Sandbox Code Playgroud)
其中一个链接功能是:
(undefined [lazy bound]) external _CGSCreateLoginSession (from ApplicationServices)
Run Code Online (Sandbox Code Playgroud)
我还没有找到ApplicationServices框架的文档.我怀疑我正深入到服务提供程序接口而不是应用程序编程接口.
我确实发现这个非常有趣的片段:( 谷歌缓存)(直接链接到下页 ;看起来网站正在重新组织)来自声称切换到登录窗口的应用程序,即使禁用了快速用户切换.
#include "CGSInternal.h"
int main (int argc, const char * argv[]) {
// switch to the login window
CGSCreateLoginSession(NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为CG意味着CoreGraphics,并且不明白与登录有什么关系(除非可能在当前用户的工作上放置登录对话框).
即使无法替换登录窗口,我也很想知道可以在这些方面做些什么(不适合Apple工作的人).
dic*_*ciu 18
登录窗口应用程序被定义为/System/Library/LaunchDaemons/com.apple.loginwindow.plist中的launchd配置的一部分.
从理论上讲,您可以用自己的登录窗口替换登录窗口,但我不知道您在新应用程序中需要做什么 - 我认为登录窗口比认证和设置用户会话要多一些 - >其中,它看起来它做了一些相关的杂务.
我编译了一个调用CGSCreateLoginSession的应用程序,一旦运行它,它就会通过旋转立方体转换到登录窗口.我想这就是为什么它需要CoreGraphics - 它只是一个图形函数,最后调用logout.
您可以尝试使用InputManager并在登录窗口中加载代码 - >如果有,您可以更改loginwindow NIB(LoginWindowUI.nib)并添加一些按钮以使用用户浏览器显示新窗口.一旦学生选择了他/她自己的照片,您就可以在登录窗口中自动填充用户名和密码字段.
节点这是理论,它看起来非常脆弱和不安全.
祝好运.
稍后编辑
请注意这是非常不安全的,所以要小心使用 - 我在试用这些东西时给我的系统软管了几次
这是一个概念验证实现,它在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;
}
Run Code Online (Sandbox Code Playgroud)
代码编译:
gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa
Run Code Online (Sandbox Code Playgroud)
代码加载基于插入,因此loginwindow的launchd定义必须包含一个额外的条目(以启用在动态链接器中的插入),即:
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>path_to/Desktop/libinterposers.dylib</string>
</dict>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4032 次 |
| 最近记录: |