qq四国军旗2.1 beat03 builde018记牌器开发思路(三)
今天发现,四国的版本更新为18了.对应棋子内存起始值变为0x4979fc.全地址为:
//C#代码
private static readonly IntPtr baseAddresss = (IntPtr)(0x4979fc);
int address = baseAddresss.ToInt32();
for (int i = 0; i < 17; i++) {
for (int j = 0; j < 17; j++) {
land[i, j] = address;
address += 12;
Console.Write(land[i, j].ToString("x"));
Console.Write("\t");
}
Console.WriteLine();
}
是一个17×17的数组,元素长度12,前4字节为棋子,中间4个字节是棋子的颜色。有朋友问,确定在客户端验证?要是客户端验证就是开发作弊器而不是记牌器了。
接着前文讲,还在找CALL(前文的地址已经不适用,但是特征码还是可以使用的。)
上文说到,在MOV EAX,DWORD PTR DS:[EBX+110]和MOV EAX,DWORD PTR DS:[4976F4(更新为496754)]之间,应该有重要的数据分析段。那么整段代码就是:
0041155F 8B83 10010000 MOV EAX,DWORD PTR DS:[EBX+110]
00411565 85C0 TEST EAX,EAX
00411567 0F84 CA010000 JE JunQiRpg.00411737
0041156D 8B0D D89A4900 MOV ECX,DWORD PTR DS:[499AD8]
00411573 85C9 TEST ECX,ECX
00411575 75 06 JNZ SHORT JunQiRpg.0041157D
00411577 894C24 14 MOV DWORD PTR SS:[ESP+14],ECX
0041157B EB 0E JMP SHORT JunQiRpg.0041158B
0041157D A1 DC9A4900 MOV EAX,DWORD PTR DS:[499ADC]
00411582 2BC1 SUB EAX,ECX
00411584 C1F8 02 SAR EAX,2
00411587 894424 14 MOV DWORD PTR SS:[ESP+14],EAX
0041158B A1 54674900 MOV EAX,DWORD PTR DS:[496754]
但是进行详细跟踪以后,无法找到内存坐标(比如棋子从498638 走到 49856C这样的数据。)而里面也有有用的数据。关键是下面几句
0041156D 8B0D D89A4900 MOV ECX,DWORD PTR DS:[499AD8]
0041157D A1 DC9A4900 MOV EAX,DWORD PTR DS:[499ADC]
00411582 2BC1 SUB EAX,ECX
00411584 C1F8 02 SAR EAX,2
发现了什么?499AD8内的值,始终不变(一个生命周期内),而499ADC内的值是其增量,可以理解为一个步进,步进大小是4字节。走一步,那就是增加8,走两步就是增加12.为什么?这个值应该是描绘其完整路径的,比如,从498638 走到 49856C,就走了一步,但是它要表示其原先的位置和现在的位置,虽然是一步,但是值明显是2.
拿到这个也没有用,但是对0041158B A1 54674900 MOV EAX,DWORD PTR DS:[496754]下面的代码认真分析以后,也无法找到地址。这就说明一个问题,起始和结束标记不是用内存地址标记的。如果是用内存地址标记,在走路时候下断,在内存中必然有起始和结束地址。
换个思路,注意到文章开头讲的17维数组没?那么起始和结束也完全可能是用数组索引来实现。找一个索引为[6,15]的棋子,走到[6,14],断点后在数据段搜索 06 15或者15 06(字节高低位可能会倒过来,这是堆栈的一个特性。)没有!!!没有搜索到,贫道郁闷了....
再思考了一下整个步骤,发现漏了一个问题,搜索的时候需要搜索16进制,也就是说,需要搜索06 0F或者0F 06,一搜索,果然存在这个值的地址。通过这样的分析,发现,走路时,起始索引在00499ac6中(16字节),结束索引在00499ac8(16字节)。就在499AD8步进地址的上面,相差1行,却要分析好长时间啊。起始和结束的C++代码大体是:
typedef struct {
byte x,
byte y
} Node;
Node from;
Node to;
那么,如果需要这两个数据的话,就有两种处理方式了,就是第一篇文章讲到的,动态内存扫描或者是HOOK API.扫描的方式容易实现,但是出错的概率也高,要想不出错,最好是一直扫描,这样精度就高,但是也可能会出现数据不同步的问题,和数据库脏数据的原理一样。而 HOOK API技术难一点,程序稳定性会更好。
qq四国军旗2.1 beat03 builde018记牌器开发思路(三)相关推荐
- qq四国军旗2.1 beat03 builde017记牌器开发思路(一)
一.棋盘结构分析 首先,根据存档文件找到棋子 军旗:0x00000002 地雷:0x00000003 炸弹:0x00000004 司令:0x00000005 军长:0x00000006 师长:0x00 ...
- JJ斗地主记牌器java开发_【欢乐斗地主记牌器制作】遇到两个问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本菜笔准备用swing做个记牌器,但是遇到俩问题,求助大神. 先抛出最简单的问题:点击button1文本框textfield1中数字会减一,但是我怎么实现 ...
- 基于opencv2的斗地主记牌器(python)
一.开发该系统软件环境及使用的技术说明 开发环境:JetBrains PyCharm Community Edition 2019.2.5 x64 远端仓库:GitHub 语言版本:python3.7 ...
- python 实现记牌器原理
python 实现记牌器原理 方案一(减牌记牌) 方案二(增牌记牌) 字典Update更新初学者常见报错问题 方案一(减牌记牌) 假设与这"333445667788QQJ"十五张牌 ...
- 【弹子兵法】四国军棋棋盘、棋子与记谱【基础篇】
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 ...
- 使用双标记写html代码时如何进行嵌套,【2020Python修炼记】前端开发之 前端基础和HTML入门...
发表于:2020-11-12 18:21 阅读: 119次 这篇教程主要讲解了[2020Python修炼记]前端开发之 前端基础和HTML入门,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家 ...
最新文章
- 使用Hyperledger Ursa简化区块链安全性
- Java的异常:Error与Exception
- BGP、MPLS是怎么组合到一起的?
- Python 切片的简单讲解
- python好多模块和c相识_Python-Cext名称空间与常规Python子模块混合?
- Client Copy后的号码段重复
- 【转载】315M无线模块数据传输——深入研究
- 深入浅出FlatBuffers原理
- 「leetcode」39. 组合总和【回溯算法】详解!
- php本科毕设,基于php的新闻发布系统1本科毕设论文
- 地磅15针到9针数据线连接串口数据采集方法
- vue中使用leaflet加载地图影像并拾取坐标点
- python的struck.pack的用法:浮点转字节
- 各大硬核应用渠道开放平台SDK文档地址
- android网络诊断服务(ping网络的实现,判断网络是否可用)
- mysql中如何去除重复数据_mysql数据库如何去除重复数据
- 电脑固态硬盘接口分类
- Shortcuts快速入门
- Codeforces Beta Round #57 (Div. 2)E---Enemy is weak(树状数组+离散化)
- 决策树之CART 算法(回归树,分类树)