忽然间产生了对反汇编的兴趣,那么按耐不住自己的内心了,又因自己什么也不会,不会解密,不会脱壳等等……
不过,既然突然有了兴趣,总要干点什么,于是,就拿新手之王的“植物大战僵尸”来作为实验样品吧。
所需工具:
CE
OD
OK,准备好工具之后,我们就要开始了,
首先打开“植物大战僵尸”,进入游戏,接下来鼠标右键“以管理员身份”打开“CE”并如图所示:
点击左上角的“小电脑”图标
先选择上方的“应用程序”→选择“植物大战僵尸中文版”→“调试器附加到进程”
输入我们当前的阳光数值“50”到如下图的编辑框内
然后我们点击“首次扫描”
之后我们花费一些阳光值(随便栽种一颗植物),然后我们再次在编辑框里输入改变后当前的阳光值“0”→“再次扫描”
不行,搜索的结果还是太多了,我们继续重复,收一个“太阳”然后我们的阳光值变为“25”,之后我们再次在编辑框里输入我们当前的阳光值“25”→“再次扫描”
之后我的只剩下一个结果了(若你们的还有很多结果,请重复上述的方式继续)
我们右键并选择“找出是什么改写了这个地址”
然后会有一个“空白”窗口,我们继续游戏,继续改变一下“阳光值”之后会出现如下图所示:我们先记录一下指令的前八个数值(地址)“00430A11”并选择此行并且点击“显示反汇编程序”
之后会弹出如下窗口:
分析下图语句:
add [eax+00005560],ecx //意思是 寄存器eax偏移5560之后这个整体加上寄存器ecx,我们可以理解为,此游戏把阳光那个位置当做空格,+上ecx里面的值就是我们的阳光值,向上滑动,我们寻找到ecx的值,
mov ecx,00000019 意思是将“00000019”存放到寄存器ecx中,又计算器得出,”00000019″十六进制转换十进制得,恰好是“25”恰好是我们刚刚收集阳光的数值“25”为了进一步确定该ecx是否存放我们的阳光值,我们不妨下个断点(当程序执行这条语句时,遇见断点程序会卡住不继续运行(暂停)),
我们选择此行,并按下F5下断点,
之后我们回到游戏里,收集一下阳光看看是否成功断下,
如下图,断点成功检测到,说明我们之前所说的,此ecx就是存放单个阳光的阳光值大小,那么我们是不是只要修改了它就能达到瞬间阳光“9999999…”了
之后我们可以关闭CE了(游戏先不要关,其实关不关无所谓),我们鼠标右键“以管理员身份”打开OD,如下图:“文件”→“附加”
找到我们的正在运行的游戏,并点击“附加”
载入之后,我们按“Ctrl+G”并且输入我们之前记录的地址“00430A11”并点击“OK”
之后我们跳转到这里
我们双击此行(我们刚刚跳转的这一行),并且将后面的ecx修改为寄存器里其他有大数值的分区,这里我将ecx换为esp(PS:这里都是十六进制的数值),原来想修改为“esi”不过想了想,算了,用不到那么大的(其实我怕会有什么麻烦),修改之后我们点击“汇编”
之后我们点击“全部复制”
我们来运行一下,看看修改的是否成功,
继续游戏,试一试,采集个太阳看看阳光值如何增加
测试图如下,果然成功了
OK,成功了,我们接下来就要保存我们修改的文件了,
鼠标右键,“复制到可执行文件”→“所有修改”
然后出现此窗口,我们继续右键点击,选择“保存文件”
修改下名字,避免重名,
最后我们运行下这个“PlantsVsZombies-无限阳光.exe”检验下是否真的修改成功了,如下GIF:
下一集预览(植物无敌(原理僵尸为植物加血))GIF:
评论抢沙发