2015-04-24 7 views
6

मैं एक विंडोज 7 callgate समारोह है कि मैं NT कार्यों सीधे कॉल करने के लिए उपयोग किया है बनाने के लिए कोशिश कर रहा है:एक विंडोज़ 8 syscall callgate समारोह

//Windows 7 syscall 

__declspec(naked) 
NTSTATUS __fastcall wow64 (DWORD ecxId, char *edxArgs) 
{ 
    __asm 
    { 
     mov eax, ecx; 
     mov ecx, m_param; 
     call DWORD ptr fs:[0xc0]; 
     add esp, 0x4; 
     retn; 
    }; 
} 

NTSTATUS callGate (DWORD id, ...) 
{ 
    va_list valist; 
    va_start(valist,id); 
    return wow64(id,valist); 
} 

//Example NTClose function 
NTSTATUS closeHandle (void *object) 
{ 
    m_param = 0; 
    return callGate (0xc, object); 
} 

मैं खिड़कियों 8.1 के लिए एक ही बात करने के लिए कोशिश कर रहा हूँ। मैंने सभी फ़ंक्शन कॉल इंडेक्स अपडेट किए हैं; लेकिन मैंने देखा है वास्तविक callgate समारोह खिड़कियों 8.1 पर काफी अलग है:

यहाँ वास्तविक कॉल गेट की तरह (ntdll.dll में स्थित) के लिए समारोह

mov eax, 0xA5 //the call index 
xor ecx, ecx //(m_param) 
lea edx, dword ptr ss:[esp + 0x4] //this causes an sp-analysis failure in IDA 
call dword ptr fs:[0xC0] 
add esp, 0x4 
retn 0x2C 

ZwCreateThreadEx अब यहाँ सटीक है दिखता है एक ही एनटी समारोह (ZwCreateThreadEx) खिड़कियों 8,1

mov eax, 0xB0 //the call index 
call dword ptr fs:[0xC0] 
retn 0x2C //2c/4 = 11 parameters 

मैं सामान के सभी प्रकार कोशिश कर रहे हैं पर इस विंडोज़ 8.1 पर काम कर पाने के लिए, लेकिन कोई लाभ नहीं हुआ पड़ा है। मैं यह नहीं समझा सकता कि समस्या क्या है या क्या गलत हो रहा है, मुझे पता है कि मैं इसे विंडोज 7 पर सही तरीके से कर रहा हूं।

W8.1 फ़ंक्शन के दृश्य से, मैंने इस एकल फ़ंक्शन के साथ आने का प्रयास किया है (काम नहीं करता है):

DWORD dwebp,dwret,dwparams; //for saving stuff 

NTSTATUS __cdecl callGate (DWORD id, DWORD numparams, ...) 
{ 
    _asm 
    { 
     pop dwebp; //save ebp off stack 
     pop dwret; //save return address 
     pop eax; //save id 
     pop dwparams; //save param count 
     push dwret; //push return addy back onto stack cuz thats how windows has it 
     JMP DWORD ptr fs:[0xc0]; //call with correct stackframe (i think) 
     mov ecx, numparams; //store num params 
     imul ecx, 4; //multiply numparams by sizeof(int) 
     add esp, ecx; //add to esp 
     ret; 
    }; 
} 

किसी भी मदद की सराहना की जाएगी।

+1

क्यों-ओह आप ड्राइवर लिखने के बिना ऐसा क्यों करना चाहते हैं? –

उत्तर

2

आपका नया कॉल गेट फ़ंक्शन आपके द्वारा इच्छित स्टैक फ्रेम सेट नहीं करता है, स्टैक के शीर्ष पर वापसी पता कॉलगेट का वापसी पता कॉल के बाद निर्देश नहीं है।

इस ढेर की तरह के बाद कॉल अनुदेश Windows 8.1 से अपने उदाहरण ZwCreateThreadEx में क्रियान्वित किया जाता दिखता है:

  • वापसी पता (retn 0x2c अनुदेश)
  • वापसी पता (ZwCreateThreadEx के फोन करने वाले)
  • तर्क (11 DWORDs)

यहाँ ढेर की तरह के बाद जेएमपी अनुदेश अपने नए callGate समारोह में क्रियान्वित किया जाता दिखता है :

  • वापसी पता (callGate के फोन करने वाले)
  • तर्क

वहाँ अपने नए callGate समारोह के साथ अन्य समस्याओं कर रहे हैं। यह वैश्विक चर में मूल्यों को बचाता है जिसका अर्थ है कि आप फ़ंक्शन सुरक्षित नहीं हैं। दो धागे callBack को एक ही समय में इन सहेजे गए मानों को मिटाए बिना कॉल नहीं कर सकते हैं। यह इनलाइन असेंबली का उपयोग करता है जो दोनों आपके कोड को और अधिक जटिल बनाते हैं कि इसे अनिवार्य व्यवहार पर निर्भर होना चाहिए: कैसे संकलक फ़ंक्शन के लिए स्टैक सेट अप करेगा।

यहां बताया गया है मैं MASM में callGate के अपने Windows 8.1 संस्करण लिखें:

_text SEGMENT 

MAXARGS = 16 

do_call MACRO argcount 
@@call&argcount: 
    call DWORD PTR fs:[0C0h] 
    ret argcount * 4 
    ENDM 

call_table_entry MACRO argcount 
    DD OFFSET @@call&argcount 
    ENDM 

_callGate PROC 

    pop edx  ; return address 
    pop eax  ; id 
    pop ecx  ; numparams 
    push edx  ; return address 

    cmp ecx, MAXARGS 
    jg @@fail 

    jmp [@@call_table + ecx * 4] 

@@args = 0 
    REPT MAXARGS + 1 
     do_call %@@args 
    @@args = @@args + 1 
    ENDM 

@@fail: 
    ; add better error handling 
    int 3 
    jmp @@fail 

@@call_table: 
@@args = 0 
    REPT MAXARGS + 1 
     call_table_entry %@@args 
    @@args = @@args + 1 
    ENDM 


_callGate ENDP 

_TEXT ENDS 

    END 

इस कार्यान्वयन MAXARGS तर्कों (मान बदलने के किसी भी विंडोज सिस्टम कॉल 16 से अधिक तर्क लेता है तो) तक सीमित है। यह मैक्रोज़ कॉल पर कहीं भी तर्कों की संख्या को स्टोर करने से बचने के लिए कॉल/आरईटी कोड ब्लॉक की एक तालिका उत्पन्न करता है।मेरे पास एक ऐसा संस्करण है जो किसी भी तर्क का समर्थन करता है लेकिन यह अधिक जटिल और थोड़ा धीमा है। यह कार्यान्वयन अनचाहे है, मेरे पास विंडोज 8.1 नहीं है।

+0

मुझे पता है कि यह कहने के लिए टिप्पणियां छोड़ने के लिए कहा गया है, लेकिन मैं विशेष रूप से वापस आना चाहता था और धन्यवाद क्योंकि आपका कोड मुझे एक रेटन टेबल का विचार खोला, इस प्रकार मुझे यह लिखने की इजाजत दी गई: http: // pastebin। com/PBHTd5E9 – applecider

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