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

本篇文章教大家如何通过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”