用CE来找出对对碰游戏 坐位号基址,棋盘数组基址 并把它读出来
1、预备知识
4种数据类型
字节 Byte=00-FF 0-255 8bit
字 WORD =2Byte= $0000至 $FFFF 0-65535 16bit
双字 DWORD =4Byte= $00000000至$FFFFFFFF 0-4294967295 32 bit
整型 integer=4Byte=-$80000000至$7FFFFFFF -2147483648,2147483647 32bit
游戏基址:就是一个全局变量存放数据的起始地址。
准备工具 CE (全称Cheat Engine V5.4)
打开QQ对对碰游戏
打开内存搜索工具 CE
找坐位号基址: $0047d814
我们搜索在 0-3以内的数值 数值类型选DWORD 双字
找对应坐标号 棋盘数组基址:$47A318
我们搜索 棋盘数组的 第一格 数值类型设为 BYTE 字节
1青蛙 2鸭子 3猫 4熊猫 5狐理 6牛头 7猴子
Y=25
X=8
1号位:$47A318
2号位:$47C6AC
3号位: $47BAD0
4号位: $47C6AC
2、编写程序
3个 API函数
GetWindowThreadProcessId :获取进程ID
OpenProcess :获取进程句柄
ReadProcessMemory :读出指定进程 指定位置 的数据到缓冲区
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 // 读出数据的实际大小
);
具体代码
//从对对碰程序读出棋盘数据 到棋盘数组里边
const GameName='对对碰角色版'
const sitNumBase= ;
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);
//释放进程句柄
result:=CloseHandle(Hprocess);
end;
1、预备知识
4种数据类型
字节 Byte=00-FF 0-255 8bit
字 WORD =2Byte= $0000至 $FFFF 0-65535 16bit
双字 DWORD =4Byte= $00000000至$FFFFFFFF 0-4294967295 32 bit
整型 integer=4Byte=-$80000000至$7FFFFFFF -2147483648,2147483647 32bit
游戏基址:就是一个全局变量存放数据的起始地址。
准备工具 CE (全称Cheat Engine V5.4)
打开QQ对对碰游戏
打开内存搜索工具 CE
找坐位号基址: $0047d814
我们搜索在 0-3以内的数值 数值类型选DWORD 双字
找对应坐标号 棋盘数组基址:$47A318
我们搜索 棋盘数组的 第一格 数值类型设为 BYTE 字节
1青蛙 2鸭子 3猫 4熊猫 5狐理 6牛头 7猴子
Y=25
X=8
1号位:$47A318
2号位:$47C6AC
3号位: $47BAD0
4号位: $47C6AC
2、编写程序
3个 API函数
GetWindowThreadProcessId :获取进程ID
OpenProcess :获取进程句柄
ReadProcessMemory :读出指定进程 指定位置 的数据到缓冲区
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 // 读出数据的实际大小
);
具体代码
//从对对碰程序读出棋盘数据 到棋盘数组里边
const GameName='对对碰角色版'
const sitNumBase= ;
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);
//释放进程句柄
result:=CloseHandle(Hprocess);
end;