C# 内存修改
C# 内存修改

C# 内存修改

大家好!很久不见了! 本人最近 期中考 ,所以三周断更,结果期中考试还考砸了(这不是理由)

还是写软件有意思

本篇文章教大家如何通过C#修改应用的内存

首先,我们知道,C#是无法直接修改软件内存的,所以,我们需要动态引用kernel32.dll,我们以植物大战僵尸的内存修改为例

[DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
        public static extern IntPtr OpenProcess(int desiredAccess, bool heritHandle, int pocessID);

        [DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
        public static extern void CloseHandle(IntPtr hObject);

        [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
        public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr baseaddress, IntPtr buffer, int nsize, IntPtr bytesread);

        [DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")]
        public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr baseaddress, long[] buffer, int nSize, IntPtr byteswrite);

同时,我们定义几个全局变量/常量

private const string ProcessName = "PlantsVsZombies";//进程名称
        private int sun = 9990;//每次修改的阳光数值
        private int pid;//进程PID
        private IntPtr intPtr;//阳光的地址

接下来,我们分别写几个方法,来实现修改阳光操作

1.WriteMemory

private void WriteMemory(int pid, IntPtr toBase, int num)
        {
            IntPtr process = OpenProcess(0x1F0FFF, false, pid);
            WriteProcessMemory(process, toBase, new long[] { num }, 4, IntPtr.Zero);
            CloseHandle(process);
        }

2.GetPid

private int GetPid()
        {
            Process[] processes = Process.GetProcessesByName(ProcessName);
            if (processes.Length == 0)
            {
                this.Text = "没有检测到游戏进程.";
                button1.Enabled = false;
                return -1;
            }
            if (processes.Length > 1)
            {
                this.Text = "检测到多个进程,这可能是因为您开启了多个相同进程名的软件,请关闭多余软件.";
                button1.Enabled = false;
                return -1;
            }
            if (processes.Length != 0)
            {
                this.Text = ProcessName;
            }
            return processes[0].Id;
        }

3.GetInfo

private void GetInfo()
        {
            pid = GetPid();
            if (pid == -1) return;
            int num1 = ReadMemory(pid, (IntPtr)0x006A9EC0);
            int num2 = ReadMemory(pid, (IntPtr)(num1 + 0x768));
            intPtr = (IntPtr)(num2 + 0x5560);
        }

我们的Form在Load的时候,就运行GetInfo();来获得PID

接着,我们设计一下界面

执行“确定”时,

private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                sun = int.Parse(textBox1.Text);
            }
            else
            {
                MessageBox.Show("不能键入空值","信息:");
            }
        }

执行“修改阳光”时,

private void button1_Click(object sender, EventArgs e)
        {
            WriteMemory(pid, intPtr, sun);
        }

这样,就大功告成了

我们看一下效果

感谢大家阅读!

下期教大家“骗人的Progressbar”

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注