我担心我的Cocoa编程技巧很简陋.我觉得有趣的是,当我运行探测CGSession(它是a undocumented utility that performs fast user switching)以查看它使用的功能时)
nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession
(undefined [lazy bound]) external _CGSCreateLoginSession (from applicationservices)
我还没有找到applicationservices框架的文档.我怀疑我正在深入研究服务提供者接口而不是应用程序接口.
我确实发现这个非常有趣的片段:(google cache)(direct link to down page;看起来网站正在重新组织)来自声称切换到登录窗口的应用程序,即使禁用了快速用户切换.
#include "CGSInternal.h" int main (int argc,const char * argv[]) { // switch to the login window CGSCreateLoginSession(NULL); return 0; }
解决方法
从理论上讲,您可以用自己的登录窗口替换登录窗口,但我不知道您在新应用程序中需要做什么 – 我认为登录窗口比认证和设置用户会话要多一些 – >除其他外,看起来它做了一些相关的杂务.
我编译了一个调用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 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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。