需要用到的函数
3个 API函数
1: GetWindowThreadProcessId :获取进程ID
2:OpenProcess :获取进程句柄
3: ReadProcessMemory :读出指定进程 指定位置 的数据到缓冲区
4:WriteProcessMemory :写出指定数据 到进程的内存地址中
DWORD GetWindowThreadProcessId(
HWND hWnd, // 窗口句柄 由FindWindow获取
LPDWORD lpdwProcessId // 存放进程ID的 变量
);
HANDLE OpenProcess(
DWORD dwDesiredAccess, // PROCESS_VM_READ or PROCESS_VM_WRITE 访问权限
BOOL bInheritHandle, // 这个是继承标志 在这里 为false
DWORD dwProcessId // 进程ID 由GetWindowThreadProcessId 获取
);
BOOL ReadProcessMemory(
HANDLE hProcess, // 进程句柄 由OpenProcess函数获取
LPCVOID lpBaseAddress, // 要读出数据的地址:$47d814
LPVOID lpBuffer, // 用于存放读取数据的地址:sitNum
DWORD nSize, // 要读出的数据大小 4
LPDWORD lpNumberOfBytesRead // 读出数据的实际大小
);
WriteProcessMemory( HANDLE hProcess, // 进程句柄 由OpenProcess函数获取,进程打开的权限可能需要Winapi.Windows.PROCESS_ALL_ACCESS,才能写
LPCVOID lpBaseAddress, // 要写出数据的地址:$47d814
LPVOID lpBuffer, // 用于存放读取数据的地址:sitNum
DWORD nSize, // 要写出的数据大小 4
LPDWORD lpNumberOfBytesRead // 写出的数据
);
具体代码参考
//从程序读出棋盘数据 到数组里边
const GameName=‘窗口标题’
const sitNumBase= 16进制内存地址;
var
PidGame :DWORD; //用来保存进程ID
hGame :HWND; //用来保存游戏窗口句柄
readByte:DWORD; //用来保存 实际读取的字节数
ChessData:Array[1…8,1…25] of byte; //定义的一个棋盘数组
//4个基址号
var sitBase:array[0…3] of ^integer=(Pointer($0047A318),Pointer($0047AEF4),
Pointer($0047BAD0),Pointer($0047C6AC));
Function UpDataChess():boolean;
begin
//获取游戏窗口句柄
hGame:=Findwindow(nil,GameName);
//获取游戏进程 PID
windows.GetWindowThreadProcessId(hGame,PidGame) ;
//获取游戏进程句柄 hProcess:=windows.OpenProcess(windows.PROCESS_ALL_ACCESS,false,PidGame);
//读出当前坐位号 windows.ReadProcessMemory(hProcess,Pointer(sitNumBase),sitNumP,4,readByte);
//读出棋盘数据到数组 windows.ReadProcessMemory(hProcess,sitBase[sitNum],@ChessData[1][1],200,readByte);
//写出数据
WriteProcessMemory(hProcess,sitBase[sitNum],@ChessData[1][1],200,readByte);
//释放进程句柄
result:=CloseHandle(Hprocess);
end;