C# 读写内存---by wgscd

本文介绍了一种在Windows平台上通过读取特定游戏进程的内存地址来获取游戏计时的方法,以扫雷游戏为例,展示了如何使用C#编程语言实现定时器功能,实时更新游戏时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

105032-20161205150959007-1563550009.png

测试 在Windows窗口 放个Timer用于读取扫雷游戏的计时。

按钮点击讲设置 计时为0;

先可看怎么找内存地址: http://jingyan.baidu.com/article/93f9803fe721f1e0e56f5572.html

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
timer1.Interval= 500;
}
private int baseAddress = 0x006A9EC0; //游戏内存基址
private string processName = "PlantsVsZombies"; //游戏进程名字
//读取制定内存中的值
public int ReadMemoryValue(int baseAdd)
{
return Helper.ReadMemoryValue(baseAdd, processName);
}

    //将值写入指定内存中
    public void WriteMemory(int baseAdd, int value)
    {
        Helper.WriteMemoryValue(baseAdd, processName, value);
    }


    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            baseAddress = 0x0100579C;
            // int.Parse(txtBaseAddress.Text.Trim());

            processName = txtProcessName.Text.Trim();

            processName = "winmine";//干脆设置为扫雷的进程名
            Text = "" + baseAddress;
            WriteMemory(baseAddress, 0);//设置地址值为0,本例子为扫雷计时值
        }
        catch(Exception ex) {
            MessageBox.Show(ex.Message );
        }

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        try
        {


             baseAddress = 0x0100579C;
            // int.Parse(txtBaseAddress.Text.Trim());

            processName = txtProcessName.Text.Trim();

            processName = "winmine";
            Text = "" + baseAddress;
            Text =""+ ReadMemoryValue(baseAddress); 


        }

        catch {
        
        }

    }





}

Helper class

using System;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ReadMem
{

public abstract class Helper
{
    [DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")]
    public static extern bool ReadProcessMemory
        (
            IntPtr hProcess,
            IntPtr lpBaseAddress,
            IntPtr lpBuffer,
            int nSize,
            IntPtr lpNumberOfBytesRead
        );

    [DllImportAttribute("kernel32.dll", EntryPoint = "OpenProcess")]
    public static extern IntPtr OpenProcess
        (
            int dwDesiredAccess, 
            bool bInheritHandle, 
            int dwProcessId
        );

    [DllImport("kernel32.dll")]
    private static extern void CloseHandle
        (
            IntPtr hObject
        );

    //写内存
    [DllImportAttribute("kernel32.dll", EntryPoint = "WriteProcessMemory")]
    public static extern bool WriteProcessMemory
        (
            IntPtr hProcess, 
            IntPtr lpBaseAddress, 
            int[] lpBuffer, 
            int nSize, 
            IntPtr lpNumberOfBytesWritten
        );

    //获取窗体的进程标识ID
    public static int GetPid(string windowTitle)
    {
        int rs = 0;
        Process[] arrayProcess = Process.GetProcesses();
        foreach (Process p in arrayProcess)
        {
            if (p.MainWindowTitle.IndexOf(windowTitle) != -1)
            {
                rs = p.Id;
                break;
            }
        }

        return rs;
    }

    //根据进程名获取PID
    public static int GetPidByProcessName(string processName)
    {
        Process[] arrayProcess = Process.GetProcessesByName(processName);

        foreach (Process p in arrayProcess)
        {
            return p.Id;
        }
        return 0;
    }

    //根据窗体标题查找窗口句柄(支持模糊匹配)
    public static IntPtr FindWindow(string title)
    {
        Process[] ps = Process.GetProcesses();
        foreach (Process p in ps)
        {
            if (p.MainWindowTitle.IndexOf(title) != -1)
            {
                return p.MainWindowHandle;
            }
        }
        return IntPtr.Zero;
    }

    //读取内存中的值
    public static int ReadMemoryValue(int baseAddress,string processName)
    {
        try
        {
            byte[] buffer = new byte[4];
            IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址
            IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName));
            ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 4, IntPtr.Zero); //将制定内存中的值读入缓冲区
            CloseHandle(hProcess);
            return Marshal.ReadInt32(byteAddress);
        }
        catch 
        {
            return 0;
        }
    }

    //将值写入指定内存地址中
    public static void WriteMemoryValue(int baseAddress, string processName, int value)
    {
        IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); //0x1F0FFF 最高权限
        WriteProcessMemory(hProcess, (IntPtr)baseAddress, new int[] { value }, 4, IntPtr.Zero);
        CloseHandle(hProcess);
    }
}

}

转载于:https://www.cnblogs.com/wgscd/articles/6134019.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值