接着前文《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这两个数据。为什么这两个数据这么重要?如果用扫描内存的方式来开发记牌器的话,就会遇到这种麻烦。但你的子吃敌方子而牺牲时,到底是吃的哪个子呢?这就是麻烦的地方。

转载于:https://www.cnblogs.com/birdshover/archive/2009/09/10/1563745.html

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

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

    一.棋盘结构分析 首先,根据存档文件找到棋子 军旗:0x00000002 地雷:0x00000003 炸弹:0x00000004 司令:0x00000005 军长:0x00000006 师长:0x00 ...

  2. qq四国军旗2.1 beat03 builde018记牌器开发思路(三)

    今天发现,四国的版本更新为18了.对应棋子内存起始值变为0x4979fc.全地址为: //C#代码 private static readonly IntPtr baseAddresss = (Int ...

  3. JJ斗地主记牌器java开发_【欢乐斗地主记牌器制作】遇到两个问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本菜笔准备用swing做个记牌器,但是遇到俩问题,求助大神. 先抛出最简单的问题:点击button1文本框textfield1中数字会减一,但是我怎么实现 ...

  4. 基于opencv2的斗地主记牌器(python)

    一.开发该系统软件环境及使用的技术说明 开发环境:JetBrains PyCharm Community Edition 2019.2.5 x64 远端仓库:GitHub 语言版本:python3.7 ...

  5. python 实现记牌器原理

    python 实现记牌器原理 方案一(减牌记牌) 方案二(增牌记牌) 字典Update更新初学者常见报错问题 方案一(减牌记牌) 假设与这"333445667788QQJ"十五张牌 ...

  6. 记京东Java开发实习生二面

    京东Java开发实习生二面已挂,心情虽然失落,但是还是要在这里做一点作结,以便日后做些参考.让每一次失败都变的有意义! 面试流程 这次面试的流程比较简洁,首先问了两道技术问题,然后面试官对于我的简历中 ...

  7. 【弹子兵法】四国军棋棋盘、棋子与记谱【基础篇】

    http://hi.baidu.com/%B5%AF%D7%D3%B1%F8%B7%A8/blog/item/80fdea96fbadfd55d0135eb9.html 第二课      四国军棋棋盘 ...

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

    四国军旗人工智能探析提纲 2007.03.01 小面胡子   一.         一般棋类游戏的构成 a)         棋盘 b)        棋子 c)        规则定义 i.     ...

  9. 【181012】VC++ 四国军旗网络游戏源代码

    VC++ 四国军旗网络游戏+毕业论文,实现了一个具有小型网络游戏特征的四国军旗游戏,有一个完整的框架,数据库.服务器.客户端.大厅.游戏框架.玩家信息.游戏中的聊天.广告信息.以及防止了闪烁的画面,游 ...

  10. 四国军旗辅助记忆小工具

    最近迷上四国军旗,四国军旗需要记忆另外三方的棋子,虽然军旗软件本身可以做标记,但是,记忆空间有限,不方便,专门用c#开发了一个小工具,辅助记忆,比较简陋,共享给有需要的朋友. 链接:https://p ...

最新文章

  1. mysql中一个表最多能有几个auto_mysql--一个表上可以指定几个auto_increment
  2. mysql索引有哪些_MySQL索引是个什么东西
  3. Flex与.NET互操作(九):FluorineFx.NET的认证(Authentication )与授权(Authorization)
  4. [Buzz.Today]2011.06.26
  5. MySQL HandlerSocket插件 资料
  6. mysql日期教程_MySQL日期函数详解
  7. Timus 1005. Stone pile
  8. STM32利用Flymcu进行烧录
  9. java学生宿舍管理系统,来了就点个赞再走呗,即将毕业的兄弟有福了
  10. ArcMap制作城市道路网壁纸(OSM道路数据下载)
  11. LTE物理层一些基本概念
  12. java转盘抽奖算法_抽奖算法 - 幸运大转盘 - java
  13. 转行成为数据分析师的经验分享
  14. 买了北京亲子年票但没有小孩的朋友,接下来的一年我都给你安排好啦!!...
  15. 22个月无休,华为36岁工程师在肯尼亚过劳猝死!
  16. python制作slack bot聊天机器人02
  17. Unity 制作小地图
  18. 城乡规划资质怎么办?
  19. 完美正方形---蓝桥杯练习
  20. SQL语句优化(雷人代码)

热门文章

  1. C语言实现控制台窗口隐藏
  2. java定时器的原理_JAVA Timer 定时器原理 | 学步园
  3. 支持扫描的单usb口打印服务器,USB设备服务器 轻松实现扫描仪网络共享
  4. 三维点云数据处理软件供技术原理说明_三维点云数据获取方法及获取系统技术方案...
  5. 邮箱大师支持html,网易邮箱大师使用过程的常见问题
  6. java实现复制粘贴功能代码,附源代码
  7. 平衡二叉树例题_平衡二叉树专题
  8. Arduino应用开发——LCD显示图片
  9. crc循环冗余校验码c语言,crc循环冗余校验码算法
  10. linux电源管理配置,Arch Linux 如何修改默认电源管理设置