一、分析
分析棋盘结构,猜测棋盘的数据是一个二维数组,棋盘是一个9*10或者是一个10*9的数组,先朝这个方向去尝试分析
程序内部可能是定义了一个这样的二位数组char[10][9]或者char[9][10]
也可能是int[10][9]或者int[9][10],还有可能是一个结构体的数组,腾迅开发人员具体用什么类型我们无从得知只能通过不断去尝试,试错来分析。
char chessArray[10][9];
int chessArray[10][9]
Chess chessArray[10][9]
继续猜测分析:二维数组的每个元素是描述一个棋子的,是什么颜色什么棋,总共有32个棋子,猜测描述这些的棋子的属性用255种足可以描述完毕。
例如:红车是1,红马是2,红象是3等。
`
二、试错
通过CheatEngine工具,可以扫描进程的内存数据,不断调整棋子的位置,找到棋盘的大概位置
加载QQ象棋进程:如下图所示。
新扫描类型选择“值介于...两者之间”,数值为0到255之间,数值类型先选择4字节,点击首次扫描。
初次扫描,满足条件的内存有500多万条,如下图
修改扫描类型:为变动的数值,我们尝试来回重复移动一个棋子,每次搜索都搜索变动的数值,这样就可以迅速过滤掉大量的数据。
本例中是尝试车1进1,搜索一次,
车一退一搜索一次。
多次之后最后过滤到少量内存如下图
这三个地址相隔比较近,可以打开一起查看,
选择其中一个绿色地址打开继续分析,如下图:
将界面最大化后,每当我们移动棋子时,我们可以观察到,界面上面有颜色闪动变化,如下图所示,我们可以推断这些变化就是棋子的变化
不断地移动棋子,可以推算出每个棋子的值,而且可以算出棋盘的数组范围