2016-05-22 13 views
5

एक प्रक्रिया के बाद से एक कंप्यूटर प्रोग्राम का एक उदाहरण है और प्रोग्राम कोड होता है और इसके वर्तमान गतिविधि, मैं निम्नलिखित बात करने की कोशिश की:सी # प्रक्रिया से कोड कैसे प्राप्त करें और फिर इसे चलाएं?

  • मेरी प्रक्रिया पार्स और बाइट्स की एक सरणी को पुनः प्राप्त।
  • उन बाइट्स निष्पादित करें।

मेरी समस्या यह है कि मैं प्रोग्राम कोड और इसकी वर्तमान गतिविधि दोनों को पुनर्प्राप्त करता हूं, जबकि मुझे केवल पहले भाग में दिलचस्पी है।

यहाँ है कैसे मैं अपने प्रक्रिया "foo" के बाइट्स पुनः प्राप्त:

public static byte[] retrieveProcessBytes(String processName) { 
     Process process = ApplicationFinder.FromProcessName(processName).First(); 
     var sharp = new MemorySharp(process); 

     List<byte> bytes = new List<byte>(); 
     IntPtr ptr = IntPtr.Zero; 
     try 
     { 
      while (true) { 
       bytes.Add(sharp.Read<byte>(ptr, 1)[0]); 
       ptr = IntPtr.Add(ptr, 1); 
      } 
     } 
     catch (Exception e) { 
      Console.Write("Exception caught : " + e); 
     } 
     return bytes.ToArray(); 
    } 

और यहाँ मैं इसे कैसे अमल करने की कोशिश है:

byte[] bytes = retrieveProcessBytes("foo"); 
Assembly asm = Assembly.Load(bytes); 
Object[] Args = new Object[0]; 
asm.EntryPoint.Invoke(null, Args); 

और यह मुझे निम्न त्रुटि देता है:

प्रकार 'System.BadImageFormatException' की एक बिना क्रिया का अपवाद mscorlib.dll

में हुई

इस बीच यदि मैं अपने "foo.exe" प्रोग्राम से बाइट पुनर्प्राप्त करता हूं और नीचे निष्पादित करता हूं, तो यह काम करता है।

Byte[] bytes = File.ReadAllBytes(pathToFooExe); 
Assembly asm = Assembly.Load(bytes); 

बाइट सरणी है कि मैं अपने प्रक्रिया से पुनः प्राप्त एक मैं अपने "foo.exe" फ़ाइल से पुनः प्राप्त की तुलना में काफी बड़ा है। क्योंकि मुझे लगता है कि मैं भी वर्तमान प्रक्रिया गतिविधि को पुनः प्राप्त करता हूं।

मैं अपनी प्रक्रिया का केवल कोड भाग कैसे प्राप्त कर सकता हूं?

क्या यह IntPtr.Zero या बाद में शुरू होता है? और मैं कब रुक जाऊं?

किसी भी मदद की सराहना की जाएगी, अग्रिम धन्यवाद।

+2

यह इसे देखने का एक बहुत ही सरल तरीका है। लेकिन आप इस तरह की एक चल रही प्रक्रिया से प्रोग्राम को निकालने नहीं कर सकते हैं। सबसे पहले स्मृति एक रैखिक ब्लॉक नहीं है, दूसरी बात प्रक्रिया में स्मृति के अन्य लोड मॉड्यूल (असेंबली/डीएलएल, आदि) भी हैं और तीसरी बार EXE फ़ाइल स्मृति में 1: 1 लोड नहीं होती है। EXE फ़ाइल प्रारूप और इसे स्मृति में कैसे लोड किया गया है, इसके बारे में अधिक जानकारी के लिए, [this] (http://wiki.osdev.org/PE#Loading_a_PE_file) देखें। – CherryDT

+1

वैसे भी इस ऑपरेशन का आपका लक्ष्य क्या है?आप जो चाहते हैं उसे हासिल करने के लिए शायद एक बेहतर समाधान है। – CherryDT

+1

मैं तुलना करना चाहता हूं कि मेरी प्रक्रिया में कोड exe फ़ाइल से एक जैसा ही है। और यदि कार्यक्रमों के लिए रनटाइम पर भिन्न होना सामान्य है, जैसे डीआरएम या सुरक्षा वाले कार्यक्रम। –

उत्तर

0

यदि आप फ़ंक्शन असेंबली के बारे में पढ़ते हैं। लोड आप देख सकते हैं कि आप इसे अनुचित तरीके से उपयोग कर रहे हैं। सिर्फ इसलिए कि यह बाइट्स की एक सरणी को इनपुट के रूप में अनुमति देता है इसका मतलब यह नहीं है कि आप इसे बाइट्स की उचित सरणी खिला रहे हैं।

Assembly.Load(Byte[])

भार एक आम वस्तु फ़ाइल स्वरूप (Coff) आधारित छवि एक उत्सर्जित विधानसभा युक्त साथ विधानसभा। असेंबली कॉलर के आवेदन डोमेन में लोड हो जाती है।

COFF file format

यह वही आपको स्पष्ट रूप से कर रहे हैं नहीं है। असल में, आप जो कर रहे हैं वह नहीं किया जा सकता है। चेरीडीटी ने आपको अपनी टिप्पणियों में ऊपर भी अच्छा कारण दिया है।

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