追踪生物战场位置数据,按防御后ai自动行动,分析追踪到的数据,找到首先把生物战场位置改为02(02为最终站位)的代码。即005317C8 - mov [edx+38],eax这个代码
在这个代码的eax的值由ebp+08写入,分析整个函数也没有写入ebp+08的代码,只要读取ebp+08的代码,所以只能是上级函数修改这个堆栈数据
在005317C8 - mov [edx+38],eax这里断点,会发现往上4层函数都已经有这个02了,可能在4d2b13那里就已经有公式在计算生物的站位。
试试在上一层那里分析代码,返回上一层函数的地址,退出战场,读档,放火墙,在函数开头断点,点防御,发现函数刚开始ebp+08这里就已经是02了。刚好也印证了上面的分析。
返回4d2b13这个函数这里分析代码,那里的代码如下:
push 00
mov edx,[ebp-04]
mov eax,[edx+40]
push eax
mov ecx,[ebp-08]
call 004060AF
在push 00那里断点,发现push eax那里eax的值刚好就是02,而压入堆栈的值为ebp-64,把ebp-64的值改为,定位到ebp-64的地址,步进进入call 004060AF,发现ebp-64的地址会变为ebp+8的地址,按f9运行游戏,飞马的站位改变了,所以4d2b13这层函数有可能与生物最终站位有关。这个eax的值由ebp-04地址处的数据有关,修改这个ebp-04只要函数开头004D2AB9 - mov [ebp-04],ecx
退出战场,读档,放火墙,在函数开头004D2AB9 - mov [ebp-04],ecx
断点,点防御,发现函数开头那个02已经计算好了
把17ee8b0地址添加到列表,退出战场,读档,放火墙,右键看看什么改写了这里,点防御。发现0044DD12 - mov [eax+40],ecx这个代码改写了地址17ee8b0的值。ecx的值由ebp-20写入,用翻页功能去到函数开头,搜索代码ebp-20,发现只有4个地方改写了ebp-20,分别在这4个地方断点。退出战场,读档,放火墙,点防御。程序在0044D935 - mov [ebp-20],eax这里断开,eax的值刚好就是02。按f9运行,看看其他地方有没有断开,发现断开的地方也是这里,而且位置的数据是其他几队飞马的。
即call 0040949E代码修改了[ebp-20]的值,估计计算生物最终站位的代码是一个循环代码,用来计算最佳结果,在0044D935 - mov [ebp-20],eax下面有一个代码0044D960 - jmp 0044D46A,在转到44d46a那里,发现有加add *,1指令和jnl指令,是典型的循环代码。在44D46A这里搜索代码发现有四个地方有call 0040949E这个指令,分别在这4个地方断点,应该可以找到为什么贴身就可以识别的代码了。退出战场,读档,贴身放火墙,点防御,发现只会在0044D7EC - cmp esi,[ebp+eax*4-00000324]这里断开,eax的值刚好就是生物的最终站位,而且运行指令后直接回到循环的地方,并没有去到0044D935 - mov [ebp-20],eax这个把计算结果作为生物最终站位的代码那里。如果把0044D7F3 - jnl 0044D7FA改为jmp,应该生物就无法识别火墙了,经测试果真如此。猜测所以只要改这里,生物就可以识别火墙了。
44d7fa--jmp 44dd37(只能从这里插入,因为隔一隔放火墙会跳到这里)
cmp eax,0
jng 44dd7d最后
cmp eax,ba
jnl 44dd7d最后
mov ebx,eax(生物站位备份)
push 01(双格属性)
mov ecx,[ebp+08](兵种地址,用兵种内存地址)
call 0040B32A(是否有双格属性,兵种地址+84)
and eax,000000FF(计算过程,只留1字节,可以无视)
test eax,eax(计算过程,判断数值是否与双格属性相等,可以无视)
je 44dd7d(无双格属性时跳转到最后)
mov eax,ebx(生物站位还原)
mov ecx,[826c28]
add ecx,c39c
cmp [ebp+08],ecx(攻防判断)
jnl 44dd6e跳转到防守方代码处
dec eax(攻击方站位-1)
jmp 44dd6f跳到火墙判断
inc eax(防守方站位+1)
火墙判断
cmp esi,[ebp+eax*4-00000324]
jnl 44dd7d跳到最后
jmp 0044D46A
最后
push 64
push 4B
call 004019F6
jmp 44d803
在这个代码的eax的值由ebp+08写入,分析整个函数也没有写入ebp+08的代码,只要读取ebp+08的代码,所以只能是上级函数修改这个堆栈数据
在005317C8 - mov [edx+38],eax这里断点,会发现往上4层函数都已经有这个02了,可能在4d2b13那里就已经有公式在计算生物的站位。
试试在上一层那里分析代码,返回上一层函数的地址,退出战场,读档,放火墙,在函数开头断点,点防御,发现函数刚开始ebp+08这里就已经是02了。刚好也印证了上面的分析。
返回4d2b13这个函数这里分析代码,那里的代码如下:
push 00
mov edx,[ebp-04]
mov eax,[edx+40]
push eax
mov ecx,[ebp-08]
call 004060AF
在push 00那里断点,发现push eax那里eax的值刚好就是02,而压入堆栈的值为ebp-64,把ebp-64的值改为,定位到ebp-64的地址,步进进入call 004060AF,发现ebp-64的地址会变为ebp+8的地址,按f9运行游戏,飞马的站位改变了,所以4d2b13这层函数有可能与生物最终站位有关。这个eax的值由ebp-04地址处的数据有关,修改这个ebp-04只要函数开头004D2AB9 - mov [ebp-04],ecx
退出战场,读档,放火墙,在函数开头004D2AB9 - mov [ebp-04],ecx
断点,点防御,发现函数开头那个02已经计算好了
把17ee8b0地址添加到列表,退出战场,读档,放火墙,右键看看什么改写了这里,点防御。发现0044DD12 - mov [eax+40],ecx这个代码改写了地址17ee8b0的值。ecx的值由ebp-20写入,用翻页功能去到函数开头,搜索代码ebp-20,发现只有4个地方改写了ebp-20,分别在这4个地方断点。退出战场,读档,放火墙,点防御。程序在0044D935 - mov [ebp-20],eax这里断开,eax的值刚好就是02。按f9运行,看看其他地方有没有断开,发现断开的地方也是这里,而且位置的数据是其他几队飞马的。
即call 0040949E代码修改了[ebp-20]的值,估计计算生物最终站位的代码是一个循环代码,用来计算最佳结果,在0044D935 - mov [ebp-20],eax下面有一个代码0044D960 - jmp 0044D46A,在转到44d46a那里,发现有加add *,1指令和jnl指令,是典型的循环代码。在44D46A这里搜索代码发现有四个地方有call 0040949E这个指令,分别在这4个地方断点,应该可以找到为什么贴身就可以识别的代码了。退出战场,读档,贴身放火墙,点防御,发现只会在0044D7EC - cmp esi,[ebp+eax*4-00000324]这里断开,eax的值刚好就是生物的最终站位,而且运行指令后直接回到循环的地方,并没有去到0044D935 - mov [ebp-20],eax这个把计算结果作为生物最终站位的代码那里。如果把0044D7F3 - jnl 0044D7FA改为jmp,应该生物就无法识别火墙了,经测试果真如此。猜测所以只要改这里,生物就可以识别火墙了。
44d7fa--jmp 44dd37(只能从这里插入,因为隔一隔放火墙会跳到这里)
cmp eax,0
jng 44dd7d最后
cmp eax,ba
jnl 44dd7d最后
mov ebx,eax(生物站位备份)
push 01(双格属性)
mov ecx,[ebp+08](兵种地址,用兵种内存地址)
call 0040B32A(是否有双格属性,兵种地址+84)
and eax,000000FF(计算过程,只留1字节,可以无视)
test eax,eax(计算过程,判断数值是否与双格属性相等,可以无视)
je 44dd7d(无双格属性时跳转到最后)
mov eax,ebx(生物站位还原)
mov ecx,[826c28]
add ecx,c39c
cmp [ebp+08],ecx(攻防判断)
jnl 44dd6e跳转到防守方代码处
dec eax(攻击方站位-1)
jmp 44dd6f跳到火墙判断
inc eax(防守方站位+1)
火墙判断
cmp esi,[ebp+eax*4-00000324]
jnl 44dd7d跳到最后
jmp 0044D46A
最后
push 64
push 4B
call 004019F6
jmp 44d803