2012-11-19 12 views
8

यहां कोड का कुछ मानक टुकड़ा है जहां हम हुक को हमारे ब्याज के कार्य की शुरुआत में कुछ बाइट्स को पुनः लिखते हैं। मेरा सवाल है: हमें पुनः लिखने वाली स्मृति के टुकड़े को दोबारा क्यों दोहराना पड़ता है? क्या हम इसे PAGE_EXECUTE_READWRITE अनुमतियों से नहीं छोड़ सकते हैं? हम यहां मानते हैं कि हमें लगातार मूल बाइट्स को पुनर्स्थापित करने की आवश्यकता है और फिर से फिर से प्रयास करें।हुक: अनुमतियों को पुनर्स्थापित करने के लिए हमें फिर से VirtualProtect() की आवश्यकता क्यों है?

if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable 
{ 
    ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data 
    DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); //((to)-(from)-5) 
    memcpy(&jmp[1], &offset, 4); // write address into jmp 
    memcpy(Hook::hookData, jmp, 6); // save hook data 
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp 
    VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect 
} 
+1

ठीक है, आप नहीं करते हैं। जब तक आप जो भी करते हैं उस पर आप कभी सफल नहीं होते। इससे आपके द्वारा खोले गए दरवाजे के माध्यम से कार्यक्रम को हैक करने के लिए दूसरों के लिए यह बहुत दिलचस्प हो जाएगा। –

+1

@ हंसपैसेंट, लेकिन दूसरों को ऐसा करने से रोकने के लिए क्या रोक सकता है, अर्थात् इसमें वर्चुअलप्रोटेक्ट(), मेरे (या मूल) बाइट्स और वर्चुअलप्रोटेक्ट() को फिर से लिखना? – withkittens

उत्तर

8

दरवाजा खुला होने के बाद, कोई भी चल सकता है। यदि आपने मेमोरी रेंज से लेखन-सुरक्षा हटा दी है, तो कोई भी कोड उस मेमोरी को अपडेट कर सकता है - न सिर्फ आपका कोड। स्मृति को यह जानने का कोई तरीका नहीं है कि आपका (वैध) कोड इसे किसी संभावित मैलवेयर या यहां तक ​​कि केवल सादा छोटी गाड़ी डीएलएल बनाम अद्यतन करता है जिसे प्रक्रिया स्थान में भी लोड किया जाता है। इसे पुन: संरक्षित करने से आपके द्वारा नियंत्रित किए जाने वाले मेमोरी स्थानों को अपडेट करने वाले आपके-कोड के विरुद्ध सुरक्षा में सहायता मिलती है।

+0

आपके उत्तर के लिए धन्यवाद, डेविड। दरवाजे के साथ तुलना को कम करना - अगर मुझे पता है कि यह केवल मुझे है जो इसके माध्यम से चलेगा, ऐसा लगता है कि मैं इसे खोला जा सकता हूं? मेमोरी टुकड़े की लगातार सुरक्षा/पुन: संरक्षण करने की कोई प्रदर्शन हिट है? – withkittens

+0

सुरक्षा परिप्रेक्ष्य से, 'VirtualProtect' खराब/बग्गी कोड के विरुद्ध सुरक्षा की एक परत का प्रबंधन करता है। यह आप पर निर्भर करता है कि आपको उस परत की आवश्यकता है या नहीं। एक प्रदर्शन परिप्रेक्ष्य से, एक फ़ंक्शन जिसे हमेशा बुलाया जाता है उसे फ़ंक्शन से निष्पादित करने में अधिक समय लगता है जिसे कॉल नहीं किया जाता है। यह देखने के लिए प्रोफाइलिंग का उपयोग करें कि क्या आपको वास्तव में ऐसा प्रदर्शन बढ़ावा मिलता है कि सुरक्षा की परत न होने पर विचार करना उचित है। – prprcupofcoffee

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