2011-01-07 29 views
5

मेरे पास एक पता है जिसे मैं संशोधित करना चाहता हूं। मेरे पास प्रक्रिया है। मेरे पास नया मूल्य है। तो अब क्या?मैं एक और प्रक्रिया मेमोरी पर कैसे लिख सकता हूं?

// My Process 
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault(); 

// Address 
var addr = 0x00A66E11; 

// Value 
var val = 0x63; 

मैं कैसे लिख सकते हैं 0x63 (99) किसी अन्य प्रक्रिया स्मृति पर इस पते पर?

+0

उपयोगकर्ता 'var addr' नहीं है ... यह 'int' पर डिफ़ॉल्ट है। इसके बजाए 'IntPtr' का प्रयोग करें। – Mehrdad

उत्तर

10

@Harvey, आपका जवाब से मैं खोदा और एक बहुत पाया:

ओपन, बंद और लिखें हस्ताक्षर:

[DllImport("kernel32.dll")] 
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId); 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten); 

[DllImport("kernel32.dll")] 
public static extern Int32 CloseHandle(IntPtr hProcess); 

झंडे:

[Flags] 
public enum ProcessAccessFlags : uint 
{ 
    All = 0x001F0FFF, 
    Terminate = 0x00000001, 
    CreateThread = 0x00000002, 
    VMOperation = 0x00000008, 
    VMRead = 0x00000010, 
    VMWrite = 0x00000020, 
    DupHandle = 0x00000040, 
    SetInformation = 0x00000200, 
    QueryInformation = 0x00000400, 
    Synchronize = 0x00100000 
} 

मेरे जीवन बनाओ आसान तरीका:

public static void WriteMem(Process p, int address, long v) 
{ 
    var hProc = OpenProcess(ProcessAccessFlags.All, false, (int)p.Id); 
    var val = new byte[] { (byte)v }; 

    int wtf = 0; 
    WriteProcessMemory(hProc, new IntPtr(address), val, (UInt32)val.LongLength, out wtf); 

    CloseHandle(hProc); 
} 

किसी अन्य प्रक्रिया स्मृति में लेखन:

static void Main(string[] args) 
{ 
    var p = Process.GetProcessesByName("ePSXe").FirstOrDefault(); 

    WriteMem(p, 0x00A66DB9, 99); 
} 
+5

उह ... क्या मैं सुझाव दे सकता हूं कि आप कभी भी ** ** कभी भी स्मृति पते का प्रतिनिधित्व करने के लिए 'int' का उपयोग नहीं करते? धन्यवाद। :) – Mehrdad

+0

मैं 'IntPtr' टाइप करने के लिए बहुत आलसी हूं, लेकिन मैं इसे ध्यान में रखूंगा: पी – BrunoLM

+1

आप WriteMem() –

4

चेक बाहर WriteProcessMemory pinvoke.net

यहाँ पर StackOverflow पर एक और इसी तरह post है, लेकिन वे सी के बारे में बात कर रहे हैं ++। आप पिनवोक का उपयोग करके भी ऐसा ही कर सकते हैं।

+0

उस पर वास्तविक दस्तावेज़ीकरण और आपको आवश्यक उच्च अधिकारों की आवश्यकताएं प्रदान करें। यहां तक ​​कि एक व्यवस्थापक खाता पर्याप्त नहीं है। http://msdn.microsoft.com/en-us/library/ms681674(v=vs.85).aspx एक प्रारंभिक बिंदु है। – TomTom

+0

धन्यवाद, इस संदर्भ से मुझे बहुत कुछ मिला :) – BrunoLM

0

आप WriteProcessMemory का उपयोग कर सकते हैं, लेकिन ध्यान रखें कि आपको डीबग विशेषाधिकारों को चालू करने की आवश्यकता है, और यह Vista और बाद में कई सुरक्षित प्रक्रियाओं के साथ काम नहीं करेगा।

और आप शायद अपने आप को पैर और क्रैश चीजों में कुछ बार शूट करेंगे। मेरा सुझाव है कि जब आप ऐसा करते हैं तो आपके पास कोई महत्वपूर्ण प्रोग्राम नहीं चल रहा है।

शुभकामनाएं, आपको इसकी आवश्यकता होगी। :)

2

पी/आह्वान देशी कार्यों के बावजूद इस तरह के रूप WriteProcessMemory काम करता है पूरी तरह से, स्मृति संपादन के लिए समर्पित पुस्तकालयों मौजूद हैं और आप एक आसान तरीके से इस कार्य को पूरा करने में सक्षम बनाता है।

using(var sharp = new MemorySharp(Process.GetProcessesByName("ePSXe").FirstOrDefault())) 
{ 
    sharp[0x00A66E11, false].Write(0x63); 
} 

पिछले कोड पता नहीं है जहां मूल्य लिखा है रिबेस नहीं है मान लिया गया है:

पुस्तकालय MemorySharp का उपयोग करना, इस के रूप में संक्षेप किया जा सकता है।

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