2009-05-21 7 views
5

यूनिक्स वातावरण पर सिस्टम कॉल में अवरोध डालने के संभावित तरीके क्या हैं? मैं AIX में करना चाहता हूं।यूनिक्स वातावरण पर सिस्टम कॉल को अवरुद्ध करने के संभावित तरीके क्या हैं?

धन्यवाद

उत्तर

3

AIX से परिचित नहीं है, लेकिन लिनक्स और Solaris पर निम्न काम करता है। आप एलडी_PRELOAD पर्यावरण चर का उपयोग कर सकते हैं, जो ld.so को libc से पहले साझा लाइब्रेरी लोड करने के लिए कहता है और फिर सिस्टम कॉल का अपना संस्करण लिखता है, और वैकल्पिक रूप से मूल को कॉल करता है। अधिक जानकारी के लिए man ld.so

#include <dlfcn.h> 

typedef int (*ioctl_fn)(int, int, void*); 

static 
int 
my_ioctl(int  fildes, 
     int  request, 
     void* argp, 
     ioctl_fn fn_ptr) 

{ 
    int result = 0; 

    /* call original or do my stuff */ 
    if (request == INTERESTED) 
    { 
     result = 0; 
    } 
    else 
    { 
     result = (*fn_ptr)(fildes, request, argp); 
    } 

    return result; 
} 

/* 
* override ioctl() - on first call get a pointer to the "real" one 
* and then pass it onto our version of the function 
*/ 
int 
ioctl(int fildes, 
     int request, 
     void* argp) 
{ 
    static ioctl_fn S_fn_ptr = 0; 

    if (S_fn_ptr == 0) 
    { 
     S_fn_ptr = (ioctl_fn)dlsym(RTLD_NEXT, "ioctl"); 
    } 

    return my_ioctl(fildes, request, argp, S_fn_ptr); 
} 

की तर्ज कुछ कोड से बाहर मैं चारों ओर झूठ बोल रही थी इस नक्काशीदार साथ कुछ है, क्षमा याचना अगर मैं इसे गलत बना दिया है।

+1

nitpick: आप में अवरोध उत्पन्न कर रहे हैं (प्रणाली) पुस्तकालय कॉल, नहीं प्रणाली कहता है। संभवतः प्रश्नकर्ता का क्या कहना है, लेकिन यह ध्यान देने योग्य है कि आप थोड़ा अलग सवाल का जवाब देते हैं। अभी भी एक +1 जवाब। –

+0

@ जॉन एम - मुझे लगता है कि सवाल थोड़ा अस्पष्ट है - क्या प्रयोजन @debugger सिस्टम कॉल अवरोधन करना चाहते हैं करता है के लिए? यह व्यवहार को संशोधित करने के लिए है, तो करने से काम करेगा कि क्या यह प्रयोजनों अनुरेखण के लिए है, तो का उपयोग ट्रस/strace/dtrace या AIX बराबर, ... मिल सकती है सभी अस्तित्व और बहस "क्या एक सिस्टम कॉल है।" प्रतिक्रिया के लिए धन्यवाद! – Beano

0

मुझे एईक्स के बारे में निश्चित नहीं है, लेकिन मैंने इसे लिनक्स पर किया है। लिनक्स पर, सिस्टम कॉल टेबल sys_call_table सरणी में निहित है। हमें पहले इस तालिका का पता पता लगाने की आवश्यकता है। अब, यह एक मुश्किल बात है और इसे करने के कई तरीके हैं।

हम sysmap फ़ाइल को देखकर इसका पता पा सकते हैं:

punb200m2labs08vm1:/ # cat /boot/System.map-4.4.21-69-default | grep sys_call_table 
ffffffff81600180 R sys_call_table 

इसलिए, ffffffff81600180 मेरी मशीन पर sys_call_table का पता है। अपने कर्नेल मॉड्यूल में आप बस कुछ ही सिस्टम कॉल नंबर करने के लिए इसी डिफ़ॉल्ट समारोह बदल (है कि आप बदल रहे हैं) और अपने खुद के कार्य करने के लिए असाइन कर सकते हैं।

उदा मान लीजिए कि आप 'ओपन' सिस्टम कॉल को अवरुद्ध करना चाहते हैं जिसका नंबर लिनक्स पर __NR_open है। के बाद आप ऊपर से sys_call_table पता मिलता है, बस sys_call_table की index __NR_open करने के लिए अपने समारोह में निर्दिष्ट करें:

sys_call_table[__NR_open] = your_function; 

जहां your_function आप द्वारा किया जाता है 'खुला' सिस्टम कॉल अवरोधन करने। अब से, प्रत्येक खुली सिस्टम कॉल इस फ़ंक्शन के माध्यम से जाएगी।

विवरण AIX पर भिन्न होंगे, लेकिन समग्र विचार समान होगा, मुझे लगता है। आपको इसे प्राप्त करने के लिए केवल AIX विशिष्ट प्रक्रिया को खोजने की आवश्यकता है।

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