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这两个数据。为什么这两个数据这么重要?如果用扫描内存的方式来开发记牌器的话,就会遇到这种麻烦。但你的子吃敌方子而牺牲时,到底是吃的哪个子呢?这就是麻烦的地方。
转载于:https://www.cnblogs.com/birdshover/archive/2009/09/10/1563745.html
qq四国军旗2.1 beat03 builde017记牌器开发思路(二)相关推荐
- qq四国军旗2.1 beat03 builde017记牌器开发思路(一)
一.棋盘结构分析 首先,根据存档文件找到棋子 军旗:0x00000002 地雷:0x00000003 炸弹:0x00000004 司令:0x00000005 军长:0x00000006 师长:0x00 ...
- qq四国军旗2.1 beat03 builde018记牌器开发思路(三)
今天发现,四国的版本更新为18了.对应棋子内存起始值变为0x4979fc.全地址为: //C#代码 private static readonly IntPtr baseAddresss = (Int ...
- JJ斗地主记牌器java开发_【欢乐斗地主记牌器制作】遇到两个问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本菜笔准备用swing做个记牌器,但是遇到俩问题,求助大神. 先抛出最简单的问题:点击button1文本框textfield1中数字会减一,但是我怎么实现 ...
- 基于opencv2的斗地主记牌器(python)
一.开发该系统软件环境及使用的技术说明 开发环境:JetBrains PyCharm Community Edition 2019.2.5 x64 远端仓库:GitHub 语言版本:python3.7 ...
- python 实现记牌器原理
python 实现记牌器原理 方案一(减牌记牌) 方案二(增牌记牌) 字典Update更新初学者常见报错问题 方案一(减牌记牌) 假设与这"333445667788QQJ"十五张牌 ...
- 记京东Java开发实习生二面
京东Java开发实习生二面已挂,心情虽然失落,但是还是要在这里做一点作结,以便日后做些参考.让每一次失败都变的有意义! 面试流程 这次面试的流程比较简洁,首先问了两道技术问题,然后面试官对于我的简历中 ...
- 【弹子兵法】四国军棋棋盘、棋子与记谱【基础篇】
http://hi.baidu.com/%B5%AF%D7%D3%B1%F8%B7%A8/blog/item/80fdea96fbadfd55d0135eb9.html 第二课 四国军棋棋盘 ...
- 四国军旗人工智能探析提纲20070301
四国军旗人工智能探析提纲 2007.03.01 小面胡子 一. 一般棋类游戏的构成 a) 棋盘 b) 棋子 c) 规则定义 i. ...
- 【181012】VC++ 四国军旗网络游戏源代码
VC++ 四国军旗网络游戏+毕业论文,实现了一个具有小型网络游戏特征的四国军旗游戏,有一个完整的框架,数据库.服务器.客户端.大厅.游戏框架.玩家信息.游戏中的聊天.广告信息.以及防止了闪烁的画面,游 ...
- 四国军旗辅助记忆小工具
最近迷上四国军旗,四国军旗需要记忆另外三方的棋子,虽然军旗软件本身可以做标记,但是,记忆空间有限,不方便,专门用c#开发了一个小工具,辅助记忆,比较简陋,共享给有需要的朋友. 链接:https://p ...
最新文章
- mysql中一个表最多能有几个auto_mysql--一个表上可以指定几个auto_increment
- mysql索引有哪些_MySQL索引是个什么东西
- Flex与.NET互操作(九):FluorineFx.NET的认证(Authentication )与授权(Authorization)
- [Buzz.Today]2011.06.26
- MySQL HandlerSocket插件 资料
- mysql日期教程_MySQL日期函数详解
- Timus 1005. Stone pile
- STM32利用Flymcu进行烧录
- java学生宿舍管理系统,来了就点个赞再走呗,即将毕业的兄弟有福了
- ArcMap制作城市道路网壁纸(OSM道路数据下载)
- LTE物理层一些基本概念
- java转盘抽奖算法_抽奖算法 - 幸运大转盘 - java
- 转行成为数据分析师的经验分享
- 买了北京亲子年票但没有小孩的朋友,接下来的一年我都给你安排好啦!!...
- 22个月无休,华为36岁工程师在肯尼亚过劳猝死!
- python制作slack bot聊天机器人02
- Unity 制作小地图
- 城乡规划资质怎么办?
- 完美正方形---蓝桥杯练习
- SQL语句优化(雷人代码)
热门文章
- C语言实现控制台窗口隐藏
- java定时器的原理_JAVA Timer 定时器原理 | 学步园
- 支持扫描的单usb口打印服务器,USB设备服务器 轻松实现扫描仪网络共享
- 三维点云数据处理软件供技术原理说明_三维点云数据获取方法及获取系统技术方案...
- 邮箱大师支持html,网易邮箱大师使用过程的常见问题
- java实现复制粘贴功能代码,附源代码
- 平衡二叉树例题_平衡二叉树专题
- Arduino应用开发——LCD显示图片
- crc循环冗余校验码c语言,crc循环冗余校验码算法
- linux电源管理配置,Arch Linux 如何修改默认电源管理设置