2009-07-16 5 views
7

मुझे अपनी Vista मशीन पर सिस्टम की स्वामित्व वाली प्रक्रियाओं में डीएलएल इंजेक्शन करने में दिलचस्पी है। मैं वर्चुअलअलोकएक्स, WriteProcessMemory और CreateRemoteThread की पारंपरिक विधि का उपयोग कर इस बारे में जा रहा हूं। हालांकि, क्योंकि यह सिस्टम प्रक्रियाओं पर काम करेगा, मैं लक्ष्य प्रक्रिया खोलने से पहले इंजेक्शन प्रक्रिया पर SeDebugPivilege सक्षम करता हूं।SeDebugPrivilege सक्षम के साथ सिस्टम प्रक्रिया के लिए WriteProcessMemory। (सी, विस्टा)


int EnableDebugPriv(LPCTSTR name) { 
    HANDLE hToken; 
    LUID luid; 
    TOKEN_PRIVILEGES tkp; 

    if(!OpenProcessToken(GetCurrentProcess(), 
         /*TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY*/ 
         TOKEN_ALL_ACCESS, 
         &hToken)) 
     return 0; 

    if(!LookupPrivilegeValue(NULL,name,&luid)) 
     return 0; 

    tkp.PrivilegeCount=1; 
    tkp.Privileges[0].Luid=luid; 
    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; 

    if(!AdjustTokenPrivileges(hToken,false,&tkp,sizeof(tkp),NULL,NULL)) 
    { 
     printf("!AdjustTokenPrivileges - %d\n",GetLastError()); 
     return 0; 
    } 
    if(GetLastError()==ERROR_NOT_ALL_ASSIGNED) 
    { 
     return 0; 
    } 

    CloseHandle(hToken); 
    return 1; 
} 

जहां SE_DEBUG_NAME निरंतर नाम के रूप में पारित किया गया है।


if(NULL==(p=OpenProcess(PROCESS_ALL_ACCESS,FALSE,(DWORD)pid))) 
... 
if(NULL==(loadLib=(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), 
             "LoadLibraryA"))) 
... 
if(NULL==(dllBuff=(LPVOID)VirtualAllocEx(p, 
             NULL, 
             strlen(dllPath)+1, 
             MEM_RESERVE|MEM_COMMIT, 
             PAGE_READWRITE))) 
... 
if(NULL==WriteProcessMemory(p, 
          (LPVOID)dllBuff, 
          dllPath, 
          strlen(dllPath), 
          &written)) 
... 
if(!CreateRemoteThread(p, 
         NULL, 
         NULL, 
         (LPTHREAD_START_ROUTINE)loadLib, 
         (LPVOID)dllBuff, 
         NULL, 
         NULL)) 
... 
:

SeDebugPrivilege सक्रिय करने के बाद, मैं लक्ष्य प्रक्रिया खोलने, LoadLibrary लगाने, अंतरिक्ष का आवंटन, स्मृति को DLL पथ लिखने, और धागा बनाने (रास्ते में सभी वापसी मान की जाँच) की प्रक्रिया के माध्यम से जाना

dllPath डीएलएल के पथ (स्पष्ट रूप से) का एक char * है, और pid लक्ष्य प्रक्रिया का पीआईडी ​​है। इन दोनों मानों को कमांड लाइन के माध्यम से लिया जाता है और उपयोग किए जाने से पहले मान्य किया जाता है।

मेरी समस्या यह है कि CreateRemoteThread तक त्रुटियों को वापस नहीं कर रहा है, जो 8 ("पर्याप्त संग्रहण नहीं है) लौटा रहा है। हालांकि, WriteProcessMemory प्रक्रिया में किसी भी बाइट्स नहीं लिख रहा है। कॉल के बाद लिखित चर हमेशा होता है 0. कोई बाइट नहीं लिखा जा रहा है, लेकिन फ़ंक्शन विफल नहीं हो रहा है। मुझे यकीन नहीं है कि यह क्यों हो रहा है। मैंने अन्य विशेषाधिकारों को देखा, जैसे SeRestorePrivilege जो सभी प्रक्रियाओं को लिखने का वादा करता है, लेकिन कुछ भी काम नहीं करता है।

मैं इस प्रोग्राम को व्यवस्थापक अधिकारों के साथ निष्पादित कर रहा हूं।

नोट: यह WriteProcessMemory और CreateRemoteThread समस्या तब होती है जब मैं इस प्रोग्राम को उच्च विशेषाधिकार प्राप्त उपयोगकर्ताओं (सिस्टम, स्थानीय सेवा, आदि ...) के विरुद्ध चलाता हूं। यह मेरे स्वामित्व वाले कार्यक्रम (समान विशेषाधिकार) के खिलाफ पूरी तरह से काम करता है।

संपादित करें: यहां संपूर्ण स्रोत का एक लिंक है। http://pastebin.com/m77110d8e बुनियादी त्रुटि जांच के अलावा वहां और कुछ नहीं है, लेकिन शायद यह मदद करेगा?

+1

एक धागा बनाना लक्ष्य प्रक्रिया में एक ढेर आवंटित करता है। नहीं, हालांकि इनमें से कोई भी असफल रहा है। –

उत्तर

4

इसे विस्टा या विंडोज के उच्च संस्करणों में सत्र अलगाव के साथ करना है। पासवर्ड डंपिंग टूल जैसे कैन और हाबेल के लिए स्रोत या डिस्सेप्लर देखें जो विस्टा कार्यक्षमता को शुद्ध करते हैं। अनिवार्य रूप से प्रक्रिया एक जैसी है लेकिन आप CreateRemoteThread के लिए एक अलग फ़ंक्शन कॉल करेंगे (क्षमा करें, मुझे नहीं लगता कि फ़ंक्शन निर्यात किया गया है, आपको बस इसे ढूंढना है, इसलिए काम करने वाले सॉफ़्टवेयर की डिस्सेप्लर शायद सबसे अच्छी शर्त है)।

+0

मैं आज रात CreateRemoteThread के साथ इस मुद्दे को देखूंगा। जानकारी और टिप के लिए धन्यवाद। हालांकि, WriteProcessMemory के साथ 0 बाइट क्यों लिखे जा रहे हैं? क्या इसके लिए एक अलग/समांतर कार्य भी है? सहायता के लिए धन्यवाद। किसी भी अन्य सुझावों की सराहना की जाएगी। – pcorey

+0

मैं समझ नहीं सकता कि कोई बाइट लिखे जा रहे हैं, लेकिन त्रुटि कोड की कमी नहीं है ... हालांकि इसके बारे में सोचने के लिए आते हैं, क्या यह एक ऐसा डिबगर्स भी काम नहीं करता है? – SamB

4

आप CreateRemoteThread के बजाय RtlCreateUserThread का उपयोग करने का प्रयास कर सकते हैं। यह दिनचर्या परवाह नहीं है कि लक्ष्य प्रक्रिया किस सत्र में रहती है। बस इसे समाप्त होने से पहले थ्रेड कॉल RtlExitUserThread रखना याद रखें। ये धागे स्वयं के बाद साफ नहीं होते हैं, जैसे CreateThread/CreateRemoteTreads करते हैं।

reactos code आपको ये दिनचर्या क्या कर रहा है पर एक अच्छा नज़र डाल सकता है।