मुझे अपनी 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 बुनियादी त्रुटि जांच के अलावा वहां और कुछ नहीं है, लेकिन शायद यह मदद करेगा?
एक धागा बनाना लक्ष्य प्रक्रिया में एक ढेर आवंटित करता है। नहीं, हालांकि इनमें से कोई भी असफल रहा है। –