سؤال

لدي عنوان أود تعديله. لدي العملية. لدي القيمة الجديدة. إذن ماذا الآن؟

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

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

كيف يمكنني الكتابة 0x63 (99) لهذا العنوان على ذاكرة عملية أخرى؟

هل كانت مفيدة؟

المحلول

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);
}

نصائح أخرى

الدفع WriteProcessMemory في pinvoke.net

هنا آخر مشابه بريد على Stackoverflow لكنهم يتحدثون عن C ++. يمكنك أن تفعل الشيء نفسه باستخدام بينفوك.

على الرغم من P/استدعاء الوظائف الأصلية مثل WriteProcessMemory يعمل بشكل مثالي ، والمكتبات المخصصة لتحرير الذاكرة موجودة وتمكنك من إنجاز هذه المهمة بطريقة أسهل.

باستخدام المكتبة MemorySharp, ، يمكن تلخيص ذلك على النحو التالي:

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

يفترض الرمز السابق العنوان الذي تتم فيه كتابة القيمة لا يتم إعادة تربيته.

يمكنك استخدام WriteProcessMemory, ، لكن كن على دراية بأنك بحاجة إلى تشغيل امتيازات التصحيح ، وأنها لن تعمل مع الكثير من العمليات المضمونة في Vista وبعد ذلك.

وربما ستطلق النار على نفسك في القدم وتعطل الأشياء عدة مرات. أقترح ألا يكون لديك أي برامج مهمة تعمل عند القيام بذلك.

حظا سعيدا ، ستحتاج إليها. قون

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top