免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了
内容参考于:易道云信息技术研究院
上一个内容:60.根据数据包内容判断数据包作用
首先整理一下现在要做的事情,之前是先通过数据包的分析,现在能够确定游戏它更新数据时,每个数据前面一定有一个数字用来代表数据的数据类型是什么(比如01代表int、02代表字符串)
如下图的1B 00,通过DataAnly.exe可以知道它是角色名字,但游戏在解读的时候它凭什么认为它是名字?所以游戏它肯定会根据 1B 00 去换算一下,通过 1B 00 得到一个结构,这个结构可以告诉游戏这个数据就是名字或者其它什么东西,也必须要有这么个东西才能够去做一件事,这种东西肯定是一个表的结构,这个表要么是通过数据包发过来的要么就是游戏客户端本身就存在的,现在做的是就是要去找游戏的这个表在哪里,之前再找解压之后的数据时,也找到了一个bool类型的表
上一个内容里找到通过x96dbg的访问断点找到的位置像是写入,因为它执行完之后数据就变成00了
然后这次下一个1字节的写入断点,如下图
然后发现它断下来的位置与上一个内容中使用访问断点断下来的位置一样,这说明这块内存空间或者说这个数据包已经被搞走了,我们找的关键点位置也就是0x1060854A位置晚了,在执行到0x1060854A之前这个数据包已经被处理了,所以我通过硬件断点与访问断点断下来的位置不对
测试上方理论是否正确,首先现在登录的角色是今晚打老虎
然后通过x96dbg把游戏数据包修改,把名字第一个字改成了 80 80
进入游戏之后,角色名并没有发生变化,这证明了 0x1060854A 位置晚了,角色信息在执行到 0x1060854A 位置之前以及被处理了。之前通过访问或者写入断点断下来的位置,应该是游戏数据包既然已经处理好了,那么那块内存空间游戏又对它进行了利用,通过访问或者写入断点断下来的时候是游戏二次利用的位置,所以才找不到那张数据类型表,接下来换一个位置拦截28号数据包
在处理28数据包的函数头部下断点,0x10608370
在头部拦截28数据包对它修改
进入游戏之后,今字变成了 肀 字
然后再重新登录,
然后再次断点在28数据包处理函数头部,使用1字节访问断点
这次就断在不同的位置了
有一个比较,用1B比较227,用的jae比较
jae指令是大于就跳转
然后可以看到下图红框位置是一个表
然后通过计算 ecx+1B*4 得出的是Name这个字符串,如下图
ecx全是内存地址,符合表的结构
表的头部是一个None,这个None之前在数据包里见过
点击进入游戏之后,接收的09数据包里有None
09后面就是227(因为是小端序所以下图中的数字是反着的)
然后09数据包里全部都是字符串后面跟着一个数字这样的结构
然后通过文本文档的搜索,可以找到Name这个字符串和它的长度
其余的不写截图了,全部都是前面字符串后面跟着一个1字节的数字,应该有227个数字
然后有了09数据包的经验,现在来解读接收的0A数据包,如下图现在就可以很好的解读出来了
0A数据包于09数据包有一点差异,0A数据包前面是字符串后面是一个数据类型个数据,然后才是数据类型
0A这种的属于结构体表,就是用一个字符串后面跟着一个个数然后跟着三个数字,这个意思,比如 AAA 3 1 4 3,现在假设1是整数,3是小数,4是文字,然后 AAA 3 1 4 3描述的结构体就是
{
int 整数;
double 小数;
char* 文字;
}
这样的一个结构
而09数据包它前面是字符串后面只有一个数字,比如 AAA 2,这个2就代表了一个完整的结构体
这就是0A和09的区别,0A描述的是结构,09描述的是结构对象