2009-06-30 11 views
6

क्या कस्टम लॉगिन विंडो एप्लिकेशन के साथ मैक ओएस एक्स लॉगिन विंडो,/सिस्टम/लाइब्रेरी/कोर सर्विसेज /loginwindow.app को प्रतिस्थापित करना संभव है? (See my rational for doing so।)क्या मैक लॉगिन स्क्रीन को प्रतिस्थापित करना संभव है?

मुझे डर है कि मेरे कोको प्रोग्रामिंग कौशल प्राथमिक हैं। मैं यह दिलचस्प है कि, पाते हैं जब मैं जांच 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; 
} 

मैं तटरक्षक ले CoreGraphics मतलब करने के लिए, और समझ में नहीं आता है कि (शायद एक लॉगिन वर्तमान उपयोगकर्ता के काम से अधिक संवाद डालने के साथ छोड़कर) में प्रवेश के साथ क्या करना है क्या।

भले ही लॉगिन विंडो के प्रतिस्थापन प्राप्त करना संभव नहीं है, मुझे यह जानने में दिलचस्पी होगी कि इन पंक्तियों के साथ क्या किया जा सकता है (जो लोग ऐप्पल के लिए काम नहीं करते हैं)।

+2

आपके 'ऐसा करने के लिए तर्क' टूटा हुआ लगता है (जैसा कि 'लिंक टूटा हुआ है') – akf

+0

इसके बारे में क्षमा करें। मैंने लिंक तय कर दिया है। –

+0

सबकुछ संभव है। यह सिर्फ इस बात पर निर्भर करता है कि आप कितनी वारंटी और ईयूएलए को रद्द करना चाहते हैं। –

उत्तर

18

लॉगिन विंडो आवेदन /System/Library/LaunchDaemons/com.apple.loginwindow.plist में launchd विन्यास के भाग के रूप में परिभाषित किया गया है।

सिद्धांत रूप में आप लॉगिन विंडो को अपने आप से बदल सकते हैं लेकिन मुझे नहीं पता कि आपको नए ऐप में क्या करना है - मुझे लगता है कि लॉगिन विंडो कुछ और प्रमाणीकरण और उपयोगकर्ता सत्र की स्थापना करता है -> दूसरों के बीच, ऐसा लगता है कि यह कुछ लॉन्च किए गए काम कर रहा है।

मैंने एक आवेदन संकलित किया है जो CGSCreateLoginSession पर कॉल करता है और एक बार जब आप इसे घुमाने वाले घन के माध्यम से लॉगिन विंडो में संक्रमण करते हैं। मुझे कल्पना है कि यही कारण है कि इसे कोरग्राफिक्स की आवश्यकता है - यह सिर्फ एक ग्राफिक्स फ़ंक्शन है जो अंत में लॉगआउट को कॉल करता है।

आप एक InputManager कोशिश करते हैं और यह देखने के लॉगिन विंडो कोड को लोड करता है हो सकता है -> अगर यह होता है, आप तो loginwindow निब (LoginWindowUI.nib) बदल सकता है और उपयोगकर्ता के साथ एक नया विंडो प्रदर्शित करने के कुछ बटन जोड़ने ब्राउज़र। एक बार जब छात्र खुद की तस्वीर चुनता है तो आप loginwindow में उपयोगकर्ता नाम और पासवर्ड फ़ील्ड को स्वत: भर सकते हैं।

नोड यह सब सिद्धांत है, और यह बहुत नाजुक और असुरक्षित लगता है।

शुभकामनाएं।

बाद में संपादित

कृपया ध्यान दें यह तो देखभाल के साथ का उपयोग बहुत असुरक्षित है - मैं जब इस सामग्री

यहाँ बाहर की कोशिश कर अपने सिस्टम एक दो बार नली किया एक सबूत अवधारणा-का-है कार्यान्वयन जो 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; 
} 

कोड संकलित साथ: कोड लोड हो रहा है

gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa 

interposing पर आधारित है इसलिए loginwindow की launchd परिभाषा एक अतिरिक्त प्रविष्टि (गतिशील लिंकर में interposing सक्षम करने के लिए) को रोकने के लिए, यानी है:

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

वाह। मैं खुशी से आपको दूसरी बार उखाड़ फेंक दूंगा। यह एक ही समय में अविश्वसनीय और पागल है। चूंकि यह काफी उन्नत है, मुझे यकीन है कि मैं सही ढंग से समझता हूं कि यह नमूना क्या करता है: यह कॉल को "my_openlog" के साथ "ओपनलॉग" में बदल देता है जो आपकी कक्षा LLApp को एनएसएप्लिकेशंस क्लास होने का नाटक करता है, ताकि उसके कार्यों में कोई भी कॉल हो संशोधित किया जा सकता है, और यह सिस्टम लॉग में कुछ आउटपुट करने के लिए रन फ़ंक्शन को संशोधित करके इसे साबित करता है। –

+0

फ़ंक्शन प्रतिस्थापन को "इंटरऑपिंग मैक ओएस एक्स" के लिए इंटरपोज़िंग करके संभव बनाया गया है और आपको ओएस एक्स पर अमित सिंह की पुस्तक का एक अध्याय मिलेगा जो वर्णन करता है कि यह कैसे काम करता है। क्लास पॉज़िंग क्लास एक्स के सभी उदाहरणों को कक्षा वाई के साथ बदलने के लिए प्रयोग किया जाता है - ध्यान दें कि यह 64 बिट पर समर्थित नहीं है। बदलने के लिए - [एनएसएप्लिकेशंस रन] आप शायद यह नहीं चाहते हैं - आपको कस्टम व्यू क्लास से कुछ विधि जैसे लॉगिनविंडो ऐप के अंदर कुछ बदलना होगा (आप कस्टम व्यू क्लास का नाम खोलकर देख सकते हैं इंटरफेस बिल्डर में बंडल)। – diciu

+0

ऐसा लगता है कि मैं निकट भविष्य में इस समय आवंटित करने में सक्षम नहीं हूं, लेकिन मैं निश्चित रूप से आपको आपके द्वारा किए गए सभी कड़ी मेहनत के लिए सही उत्तर प्रतिनिधि दे रहा हूं; मुझे सच में लगता है कि इस मार्गदर्शन के साथ कार्य पूरा किया जा सकता है। धन्यवाद। –

3

हां, तो आप SFAuthorizationPluginView

012 का उपयोग कर सकते

+0

जानकारी के लिए धन्यवाद। ऐसा लगता है कि यह केवल तेंदुए है (मैं बाघ का भी समर्थन करना चाहता हूं)। ऐप्पल का "नाम और पासवर्ड" नमूना है, और एसओ पर कुछ संबंधित प्रश्न हैं, जो एक टैग या "एसएफएफ़ाइजेशन प्लुगिन व्यू" (http://stackoverflow.com/questions/tagged/sfauthorizationpluginview) का उपयोग कर रहे हैं –

+0

मुझे यकीन नहीं है कि आप कर सकते हैं लॉगिन विंडो में कुछ भी बदलने के लिए आसानी से SFAuthorizationPluginView का उपयोग करें। मैंने नाम और पासवर्ड कोड नमूना संकलित और स्थापित किया है जो SFAuthorizationPluginView को दिखाता है और ऐसा लगता है कि यह आपको कस्टम अधिकार बनाने की अनुमति देता है (मौजूदा अधिकारों की परिभाषाओं के लिए देखें/आदि/प्राधिकरण -> लॉगिन वहां नहीं है)। प्लगइन तब खेलता है जब कोई एप्लिकेशन ओएस से उस नए बनाए गए अधिकार के लिए उपयोगकर्ता को अधिकृत करने के लिए कहता है। – diciu

+0

धन्यवाद, diciu। यह मुझे स्पष्ट नहीं था कि आप कैसे (या यदि आप कर सकते हैं) यह लॉगिन स्क्रीन पर दिखाई देते हैं। [मैं इसे संकलित करता था, लेकिन अपने कंप्यूटर पर प्रमाणीकरण (और तोड़ना!) प्रमाणीकरण नहीं करना चाहता था।] –

संबंधित मुद्दे