知识来源于腾讯课堂易道云
结构的解释:
计算机里的所有东西都是用二进制表示的,二进制是数字,我们用的阿拉伯数字0-9这个数字是十进制,计算机用的是二进制只有0或1,然后都是一堆0或1的数字,游戏中怎么把这一堆0或1的数字当做成血量、蓝量、攻击力、名字的?这就用到了结构
结构这个词很抽象,任何东西都可以叫做结构,在游戏中角色有血量、蓝量、攻击力、防御力...
血量、蓝量、攻击力、防御力这四个东西(角色中肯定不会只有这四个东西,比如还有经验、力量加点等,但是为了方便说明只用血量、蓝量、攻击力、防御力这四个东西来举例)组合起来产生的东西就称为结构,为了方便称呼会把血量、蓝量、攻击力、防御力产生出的东西称为人物的数据结构,结构的首地址指的是,比如血量、蓝量、攻击力、防御力,结构的首地址就指的血量,然后蓝量、攻击力、防御力、血量这时结构的首地址就指的是蓝量,然后防御力、血量、蓝量、攻击力这时结构的首地址就是防御力,这样的一个好处假设现在的结构是防御力、血量、蓝量、攻击力这样,防御力是首地址,然后知道首地址之后然后又知道防御力是由几个0或1组成的然后用首地址+防御力的0或1的个数得出的结果就是血量的位置,,结构与结构的首地址就是这样的一个意思。
然后上方提到了防御力有多个0或1,这又涉及到结构的概念了,这样产生的东西就被称为防御力结构,可能很难理解,不过现在不重要,现在只要知道防御力、攻击力...会由多个0或1组成(防御力由多个0或1组成,或者说防御力代表了多个0或1,攻击力也会由多个0或1组成,或者说攻击力代表了多个0或1),结构只是为了方便称呼多个0或1组合产生的东西,给多个0或1组合成的东西起的名字,然后防御力、攻击力...又会产生出叫人物的数据结构的东西。
然后带着上方的想法,再看下方从游戏中复制出来的人物数据
自定义数据类型也就是对象(class或struct ),然后首先定位对象头部的方式(定位尾部的后面写),在一个对象中的函数操作它内部的成员变量时本质上是this->xxx这样去获取成员变量,this->xxx这样的代码在汇编里的样子是[xx+0xXXX]它通过一个地址加偏移的方式来表示this->xxx,然后这时就去逆向找类似[xx+0xXXX]这样的汇编代码。经过 2.搜索游戏中不可见的数据坐标 它里面的分析可以确定游戏中的生命值是一个对象中的成员变量,生命值是很好触发更改的然后让怪物打我们然后跟踪是谁更改了它的值,然后Eheat Engine中有一个功能看下图:可以跟踪谁更改了它
点了找出是什么改写了这个地址之后会弹出下面的弹框,这时再让怪物打我们
在怪物打我们的时候可以看到出现了一个指令并且怪物每打一次它的计数就会加1
选择指令然后点击反汇编,这里的首地址是esi的值,esi值在详细信息里,[sei+10],这个esi位置是什么就是谁的值,它可能还会有[eax+10]、[ecx+10]...这样的写法,[eax+10]首地址就是eax的值,[ecx+10]首地址就是ecx的值
反汇编之后很满足this->xxx它的反汇编,所以它就是this->生命值,然后生命值的地址-10就是对象的指针也就是结构的首地址
知道首地址之后把添加到列表中如下图:
然后右击首地址选择浏览相关内存区域,然后复制出一段内容放到文本文档中,分析再分析结构
拿出来之后密密麻麻的数字很头疼,然后有一个分析的规则继续往下看
首先一个结构是有内存对齐的4字节对齐
class a1{
char c1;
int i1;
}
a1类的大小是8字节它会把char对齐成4字节,内存展示的样子就是 char(01 00 00 00)int( 02 03 04 05)
class a2{
char c1;
short s1;
}
a2类的大小是4字节它会把char对齐成2字节 内存展示样子char(01 00) short(11 11)
然后如果是字符串数组(char*)的类型是 11 11 31 12 00,末尾一定是00
宽字符(wchar_t*)类型是 11 00 22 00 33 00 00 00,末尾是00 00内容是每隔一个是00
一般在分析时默认分析成4字节就可以,然后字符串特殊处理按着字符数组与宽字符的特征去分解
通过上述规则分析之后:从游戏中复制出来的人物数据,下方比如2E 00 00 00它为什么不是0或1?这是因为0或1太乱了,2E是由8个0或1组成的,也就是 00101110 这个8个二进制数字的十六机制数字就是2E,8个0或1称为1字节
2E 00 00 00 // 不知道是什么
02 00 00 00 // 不知道是什么
00 00 00 00 // 不知道是什么
00 00 00 00 // 不知道是什么
78 02 00 00 // 生命值
1A 06 00 00 // 最大生命值
EC 00 00 00 // 体力
1F 01 00 00 // 最大体力
2B 01 00 00 // 内力
4B 01 00 00 // 最大内力
6E 01 00 00 // 攻击力
1D 01 00 00 // 防御
0D 00 00 00 // 不知道是什么
0D 00 00 00 // 等级
01 00 00 00 // 不知道是什么
74 0E 00 00 // 经验
26 0F 00 00 // 升级
01 00 00 00 // 移动速度
00 00 00 00 // 不知道是什么
06 00 00 00 // 不知道是什么
00 00 00 00
00 00 00 00
63 00 00 00
86 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
63 00 00 00
86 00 00 00
63 00 00 00
86 00 00 00
0A 00 00 00
01 00 00 00
01 00 00 00
00 00 00 00 00 00 00 00
01 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
01 00 00 00
01 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
C4 CF B9 AC B7 C9 D4 C6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // 人物名 32长度的char数组
7A 2D C4 CF B9 AC B7 C9 D4 C6 2E 69 6E 69 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // 32长度的char数组
7A 30 31 2D C4 CF B9 AC B7 C9 D4 C6 CA AC CC E5 2E 69 6E 69 00 00 00 00 00 00 00 00 00 00 00 00 // 32长度的char数组
70 6C 61 79 65 72 2D 6D 61 67 69 63 2D B3 A4 BD A3 2E 69 6E 69 00 00 00 00 00 00 00 00 00 00 00 // 32长度的char数组
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
D6 F7 BD C7 CB C0 CD F6 2E 74 78 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // 32长度的char数组
02 00 00 00
01 00 00 00
Eheat Engine中也有分析结构的功能
然后再选:
然后点确定
效果图:
以十六进制展示
效果图:
在Eheat Engine的分析结构工具中看不到字符串,但是把它字符串添加到列表时选择字符串勾选代码也可以看到如下图:
字符串: