同样的代码,只修改进程名字和内存地址,植物大战僵尸可以正常取值,暗黑2无法取出,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace 读内存地址
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, IntPtr lpNumberOfBytesRead);
[DllImportAttribute("kernel32.dll", EntryPoint = "WriteProcessMemory")]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, int[] lpBuffer, int nSize, IntPtr lpNumberOfBytesWritten);
[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);
public static int GetPidByProcessName(string processName)
{
Process[] arrayProcess = Process.GetProcessesByName(processName);
foreach (Process p in arrayProcess)
{
return p.Id;
}
return 0;
}
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);//这里断点hProcess为0,但植物大战僵尸是1,是不是OpenProcess这里错了
CloseHandle(hProcess);
return Marshal.ReadInt32(byteAddress);//是不是这里的方法不对
}
catch
{
return 1;
}
}
private int baseAddress = 0x049F076C;
private string processName = "Game";
private void button1_Click(object sender, EventArgs e)
{
if (GetPidByProcessName(processName) == 0)
{
MessageBox.Show("游戏没有运行!");
return;
}
if (button1.Text == "开启")
{
button1.Text = "关闭";
timer1.Enabled = true;
}
else
{
button1.Text = "开启";
int address = ReadMemoryValue(baseAddress, processName);
label1.Text = address.ToString();
}
}
}
}