内容参考于:易道云信息技术研究院VIP课
上一个内容:物品名称与物品编号的映射关系分析-CSDN博客
通过上一个内容已经可以通过物品的id得到一个名字,知道了它的算法,它的算法自己封装好了,我们直接用就好,接下来要用到物品的指针了,所以接下来分析物品的指针怎样得到,某一个物品的指针怎样得到,然后上一个内容中分析出,它是通过调用物品类里的成员看出得到的,这个物品对象地址是通过ebx,所以接下来,看看ebx从哪来的。
首先打开x96dbg,来到下图位置(0x739915)
然后往上滑看到:ebx的值是从esi+390位置得到的,也就是说是通过传参进来的
看断点:
调用物品类成员函数位置,可以看出它与 esi+390位置得到的 内容一样,然后esi是通过ecx来到,所以它是通过上一层得到的,所以接下来去上一层,
ctrl+f9再按f8,来到上一层
上一层里的ecx,是0x22A33490
与获取名字的函数里的esi一样,然后在反上一层看看(从0x754348位置反不是下图中的位置)
然后就来到了,下图位置
然后在断点:还是0x22A33490,然后反上一层看看,现在追了这么多层还没找到,不是一件好事,这说明这个体系比较复杂
然后ctrl+f9,再按f8,来到下图位置
然后它的ecx还是没变,然后继续往上追
然后ctrl+f9,再按f8,来到下图位置
它的ecx也还是没变,然后继续往上追
然后ctrl+f9,再按f8,来到下图位置,然后游戏中鼠标一动它就会断点住,它应该是跟界面有关系,也就是说最终得到的是0x72FC98位置的函数,所以只能在 0x72FC98位置的函数里获取,然后不分析它了,但凡涉及到ui的就是很底层的代码了,这么底层的代码去找的话很累,所以不用它,不找这个麻烦,然后继续往下看
接下来找一个跟ui没关系的地方,上方式通过,鼠标放到物品上然后弹框显示内容的代码找的,所以追到ui的逻辑里面没有什么问题,然后物品只有人物独有怪物没有,所以理论上讲背包它一定是有基址的,或者有一个很方便的基址管理方法的东西,接下来通过数量的写入来找,也就是通过物品数量的写入来追,第一物品是独立的,符合追基址的假设,第二物品既然是独立的那么写入也会是相对独立的,访问会涉及到ui,但是写入就不涉及ui的事了,所以通过写入可以把ui给毙掉,然后写入它肯定会根据背包的基址计算出物品的位置,然后再改,这样我们可以获得计算物品位置的代码,也顺便知道了背包是一个链表结构还是一个数组结构了
然后关闭x96dbg,重启游戏,打开 Cheat Engine 找写入地址,地址是0x5BAF36
然后打开x96dbg,来到 0x5BAF36
然后使用物品发现它会执行两次,两次ebx的值分别是通过 Cheat Engine找到的那俩值
然后反到上一层找ebx的值在哪来的
然后下图红框位置是一个典型的数组结构,这里就有背包的意思了
然后现在确定我们要找的ecx来自于,一个数组,如上图红框位置,然后ebx是物品指针,然后ebx来自于ecx+edi*4位置那么ecx就是背包基址,看下图使用背包第一个物品时,edi是0,ecx是一个指针,ebx是物品指针,然后继续往下看
使用第二个物品是,edi是1了,也就是edi是物品在背包里的序号,然后接下来就找ecx的值从哪来的
然后ecx的值是从下图红框位置来的,然后首先esi+3A0位置是背包里第一个物品,然后下方有一个test ecx,ecx,然后紧接着一个je指令,也就是如果ecx是0它就跳转,跳转到的函数是一个报异常的函数,然后je指令的下一行是mov eax, dword ptr ds:[esi+3A4],然后sub eax,ecx,这一句的意思就是,现在假设eax的值是12(32位的内存地址是4字节,12就表示有3个地址,4+4+4=12),然后ecx的值是0,也就是12-0结果是12,然后有sar eax,2,sar是右移运算符,也就是eax/4的意思(c++代码是eax>>2),通过上方假设的值就是12/4结果是3,然后也就是数组长度是3,这样意思是计算数组长,指针是4字节所以除以4得到数组长度,然后cmp edi,eax,edi是使用的物品序号然后物品序号跟eax作比较,然后后面跟着一个jb指令,jb指令是小于就跳转,也就是说判断使用的物品下标是否超出了背包大小,如果超出了就报异常,然后edi的值我们不需要知道,然后现在计算背包大小的方式是背包结构偏移3A4与3A0位置的值相减,然后除以4的结果
背包有32个
eax的值也是32
然后通过下图可以看出背包是一个指针数组,也就是数组里面放的是指针,这个指针是指向的物品结构体
然后现在知道了怎样计算背包的大小,背包的结构是指针数组,接下来就剩分析背包的基址了