qq四国军旗2.1 beat03 builde017记牌器开发思路(二)

接着前文《qq四国军旗2.1 beat03 builde017记牌器开发思路(一)》讲,暂时不讨论内存扫描和协议解析,先重点分析HOOK API。要HOOK API,就要找到API,API怎么找?上文已经找到了播放行进音乐的CALL,一个CALL可以理解为一个函数。那么走路的过程是同级调用,还是上级调用还是下级调用呢?

先来解释下这个“级”的问题。先定义两个函数:
void PlayMusic(){

      //这个编译完后,就是一个CALL,用来播放音乐的

void DisplayMove(){

  //这个编译完后,就是一个移动的CALL

所谓同级调用,那么就是

bool FrameFunc(){

       PlayMusic();
       DisplayMove();

而上级调用呢,就是在DisplayMove中调用了PlayMusic,下级调用就是PlayMusic调用DisplayMove。根据调试的步骤,同级的话,就在当前函数找;上级的话,就要返回,步出该函数;而下级就要切入进去。操作上不一样,所以这个很重要。OD里,如果是同级调用,那么就是按F8慢慢找;上级调用,就要CTRL+F9返回到上级函数;下级的话就要在PlayMusic CALL的地方按F7切入进去。当然,我们不知道是怎么调用的,可以用排除法,搞这个就是要有耐心,呵呵。

首先是同级函数。

00411540  /$  8B4424 04     MOV EAX,DWORD PTR SS:[ESP+4]

00411544  |.  53            PUSH EBX

00411545  |.  05 17FCFFFF   ADD EAX,-3E9                             ;  Switch (cases 3E9..3ED)

0041154A  |.  55            PUSH EBP

0041154B  |.  56            PUSH ESI

0041154C  |.  83F8 04       CMP EAX,4

0041154F  |.  57            PUSH EDI

00411550  |.  8BD9          MOV EBX,ECX

00411552  |.  0F87 DF010000 JA JunQiRpg.00411737

00411558  |.  FF2485 401741>JMP DWORD PTR DS:[EAX*4+411740]

0041155F  |>  8B83 10010000 MOV EAX,DWORD PTR DS:[EBX+110]           ;  Case 3E9 of switch 00411545

上面的代码是同级函数的开头部分。可以看出,这是一个switch语句。在00411540处下断点,发现状态显示:

堆栈 SS:[0012F240]=000003EC

EAX=00000000

本地调用来自 004267AE

也就是说,这个函数是被上级函数在地址为004267AE的地方调用的。而一直按F9,发现,这是一个无限循环。使用框架开发游戏都知道,一般的游戏框架有两个无限循环。一个是用来更新数据的,做逻辑操作的,而另外一个是用来写屏幕的。那么,这个函数可以理解成HGE(C++ 2d 游戏引擎)里的FrameFunc,或者XNA(.Net的一个3D游戏开发框架)离得Update函数。那么这段代码的意思呢,就是相当于:
 bool FrameFunc(){

     switch()

          case 1:

              break;

          case 2

              break;

在CASE1处,汇编代码

0041155F  |>  8B83 10010000 MOV EAX,DWORD PTR DS:[EBX+110]           ;  Case 3E9 of switch 00411545

的地方下断点,发现,确实是走动会触发断点。这就表明,已经找到了正确的地方,至于这个CALL是在这段代码里,还是在这段代码调用的方法的里面,就需要再去分析。

开发游戏都知道,FrameFunc调用频率是跟FPS有关的,一般来说一秒钟最少要调用24次。case1的代码必然带有对多线程的处理方式,这就给分析带来了很大的难度。在0041155F处下断点后,按F9,发现这段代码不只执行一次,原理上和一个栈相似。 压入步骤,然后在RenderFunc里按步骤写入屏幕。

在004976F4地址上记录了操作数,在

0041158B  |> \A1 F4764900   MOV EAX,DWORD PTR DS:[4976F4]

处被读取,操作数被赋予EAX。在0041155F 和0041158B之间没有任何CALL,这段代码很可能与我们要找的东西有关,当然在下面肯定也能找到。一个棋子从一个地方移动到另外一个地方,上面可能已经赋予了From什么地方,TO什么地方这样的形式,而下面是对路径进行分析。

实际上我们要拿的数据也就仅仅是From和To这两个数据。为什么这两个数据这么重要?如果用扫描内存的方式来开发记牌器的话,就会遇到这种麻烦。但你的子吃敌方子而牺牲时,到底是吃的哪个子呢?这就是麻烦的地方。

四国军旗人工智能探析提纲

04-29

http://blog.csdn.net/Smile_Tiger/archive/2007/03/01/1518558.aspxrnrn 四国军旗人工智能探析提纲20070301 rn四国军旗人工智能探析提纲rnrn2007.03.01 小面胡子rnrn rnrn一. 一般棋类游戏的构成rnrna) 棋盘rnrnb) 棋子rnrnc) 规则定义rnrn i. 开局、布局rnrn ii. 行棋、行棋结果rnrn iii. 游戏结果(胜负和)rnrn iv. 轮换rnrnd) 棋盘状态描述、棋谱rnrn二. 四国军旗游戏的构成rnrna) 棋盘rnrn i. 棋盘坐标表示:以中心点为原点建立坐标表示rnrnb) 棋子rnrn4个阵营 ABCD (A为本家,B为下家,C为对家,D为上家)rnrn司1军1师2旅2团2营2连3排3兵3炸2雷3旗1rnrn不完全信息性(类似的还有暗棋、牌类)rnrn棋子的表达: 以布局时的矩阵排列顺序作为id,再加上阵营区别rnrn例: A11表示阵营为A的11号棋子rnrn rnrnA00A01A02A03A04rnrnA05 A06 A07rnrnA08A09 A10A11rnrnA12 A13 A14rnrnA15A16A17A18A19rnrnA20A21A22A23A24rnrnc) 规则定义rnrn i. 开局、布局rnrn ii. 行棋、行棋结果rnrn iii. 游戏结果(胜负和)rnrn iv. 轮换rnrnd) 棋盘状态描述、棋谱rnrn i. 客观性棋谱,只能由系统产生rnrn ii. 主观性棋谱,即该棋谱是针对某个玩家的认知角度保存信息的rnrn三. 一般棋类游戏分析的基础体系rnrna) 行棋描述、行棋结果(行棋产生棋盘状态、棋子状态变化)rnrnb) 当前棋盘状态下,符合规则的可行棋步骤rnrnc) 针对棋子身份鉴别的逻辑分析rnrn只有棋子具有不完全信息性,才能够进行这一步rnrnd) 棋盘状态的估值判定rnrne) 博弈树rnrn四. 四国军棋游戏分析的基础体系rnrna) 行棋描述、行棋结果(行棋产生棋盘状态、棋子状态变化)rnrn i. 行棋描述:rnrn阵营,棋子起始坐标,棋子目的坐标 (必须符合该棋子的移动规则)rnrn或 阵营,棋子id,棋子目的坐标 (必须符合该棋子的移动规则)rnrn ii. 行棋结果:rnrn1. 移动到该位置rnrn2. 移动过程中,是兵特有的移动轨迹, 兵现rnrn3. 如果目的坐标有敌方棋子,那么进行碰撞判断rnrna) 吃、相等、被吃 ( > = < )rnrnb) 相等+旗现(分我方、敌方、双方旗现) [司vs炸,炸vs司,司vs司]rnrnc) 被吃+我方旗现 [司vs雷]rnrnb) 当前棋盘状态下,符合规则的可行棋步骤rnrnc) 针对棋子身份鉴别的逻辑分析rnrnd) 棋盘状态的权值判定rnrne) 博弈树rnrn五. 集合与棋牌之间的逻辑关系rnrna) 全集定义rnrn i. 类型全集rnrn ii. 棋子、牌全集rnrn iii. 类型限量:具有某种类型元素属性的棋子、牌的个数(比如象棋里马2个、兵5个,牌类游戏里J4个)rnrnb) 同一律rnrnc) 排它律rnrnd) 可能性集合rnrn六. 四国军棋的集合性分析rnrna) 棋子元素 – 棋子rnrn棋子属性::rnrn唯一标识 以布局时的矩阵排列顺序作为id,再加上阵营区别rnrn类型 司军师旅团营连排兵炸雷旗 + 未知,类型决定棋子的行为rnrn rnrn类型元素 司军师旅团营连排兵炸雷旗 rnrnb) 全集定义rnrn类型全集:司军师旅团营连排兵炸雷旗rnrn棋子全集:一共25个棋子,构成棋子全集,4个阵营构成4个棋子全集。rnrnc) 各种棋子集合rnrn活子集合与死子集合、已确定身份棋子集合与未确定身份棋子集合rnrnd) 类型可能性集合rnrn类型全集下的某个棋子的可能性,即可能为哪些类型元素。当棋子的可能性集合rnrn里面的元素,经过逻辑分析判定剔除了某些元素时,我们说可能性集合范围缩小了,当缩小到只有一个元素时,我们认为该棋子身份被确定。rnrne) 棋子鉴别逻辑分析的实质rnrn行棋主动方:行棋玩家的阵营rnrn行棋主动子:行棋玩家动用的棋子。rnrn行棋被动子:与行棋主动子发生碰撞的棋子rnrn行棋被动方:行棋被动子的阵营rnrn棋子鉴别逻辑分析的实质就是在游戏过程中,每当行棋时,将根据行棋结果对行棋主动方和被动方的棋子进行逻辑分析,缩小其棋子的可能性集合范围,随着棋局的进展逐步分析认识棋局里面的棋子的本质。rnrn七. 四国军棋的棋子鉴别逻辑分析rnrna) 行棋主动子和被动子的碰撞rnrn将根据行棋结果缩小双方各自的可能性集合范围,细节略。rnrnb) 类型计数表:开局时,类型全集里面的每个类型元素设定其类型限量值,在游戏进行中,每当有一个棋子身份被确定,那么该棋子的确定类型对应的计数减1;当计数达到0,我们认为该类型被完全判定,说明此时所有身份未确定的棋子都不可能是该类型了,需要对它们的可能性集合进行该类型元素的剔除。rnrnc) 食物链:游戏过程中,对局4人行棋发生碰撞所形成的棋子碰撞图,准确地说是一棵树。rnrn例:游戏过程中发生下面的碰撞A3>B4,A3>B6,A3>D2,B5>A3,B5A11,C2=D7,A22=C21,C8>D1rnrn则有下面的食物链:rnrnC2 = D7 A22=C21 C8rnrn| | |rnrnB5 A11 D1rnrn|rnrnA3rnrn|rnrnB4-B6-D2rnrn rnrn为了较好地表示相等碰撞,食物链改成下面的表达:rnrnRootrnrn|rnrnEqual1------Equal2-------Equal3rnrn| | |rnrnC2 - D7 A22-C21 C8rnrn| | |rnrnB5 A11 D1rnrn|rnrnA3rnrn|rnrnB4-B6-D2rnrn rnrnRoot的子结点用来表达相等的情况,称为Equal结点。Equal结点会有1到2个子结点,如果为2个,说明这两个棋子发生了相等碰撞,如果为1个,说明这是一个活子,并且和其他子发生了碰撞。然后再下一层以后的所有节点都是死子。从Equal层的下一层开始,每一个结点所形成的子树称为该棋子的食物链。rnrn rnrn如图:我们称rnrnA3rnrn|rnrnB4-B6-D2 为A3棋子的食物链,以此类推rnrn rnrn食物链将随着棋局进展不断变化。rnrnd) 连锁判定:当两个棋子发生碰撞时,两个棋子的可能性集合范围缩小,那么这两个棋子各自的食物链上所有的棋子也将需要进行判定;同时如果发生了某个类型被完全判定,还需要对同阵营里面的身份未确定的棋子进行类型剔除。rnrn八. 建立在棋子鉴别逻辑分析上的概率分析rnrn其概率分析也是为了帮助认识棋子的本质。某个棋子的可能性集合里面有若干个类型元素,概率分析就是要分析出这几种类型元素所占的概率比例,其分析数据提供给人工智能模块作为分析依据。rnrn九. 建立在符合规则、棋子鉴别逻辑分析上的四国军旗人工智能展望rnrn十. 研究平台的构建设想rnrn 论坛

没有更多推荐了,返回首页