2012-01-24 9 views
5

परिचय जानकारी: विंडोज 7 64-बिट। सी ++। 64-बिट ऐप्स और डीएलएल। एमएस डिटोर के बिना हुकिंग।एपीआई हुकिंग बिना डिटोर

प्रश्न: मैंने एक कामकाजी उदाहरण प्राप्त करने के मुद्दे पर संघर्ष किया है जो विंडोज़ में हुकिंग का प्रदर्शन करता है। ऐसा लगता है कि वहां के अधिकांश टट्स एक समय के दौरान लिखे गए हैं, जहां 32-बिट विंडोज एक्सपी एकमात्र ऑपरेटिंग सिस्टम था ... मैंने बाद में 64-बिट बाधाओं को समझने और डीएलएल को इंजेक्शन देने से इंकार कर दिया है। ज्ञान की इस यात्रा में मेरा अगला कदम हुकिंग है। विषय के नास्तिकता को ध्यान में रखते हुए, एमएस के डेटोर 64-बिट (मुफ्त में) का समर्थन नहीं करते हैं और मैं निश्चित रूप से कुछ भी $ 10,000 का भुगतान नहीं कर रहा हूं। इसलिए मैंने this tutorial में पारंपरिक तरीकों का पीछा किया।

यह टुट भयानक है, लेकिन मैं एक छोटे से परेशानी इस क्षेत्र को समझने आ रही हैं:

void BeginRedirect(LPVOID newFunction) 
{ 
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; 
    memcpy(JMP, tempJMP, SIZE); 
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
       PAGE_EXECUTE_READWRITE, &oldProtect); 
    memcpy(oldBytes, pOrigMBAddress, SIZE); 
    memcpy(&JMP[1], &JMPSize, 4); 
    memcpy(pOrigMBAddress, JMP, SIZE); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); 
} 

विशेष रूप से, मैं tempJMP बाइट के साथ संघर्ष कर रहा हूँ और memcpy के सभी चल रहा है। मेरे पास नोटपैड के InsertDate() फ़ंक्शन का पता है जिसे मैं हाइजैक करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि इसे कहां लक्षित करना है ... क्या यह नए फ़ंक्शन का पता होगा? या यह सापेक्ष नहीं है? इडक, मैं बस कुछ पॉइंटर्स की तलाश में हूं।

उत्तर

1

पूरे विचार मूल कोड है कि करने के लिए संदेशबॉक्स कार्यान्वित "के ऊपर लिख" के लिए है:

JuMP <CustomMessageBoxFunction> 
RETurn (back to program execution) 

तो,

पहले उसने प्रतियां जेएमपी सरणी के लिए अपने shellcode:

memcpy(JMP, tempJMP, SIZE); 

फिर वह मूल असेंबली कोड बाइट्स को मूल पते से अपने अस्थायी स्टोरेज "पुरानी बाइट्स" में प्रतिलिपि बनाता है ताकि वह अपने कस्टम फ़ंक्शन निष्पादित होने के बाद इसे वापस कॉपी कर सके:

memcpy(oldBytes, pOrigMBAddress, SIZE); 

फिर वह प्रतियां पते के आकार वह पहले सही JMP आदेश के बाद जेएमपी सरणी की गणना:

memcpy(&JMP[1], &JMPSize, 4); 

अंत में उसकी जेएमपी [] सरणी shellcode उसकी समारोह, उदा फोन करने के लिए आवश्यक होता है

JMP 1234 
RET 

तो अब वह कॉपी करने के लिए है कि मूल बाइट्स जहां कार्यक्रम मूल MessageBox समारोह को खोजने के लिए उम्मीद से अधिक:

memcpy(pOrigMBAddress, JMP, SIZE); 

अब आप अपने प्रश्न के लिए आ रहा है, अगर आप InsertDate (हुक करना चाहते हैं) तो POrigMBAddress का उपयोग करने के बजाय आप InsertDate के पते का उपयोग कर सकते हैं।

लेकिन मुझे यकीन नहीं है कि यह 64 बिट विंडोज़ के साथ काम करेगा।

2

हॉटपैच करने योग्य फ़ंक्शंस निम्न निर्देश mov edi, edi से शुरू होते हैं और 5 एनओपी निर्देशों से पहले होते हैं (कोड गुफा अगर मुझे सही याद है)।

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

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