2013-01-22 14 views
8

मैं एक प्रक्रिया के एक निश्चित पते तक पहुंचना चाहता हूं। लेकिन इसके लिए मुझे पहले प्रक्रिया का मूल पता प्राप्त करने की आवश्यकता है। मैं यह देखने के लिए एक उपकरण का उपयोग कर रहा हूं कि मैं वास्तव में इसे सही कर रहा हूं या नहीं। उपकरण मैं निम्नलिखित की जरूरत है पता चलता है: "app.exe"+0x011F9B08 = 0x119F8300प्रक्रिया का आधार पता

मैंने सोचा था कि मैं OpenProcess() के माध्यम से एक प्रक्रिया के आधार पता प्राप्त कर सकते हैं, लेकिन यह मुझे देता है: 0x0000005c एक परिणाम के रूप। मुझे नहीं लगता कि यह सही है? कम से कम, मुझे क्या चाहिए।

मुझे लगता है कि आधार का पता मुझे जरूरत है: 0x119F8300 - 0x011F9B08 = 0x107FE7F8 <-- base?

यह मेरा कोड है:

hWindow = FindWindow(NULL, lpWindowName); 
if(hWindow) 
{ 
    GetWindowThreadProcessId(hWindow, &dwProcId); 
    if(dwProcId != 0) 
    { 
      // hProcHandle -> 0x0000005c 
      hProcHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcId); 
    } 
    else 
    { 
     return 0; 
    } 
} 

कैसे मैं प्रक्रिया के आधार पता है कि मैं खोल दिया है मिल सकता है?

+3

"प्रक्रिया के आधार पते" से आपका क्या मतलब है? – NPE

+2

शायद आपको [आभासी स्मृति] (http://en.wikipedia.org/wiki/Virtual_memory) के बारे में जानने की आवश्यकता है –

+0

क्या आप _another_ चलने की प्रक्रिया की स्मृति को पढ़ने की कोशिश कर रहे हैं और उस मूल पते को जानने की आवश्यकता है जिस पर छवि थी उस प्रक्रिया के आभासी पता स्थान में मैप किया गया? –

उत्तर

5

आप अन्य प्रक्रिया के पता स्थान भीतर आभासी पता प्राप्त करना चाहते हैं, तो आप कि इतने की तरह कर सकते हैं:

  1. ओपन प्रक्रिया OpenProcess का उपयोग कर - अगर सफल, वापस लौटाया गया मान संभाल है प्रक्रिया के लिए, कर्नेल द्वारा कर्नेल ऑब्जेक्ट की पहचान करने के लिए उपयोग किया जाने वाला एक अपारदर्शी टोकन है। इसका सटीक पूर्णांक मान (आपके मामले में 0x5c) के पास अन्य हैंडल और अमान्य हैंडल से अलग करने के अलावा, अन्य उपयोगकर्ताओं के कार्यक्रमों का कोई अर्थ नहीं है। प्रक्रिया के मुख्य निष्पादन योग्य मॉड्यूल का नाम प्राप्त करने के लिए
  2. GetProcessImageFileName पर कॉल करें।
  3. लक्ष्य प्रक्रिया में सभी मॉड्यूल की सूची का आकलन करने के लिए EnumProcessModules का उपयोग करें।
  4. प्रत्येक मॉड्यूल के लिए, फ़ाइल नाम प्राप्त करने के लिए GetModuleFileNameEx पर कॉल करें, और इसे निष्पादन योग्य फ़ाइल नाम से तुलना करें।
  5. जब आपको निष्पादन योग्य मॉड्यूल मिल गया है, तो निष्पादन योग्य के कच्चे प्रवेश बिंदु प्राप्त करने के लिए GetModuleInformation पर कॉल करें।

यह आपको आभासी पता देगा, लेकिन इसके साथ आप बहुत कुछ नहीं कर सकते हैं क्योंकि यह आपकी वर्तमान प्रक्रिया के पता स्थान में मैप नहीं किया गया है।

+1

संभवतः यह रीडप्रोसेस मेमरी या कुछ ऐसे कॉल के लिए किया जाएगा। साथ ही, मुझे विश्वास नहीं है कि GetModuleInformation के लिए कॉल आवश्यक है। मॉड्यूल बेस पता और इसके HMODULE एक और एक हैं। –

+1

@ पीटर: हाँ, यह जरूरी है - आधार पता और 'HMODULE' समान हैं, लेकिन मॉड्यूल का प्रवेश बिंदु (सीआरटी स्टार्टअप फ़ंक्शन जो' WinMain() 'या' DllMain() 'कहता है) से अलग है आधार पता –

+1

यह सच है, और यह निश्चित रूप से GetModuleInformation() को कॉल करना सुविधाजनक है यदि यह मामला है (हालांकि ओपी ने प्रवेश बिंदु के लिए नहीं पूछा था)। –

2

मैं @ एडम रोसेनफील्ड के उत्तर पर थोड़ा सा विस्तार करना चाहता था। मैं यहां एक उदाहरण के रूप में लीग ऑफ लीजेंड का उपयोग करूंगा।


प्रक्रिया को खोलने के लिए आदेश में हम की जरूरत है (एक संभाल रही) यह पीआईडी ​​(प्रक्रिया ID) है। हम ऐसा कर सकते हैं एक खिड़की संभाल (HWND) क्योंकि आमतौर पर विंडो के टाइटल में जाना जाता

//You will need to change this the name of the window of the foreign process 
HWND WindowHandle = FindWindow(nullptr, L"League of Legends (TM) Client"); 
DWORD PID; 
GetWindowThreadProcessId(WindowHandle, &PID); 
PVOID hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 0, PID); 

अब है कि हम इस प्रक्रिया के लिए एक संभाल पाने के लिए की

HMODULE Module = GetModule(); 
DWORD BaseAddress = (DWORD)Module; 

GetModule आगे बढ़ें में सक्षम हैं के माध्यम से समारोह

HMODULE GetModule() 
{ 
    HMODULE hMods[1024]; 
    HANDLE pHandle = GetHandle(); 
    DWORD cbNeeded; 
    unsigned int i; 

    if (EnumProcessModules(pHandle, hMods, sizeof(hMods), &cbNeeded)) 
     { 
     for (i = 0; i < (cbNeeded/sizeof(HMODULE)); i++) 
     { 
      TCHAR szModName[MAX_PATH]; 
      if (GetModuleFileNameEx(pHandle, hMods[i], szModName, sizeof(szModName)/sizeof(TCHAR))) 
      { 
       wstring wstrModName = szModName; 
       //you will need to change this to the name of the exe of the foreign process 
       wstring wstrModContain = L"League of Legends.exe"; 
       if (wstrModName.find(wstrModContain) != string::npos) 
       { 
        CloseHandle(pHandle); 
        return hMods[i]; 
       } 
      } 
     } 
    } 
    return nullptr; 
} 

मेरे लिए व्यक्तिगत रूप से मैं मॉड्यूल प्राप्त करने के लिए 2 अलग कार्यों एक हैंडल प्राप्त करने के लिए एक और एक लिखने के लिए पसंद करते हैं।

वहां हम जाते हैं, हमने सफलतापूर्वक विदेशी प्रक्रिया का मूल पता प्राप्त कर लिया है।

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