前面的话:因为以前找过一个类似的基址,但是没有把过程记录下来,现在遇到同样问题又要重新来,所以这次记录一下,以备以后查阅。
776这个游戏最近更新了,表示每个动物的下注总分的内存,其基址的最后一级增加了一个变量,如图:
其中的EDX就是新增加的地址,经过简单分析,要找这个EDX值的来源可能用CE比较繁琐,所以决定上OD,OD这个强大的工具我也是刚上手。
打开OD,附加游戏进程,定位到在CE里面看到的操作该内存的指令地址:40769D,看到EDX来源:LEA EDX,DWORD PTR DS:[EDI+EDI*8],其实意思就是EDX=EDI*9。
接下来寻找EDI来源:向上查看写EDI的操作,发现最近的一处是0040762F 0FB7FF MOVZX EDI,DI,这条指令应该是把EDI高16位置零(EDI是32位的),它上面有个CALL指令,先在这个call处下断,查看一下这个call是不是改写了EDI。
对比查看,该处call并没有修改EDI的值,继续向上找,找不到直接改写EDI的指令,只有几个call。本想看看0040760E E8 9DB80100 CALL BeastDia.00422EB0这条指令有没有改写EDI,突然又发现他上面不远处又有一条指令:
004075DC FFD7 CALL EDI
004075DE 8BF8 MOV EDI,EAX
联想到一个call如果有返回值,他的返回值通常是保存在EAX中,那么这个地方的指令是不是EDI的来源呢?下断对比查看一下,果然是这改写了EDI,跟进去看看里面有什么。
跟进后发现改写返回值EAX的指令是:
10012A00 > 8B81 F4000000 MOV EAX,DWORD PTR DS:[ECX+F4]
继续单步运行,发现下面跳转到了
10012A12 FF51 40 CALL DWORD PTR DS:[ECX+40]
这条指令,继续跟,发现里面只有2条指令:
第一条:10005F20 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
这里的ESP+4是call这个地址前的最后一个push,返回去一看竟然是push EAX,也就是这个call的作用是把之前入栈的EAX的值还还给EAX,然后在把[EAX+A]的值给EAX,总之,该call执行后的结果是:EAX=[EAX+A],再返回去看EAX=[ECX+F4],那么就再返回看一下ECX。ECX的值是:2A8EFE8,看起来很熟悉,因为刚才查找其他内存基址的时候见到他好几次了,他就是第一级基址的值:[42F9E0],那么EDI的值应该就是:[[[42F9E0]+F4]+A],经检验,该地址的值和EDI的值吻合。那么最后就找到了这个新增变量的计算方法:
EDX=[[[42F9E0]+F4]+A]*9*8
而第一个动物的下注额就是:[42F9E0]+4D0+[[[42F9E0]+F4]+A]*9*8
最新评论