其实是和第三课有雷同的,因为阳关下落也应该有个定时器,所以只要找到那个定时器的值就可以实现漫天星。
上神器ce 搜索未知的初始化值
然后切回游戏 在切回CE搜改变的值 ,因为他内部有定时器的话 他会一直变 这个步骤可以重复个3-5遍 应该能过滤掉很多 不相干的值
也可以切回游戏不要点这个返回游戏按钮 搜索未变动的值 然后可以多点几次 因为他一直没有变动
然后接着继续返回上一步骤 当有阳光落下的时候 可以搜增加的值
搜完之后 回到游戏 可以接着搜 减少的值
为什么要这样做呢 因为定时器 只有两种可能 一种是自增的 一种是自减的 这个定时器用的就是自减的 所以这样搜就能搜到
可以搜比0大的 当落了一下新的阳关的时候搜增加的 因为这个定时可能重置了 所以搜增加的话 能过滤掉很多无关的数据
然后再搜减少的 因为这个时候的定时器 会继续减 但是也可能会出现跟我差不多的情况 就是还有几百个 如图
这个时候 可以依照编程经验来判断 定时的值 应该不会大于多少 比较合适
比如图中就有一些非常大的值 明显就不可能是的 为了 过滤 我们可以搜比65535小的值 因为这个游戏的定时器 确实么有超过65535的
你可能会问我 为什么知道 试出来的
这样就剩4个 感觉很像的 然后进游戏 2秒钟所以 会看到如下图
这样就可以判断 最后一个值可能就是定时器了 他最符合定时器的特点 我们可以修改一下这个值 看看会不会出一个新的阳光
当我们修改成1的时候 会发现 他确实出了一个阳光
至此对于普通游戏玩家已经可以结束了 对于逆向 我们才开始
右键是谁修改了这个值
可以看到就这一条 进游戏附加 ctrl+G 413b7c 图中可以看到 他有一个加的操作 但是加的是负数 这样就实现了一个减的操作
然后再4013bcb的位置有一个给5538赋值的操作 那么我们下断在这里 看一下他的执行流程
然后进入游戏 会发现 进入游戏之后会被执行断在这里 然后zf是0 跳转是实现的 这样的话就说明 里面这段代码可能就是重置的代码 如果不是重置 他肯定每次都会被执行 他每次都是跳转的
那么一般思路来说 肯定是吧这个jnz给nop了 但是这样的话 不见得就能实现无限下落阳光 所以还是修改esi+5538的值或者上边的比较的值比较靠谱
但是因为我们不知道 他上边的值 是干什么的 而且在前期 我们通过在CE修改1的时候 也确实实现了下落阳光 那么这里的思路就是我们直接修改这个内存地址里的值 改为1 (为什么要改为1而不是0 因为当先代码已经执行了 如果是0的话 他下次再到这段修改将会变成一个负数会是一个极大的值 所以这里改1)
这样当他下次执行到这里的时候 应该会有一个标志位 会被置上 但是具体是几可能不知道 但是应该可以进入这个代码段内
修改之后 我们让游戏跑起来 继续执行
这个时候发现 虽然eax还是0 但是zf标志位已经被置1了 说明他前面哪个地方执行了一些什么操作 这里就不管了
既然执行了 我们就向下看 发现553c的位置被加1 通过对游戏的比对 可以确定 这个值应该是阳光总数的计数器
然后计算完成之后来到这里 发现eax的值是244也就是十进制的580 又写回esi+5538的位置
而当前 esi + 5538的值是0 当执行这一步之后
发现确实esi+5538的值被重置了
当我们继续运行之后 下次在到这个地方的时候 发现跳转是成功的
同时esi+5538的值也被减1 这样的话就说明 只要能保证esi+5538里的值 一直是1 就可以实现无限下阳光
那么我们需要改的地方也很简单 既然想让当前的5538的值一直为1 值需要修改他的重置代码的部分 就可以实现
他本身重置为0x244 我们让他直接重置为1 即可实现
这里为什么要用inc 因为这段代码只有当esi+5538等于0的时候才会进入 而且使用inc值需要改动一个字节 如果用mov 会改动一篇
这样当这段执完成的时候esi+5538就会被置1 然后下一次执行到上面esi+5538的值会减1 就又会进入这个代码 这样如此反复就形成了漫天星。