弄了一个晚上,必竟对这些东西了解不是太深,从最初的时候想用指针解决读取的,但读出来的值一直都不准确,百度了一整个晚上找了很多的资料,最后还是用了API来读取内存的值。直接使用API中的ReadProcessMemory来读取某一个进程中的内存地址。我突然发现C#的资料实在太少了…………
主要实现代码:
const int Edx = 0x00A51178;//基址
const int EdxOffSet = 0x14C; //偏移量
int HP;
int _Process;
int pHandle;
const int PROCESS_ALL_ACCESS = 0x1F0FFF; //定义权限
#region 声明API
[DllImport("kernel32.dll")]
public static extern int ReadProcessMemory(int hProcess, int lpBaseAddress, out int lpBuffer, int nSize, int lpNumberOfBytesWritten);
[DllImport("kernel32.dll")]
public static extern int OpenProcess(int dwDesiredAccess, int bInheritHandle, int dwProcessId);
#endregion
System.Diagnostics.Process[] PinballProcessID = System.Diagnostics.Process.GetProcessesByName("TestGame"); //根据进程名获取进程ID
pHandle = PinballProcessID[0].Id; //读取进程ID
_Process = OpenProcess(PROCESS_ALL_ACCESS, 0, pHandle); //获取进程访问权
ReadProcessMemory(_Process, Edx, out HP, 4, 0); //读取基址值(仅限,基址,输出,大小)
ReadProcessMemory(_Process, HP + EdxOffSet, out HP, 4, 0); //读取内存值
差不多是这样了,说实话我对这东西还有些一知半解,不过大概能实现,今天晚上大概可以研究用WriteProcessMemory来修改内存的值了。
PS:现在这里有个问题我现在还没弄明白在这里就顺带请教大家一下,那就是我该怎样释放OpenProcess这些API资源呢?还有就是如果不调用API是否能直接读取某个进程的内存?
源:
注:在程序中有用到qf.controls这个控件,在论坛里有,大家可以找下。如果找不到的话……那再跟贴问我要吧。,现在读取的这个是个小程序,也是C#写的,我放在Debug目录下,文件名是TestGame.exe,现在读取的值就是这个东东的值。源还是保持以往的风格,简单绝无多余代码,该注释的地言都做了注释,易懂!自己给自己贴点金,其它的有问题再问吧……一不小心天就亮了,呵呵!我去早餐,然后觉觉去了。
写在最后的最后(灌下水)…………我突然发现我们坛子里的版主guoxhvip晚上5:40还在线,哈哈,又发现一个夜猫子。
[此贴子已经被作者于2007-9-16 7:43:15编辑过]