zoukankan      html  css  js  c++  java
  • 植物大战僵尸:查找植物叠加种植CALL

    实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物。

    我们首先需要找到植物的种植CALL,然后在逐步测试观察功能之间的变化,最终实现功能。

    种植CALL的遍历技巧:

    打开CE -> 回到游戏 -> 然后回到CE -> 扫描未知初始数

    回到游戏 -> 拿起向日葵(不要种) -> CE 搜索变动的数值 -> 回到游戏(不要动) -> 搜索未变动的数值

    回到游戏 -> 放下向日葵 -> 拿起豌豆射手 -> CE搜索 变动的数值 -> 以此重复进行

    当我们使用鼠标点击时会在一个地址写入值,当换个植物则会换一个数值,这样如此反复就会找到CALL的地址。

    1.打开CE附加游戏进程,然后搜索未知初始化数值。

    2.接着回到游戏,选择向日葵植物,然后回到CE直接搜索,变动的数值。

    3.回到游戏不要动,直接右击取消向日葵的选择,然后再次拿起向日葵,搜索未变动的数值。

    4.放下向日葵,拿起豌豆射手(不要告诉我你不知道是哪个),回到CE,搜索变动的数值。

    5.放下豌豆射手,拿起向日葵,然后CE搜索变动的数值。

    6.如上以此循环执行第4,5步,直到数据变成了几个为止,这里我找到了两个比较可疑的,只要拿起植物它就发生变化。

    7.我们在第一个地址上面,右击选择查找访问的地址,也可以选中第一行按下【F5】键,回到游戏并手动种植一个植物,会发现一条可疑汇编代码,我们先把地址记下来【00410AC1】

    这里我们只需要记录植物种下后出现的地址,前面三个分别是拿起植物和放下植物的代码,我们这里不需要考虑。

    好了,我们关闭上面的【访问地址】对话框,然后我们用同样的方式在第二个地址上操作,种下植物会发现三个可疑地址,我们直接记下来,【00410865】,【00410a91】,【0041239A】

    由于我们不知道那一个会调用种植的CALL所以,我们把这三个地址都记下来,记下来之后关闭CE就好了,后期用不到了。

    在调试之前,请你自行把阳光改多一点,方便我们调试。

    8.关闭CE后,直接打开OD并附加植物大战僵尸游戏进程,然后按下【F9】让程序先跑起来,然后【Ctrl + G】输入【00401000】回到程序领空。

    9.我们分别定位到上面找到的那几个地址上,【00410AC1】,【00410865】,【00410a91】,【0041239A】,然后观察后分别下断点。

    10.一切准备就绪了,我们回到游戏中,然后拿起一个植物,拿起植物后发现并没有断下,我们直接右击放下植物,会发现OD直接断下了,这里可以排除了,因为我们放下了植物并没有种植所以也就跳过了种植的CALL,这里没有我们直接取消下面的两个断点,然后按下【F9】让程序跑起来。

    11.接着我们继续回到游戏中,拿起植物然后种植下去,此时OD会段在第二个断点的位置上,默认关键跳转没有跳,我们直接修改标志位让其跳转实现,然后运行程序发现种下了植物,这里虽然断下了但修改后并没有停止种植,所以这里我们也排除掉,取消这里的两处断点。

    12.继续回到游戏,种下植物OD会段在以下位置,我们默认是不跳转的也就是种植,我们修改标志位观察发现,植物并没有被种下,说明这个跳转跳过了关键的种植代码,我们向下找也不难看出,于是乎我们重点分析它跳过的代码的执行轨迹。

    13.观察如上跳过的代码不难看出一堆PUSH指令,很明显这是调用CALL之前的参数传递,此时我们直接在PUSH的位置下断点,回到游戏中再次种植植物,程序会断下,我们观察程序的压站情况。

    首先我在第一行第一列种植了一个植物,观察压站情况如下所示,我已经分析好了。

    为了对比明显,我在第二行种植了一个寒冰射手,然后观察压站情况,会发现植物的未知变化和植物ID的变化。

    14.上面的对比已经非常明显了,我们直接使用代码注入器注入分别将push 5 改成【 1,2,3】,然后用【mov eax,2】控制在第几列种植,即可实现叠加效果。注意:这里的 【Push 1406FA88】每次运行程序都会改变,我这里可以注入成功,你们那里需要修改一下。

    既然找到了种植CALL的地址【00410A94】,那我们可以猜测,植物在种下之前是否会判断放入方格中是否有植物呢? 答案是肯定的,当我们在一个空地上种植的时候,我们能够种上说明条件成立,那如果方格中有植物则无法完成种植,条件也就不会成立,由此可猜到这里应该是使用一个条件判断来控制的,下面我们就去寻找这个条件判断的位置。

    15.直接打开OD,然后附加游戏并运行起来,按下【Ctrl + G】,输入【00401000】回到程序领空,然后输入【00410A94】,来到种植CALL的位置,然后向上找。

    16.由于这里我们并不知道那个跳转是影响植物的种植判断的,所以我们只能去程序的断首下断点,一步一步的单步调试。

    17.然后我们回到游戏,在已经有植物的格子里种植植物,发现程序会断下直接单步跟踪,只要不是大跳转就不需管它,在单步调试的时候,注意test 和cmp这种比较指令的状态。

    18.如下图1-2,此处的JE跳转并没有跳转成功,而且还是很大的跳转,我们鼠标向下滑,找到跳转的结束位置,发现在结束之前有一个JMP指令,由于JE没有跳转,那么肯定是执行JMP指令。

    19.接着看图1我们顺着JMP指令向下找,在图2的位置我们找到了种植CALL,也就是说它跳过了种植过程,我们继续顺着跳转红线往下找,会看到图3直接ret返回了。

    由上面的分析不难看出,由于JE跳转并没有跳转成功所以执行了JMP指令,而JMP指令恰巧跳过了种植CALL,也就是跳过了种植的过程,所以可以断定上方的JE指令必须得跳转才能实现叠加种植的效果。

    其实还有一种分析思路,我们知道如果植物种植失败肯定会Ret直接返回,所以我们直接来到程序的断尾,观察有没有直接跳转到结束的指令,然后顺着指令向上找也能够找到这个JE的位置。

    20.既然知道了JE跳转是关键,那我们就让它直接无条件跳转试试,果然可以实现叠加种植啦。

    详细分析笔记,猛戳这里:https://blib.cn/post/4420.html

  • 相关阅读:
    Codeforces Round #592 (Div. 2)C. The Football Season(暴力,循环节)
    Educational Codeforces Round 72 (Rated for Div. 2)D. Coloring Edges(想法)
    扩展KMP
    poj 1699 Best Sequence(dfs)
    KMP(思路分析)
    poj 1950 Dessert(dfs)
    poj 3278 Catch That Cow(BFS)
    素数环(回溯)
    sort与qsort
    poj 1952 buy low buy lower(DP)
  • 原文地址:https://www.cnblogs.com/LyShark/p/11213955.html
Copyright © 2011-2022 走看看