[100%原创][01/24更新] CE修改实战——《行星遭遇攻击》无敌修改(提高篇已补完)
本帖最后由 ioncannon 于 2013-1-24 19:01 编辑前阵子看了某位大大的CE修改器教程贴后深受启发,感觉我也应该将自己的修改经验分享出来,于是就想到写个修改实战的帖子。
正巧看到了一款正对我胃口的游戏,《行星遭遇攻击》(解说视频贴)。我比较菜打不过去,能找到的修改器又不是特给力,就计划拿此游戏开刀,将修改过程记录下来,希望对修改新手们有些借鉴意义。
本人以前没用过CE,初次使用觉得这是款极其强大的工具,靠着以前修改游戏的一点底子,过了教程后就上路了。由于是CE新手,修改流程中难以做到尽善尽美,还望高手们指正。另外不会设回复可见,就不搞那玩意儿了,觉得好就小小顶一下吧{:3_112:}
基础篇
修改游戏最适合的入手点莫过于改钱了,这款游戏也不例外。我们要做的基本分两步:找到钱存哪里,然后做你想要的修改。(废话)
首先当然要启动游戏,然后启动CE并选中游戏进程:
为方便修改,建议将游戏切到窗口模式,然后进游戏选人类随便开一局。建议选一开始的关卡,简洁明了。我选了第一关(First Blood Elimination),中等难度。钱的数量会显示在左上角:
此时你要做的是记住你的钱是多少然后快速暂停游戏(从游戏里切出来就会自动暂停),进CE,将你的钱填入搜索数值框里。扫描类型选“精确数值”(表示只搜索你指定的那个值)。
数值类型选什么?根据经验,游戏里最常见的两种类型是“4字节”(32位整数类型)和“浮点数”(单精度浮点类型),如果不确定,你可能需要一个一个试或选择“全部”以搜索所有数值类型。幸运的是,我知道这游戏里钱是个浮点数,所以你直接选“浮点数”就好了{:3_140:}
选了“浮点数”后,右边会出现三个选项。这里我要吐槽一下翻译,完全不知所云{:3_124:} 英文好的尽量用英文原版。其实这里是选择舍入方法,前两个是“全面”其实是“四舍五入”,第三个是“简化”应该是“截断”。比如现在搜索300这个值,选“四舍五入”就会搜索所有299.5 ~ 300.5之间的值,而选“截断”就是搜索所有整数部分为300的值而无视小数部分,即区间 [300, 301)。两个“四舍五入”选项之间有什么区别我也不知道。不知道该选哪个就要一个一个试。这里选择“截断”(即界面上的“简化”),因为我又知道了{:3_117:}
其他选项留默认值不动(一般也不需要动),最后点“首次扫描”。
不出意外的话,左边应该列出很多符合条件的结果了。下面要做的是缩小范围,在这堆候选结果中找到谁才是真正存钱的地方。
尽情去游戏里花钱吧,然后把数值再记下来并快速暂停游戏。我不知道哪个是暂停键,调出菜单又看不到钱~~我的土方法是:点击任务栏,然后游戏就暂停了,且能看到现在有多少钱{:3_105:}
好,回到CE,把更新后钱的数值填入搜索框,并点击“再次扫描”。观察左边的结果列表,正常情况下比之前少了很多。这时分三种情况:
[*]还有不少候选结果,那就再回游戏里花钱(或者赚钱),再回来扫描,不停地重复下去,直到。。。
[*]只剩一个结果了,恭喜你,你多半是找到正确的位置了。
[*]一个结果都不剩?不好意思,可能数值不是你想象中那么存放的,修改一下搜索参数(数值类型等)重新来过吧{:3_107:}
不过如果你真的按我说的去做了,你会发现总是有3个候选结果,无论你怎么扫描,结果集都不再收敛了{:3_96:}
擦,那怎么办?别急,还好只有3个候选而不是30个。。。全选所有结果,并点那个红色箭头的按钮,将所有结果加入地址列表:
然后,然后就要靠运气了(不要吐槽,这么多年我都是这么干的,有更好的办法请立即告诉我)
方法是——随便选一个你看着顺眼的地址(或者抽签,或者像我一样从第一个开始……)双击数值的部分,并在弹出的“更改数值”对话框中输一个不一样的值,比如5000,然后点“确定”。
回游戏里再花点钱,然后看看你的钱变成你改的那个值了没?如果变了,那恭喜你押对宝了;如果没变,那说明押错了,将这条结果删掉吧,再挑一个结果试试。。。
注意,这里一定要再花点钱才能确定改得对不对,因为显示的数值不一定马上会更新。
当然,我不会告诉你我是找到最后一个才找对的{:3_99:}
好了,到这里你就可以想怎么改就怎么改了,可以直接像刚才那样一次性地修改,也可以锁定,让CE帮你保持这个值不变(默认好像是100毫秒刷一次,对于金钱,这个刷新频率已经足够了)。
锁定的方法是点地址最前面那个方框。有人会想,钱这种东西是多多益善的,只想让CE保证一个最低值,超过这个值就让它超吧,这也是可以的。方法是点那个锁定方框右边一点的位置,跳出一个向上的绿箭头。这时如果金钱少于你设定的数值,CE就会帮你刷回来,但如果多于这个值CE就不管了(我打赌很多人不知道这个功能{:3_94:}):
如果再点一下箭头,会变成一个向下的红箭头,那又是什么意思呢?不知道?猜一猜呢?
基础修改就讲到这里了。最后可能有些人会问:这个地址难道下次重启游戏不会变吗?
这是个好问题,不过这个金钱地址确实是个静态地址,因为CE会在扫描时的结果列表里把所有静态地址显示成绿色。什么?没注意?回去看看上面的图,三个结果都是绿的,下次启动游戏就放心大胆地按同样的地址改吧{:3_119:}
可能你会觉得这和现成的金钱修改器没啥区别,好吧,确实如此。不过这游戏光改钱对我这样的菜鸟是不够的,必须来点狠的。
敬请期待下回将要介绍的——真正的——无敌修改{:3_140:}
本帖最后由 ioncannon 于 2013-1-24 19:03 编辑
提高篇
上回说到,这游戏光改钱对我这样的菜鸟是不够的。为什么这么说呢?Medium或Hard难度都是有附加条件的,比如不能失去多于XX个星球。这有点坑爹,如果你在某个星球和敌人拉锯战,那每被敌人抢去一次就算失去一个星球{:3_92:}到后期还会有大BOSS能在瞬间抢下你一个星球{:3_100:}这时候光有钱有什么用?
于是咱们这回挑战一把,改什么呢?Yes,就改人口!先YY一下:如果每个星球无论敌人如何进攻,人口都不减那不是就无敌了{:3_104:}让你电脑抢我星球,显你电脑会精确派兵,我让你打,让你抢{:3_129:}这回抢不下来了吧?傻眼了吧?{:3_94:}。。。(此处省略584.62字)
好了,言归正传,我们要分析一下局势,制定修改策略。首先,人口和金钱不同,金钱只有一个值,而人口是每个星球各有一个值。因此像对付金钱那样“扫描+锁定”的策略显然行不通,跳蚤太多咱没那么多手指按。那我们的策略就是——先拿一个星球开刀,找到这个星球人口的地址,再分析敌人进攻时游戏是如何让星球减人口的,最终的目标是修改让星球减人口这段逻辑,使得无论敌人进攻哪个星球人口都不减。
首先选个经常被敌人进攻的星球(咱就是要被敌人攻,这样才能更好地受。。。哦不,更好地分析):
然后像扫描金钱一样,找到这个星球人口的地址(为了节省篇幅和你的时间,我友情提示这里数据类型是“4字节”)。应该很容易找到:
双击左边唯一的结果将其加入地址列表后,再右键菜单里选“找出是什么改写了这个地址”:
这时可能会弹出一个对话框让你确认是否启动调试器,选“是”:
然后CE会开个新窗口显示“下列代码写入到XXXXXXXX”,将它拖到一边不会被游戏窗口覆盖的位置。回到游戏,等待敌人来进攻。最好多等几波,但保持不要让敌人抢去这个星球。这时你会发现,刚才CE那个窗口里多了几条指令记录。注意每条的计数,有一条计数值很高。更重要的是,敌人的进攻每次使得星球人口减1时,那个计数就会相应加1(将该CE窗口放在游戏窗口旁边对比就会看的更清楚):
这说明就是该指令造成的敌人进攻时星球减人口。接下来有两条路可走:
第一条路很简单:在那条指令上点右键,选择“使用空指令替换(NOP)”,意思相当于将这条指令直接删掉,这样就达到了敌人进攻时星球人口不减的目的。但我们不能简单地这么做,理由是:虽然电脑进攻玩家的星球人口不减了,但是玩家进攻进攻电脑时,星球人口同样不会减,因为玩家也是电脑的“敌人”。大家互相攻不下对方的星球,这仗还怎么打{:3_105:}
因此我们要走第二条路:先把修改暂时放一放,咱们进一步分析下这里的逻辑。如果能让“敌人进攻时人口不减”这个逻辑有条件地实施,即只有“玩家星球”人口不减,那才是我们想要的。
这时我们就需要分析一下“星球”这个数据结构了,期望能找到“玩家星球”和“电脑星球”之间的区别。
要找到区别,首先我们得找到“电脑星球”人口的数据。用前面扫描星球人口的方法将电脑星球的人口地址也找到并加入地址列表以备查阅(随着列表中地址增多,最好都加上描述以免搞错):
点地址列表上面的“查看内存”:
在弹出的“内存查看器”窗口中选菜单“工具”-->“解析 资料/结构”:
再在弹出的“结构分析”对话框中“Group 1”地址框内填入我方星球的结构地址。这个结构地址怎么算?注意看刚才修改人口的那些指令:
对人口的寻址都是,这通常说明此时eax指向星球结构的起始地址,而星球人口存在偏移量为4B4(16进制)的地方。不懂汇编也不要紧,只要知道4B4是人口地址相对于星球地址的位置就行了。那么将前面找好的人口地址减去4B4(16进制计算可用计算器,科学型(XP)或程序员模式(Win7))就是星球结构的地址。
比如我现在星球人口地址 18EA8994 - 4B4 = 18EA84E0 即星球结构地址。
敌方星球也一样:18EA6F54 - 4B4 = 18EA6AA0 即敌方星球结构地址。
我方星球地址填好后,选菜单“文件”-->“加入额外地址”,再次填入我方星球地址(后面有用),再选菜单“文件”-->“加入新群组”填入敌方星球地址。最后选菜单“结构”-->“定义新的结构”,然后一路确认,最终得到一个自动生成的结构:
由于所有结构成员都是CE推测的,数据类型、偏移量很可能是错的。浏览到我们目前唯一知道的成员偏移4B4处,看看是不是人口数值:
纳尼?这是什么呀?别急,在该条目上点右键,选“更改元件”(应该是更改成员吧?)
在“结构信息”对话框里,将类型改为“4字节”,别的选项保持不变,然后点“确认”:
擦,又忍不住要吐槽翻译了{:3_137:}“签署”是神马意思?Signed就翻译成签署吗?太没专业精神了,明显是“带符号”的意思嘛!我发誓我写完这个帖子就把汉化补丁去掉,必须的。。。{:3_139:}
好了,现在看看是不是与游戏中对应星球的人口数量一致啊?还会随着游戏进行而更新呢{:3_116:}当然前两个数值都是我方星球的,所以肯定一样:
那为什么我方星球要加两组数据呢?咱们先在我方星球的一个地址上点右键,选“锁定”,这样这组数据就不会变化了:
随后进游戏,让敌人进攻吧,直到该星球沦陷。让星球沦陷很重要,因为这使我们有机会看到星球易手后有什么数据变化了:
回到CE,你会发现两个我方星球人口数值不再一样,第一个是被锁定了的原来的人口,第二个是现在的人口。另外所有变化了的数据都被标成了红色:
现在的任务是,试着在结构里找代表星球所属方的数值。这需要点运气,当然只需注意红色的数据,因为星球刚刚易手。
你会发现有一个成员(偏移454)非常值得怀疑:
这个数值在星球易手后从1变成了2,巧的是敌方星球对应的该数字也是2。这不得不让人联想到序号一类的东西,玩家是1而电脑是2。为了确认这一点,你可以试试把星球抢回来,看看这个数是不是又变成1了。
或者更激进些:直接将这个数值改成1——呵呵,回游戏后你会看到一个奇怪的现象:星球还是敌方的颜色,但人口标签又变回我方颜色了,并且敌人又派兵来攻打该星球了:
现在基本可以确定这就是我们要找的星球归属方的数值。有能力分清敌我了,就可以大刀阔斧地改了。选中前面那条指令,点右边“显示反汇编程序”:
又到了“内存查看器”:
选菜单“工具”-->“自动汇编”,会弹出个“自动汇编”的窗口。再连续点选菜单“模版”-->“自动汇编框架代码”、“模版”-->“代码注入”,一路确定后,一个基本的脚本就会生成:
大概解释一下:整个脚本就像一条修改器功能,有激活和移除两种状态。脚本分两块:到之间是激活该修改时执行的内容,以后是移除该修改时执行的内容。
激活修改时,会在游戏进程内分配一块内存,将补丁代码写在里面。游戏跑到被注入的指令后,会跳到补丁里执行你加的指令,结束后再跳回去继续执行游戏。移除修改时做的正好相反:释放之前补丁的那块内存,并恢复原始被注入的指令。
我们将脚本修改成这样(我顺便加了些注释):
//从这里到“”的脚本用于激活该修改
alloc(newmem,2048) //为补丁分配2KB内存,通常够用了
//声明标签,下同
label(returnhere)
label(originalcode)
label(exit)
newmem: //这里开始是前面分配的内存区
//将补丁代码置于此
pushfd //保存标志位(后面会解释)
cmp ,1 //偏移454的值为1吗?
je exit //是的(即玩家星球),跳过下面的指令直接到exit
originalcode:
mov ,ecx //按正常逻辑改写星球人口
exit:
popfd //恢复标志位(后面会解释)
jmp returnhere //回到被注入的指令下面继续执行游戏原来的代码
"game.exe"+F30CF: //这里是注入指令的位置
jmp newmem //这里原来的“mov ,ecx”被替换为跳转到上面补丁位置的指令
nop //空指令什么也不做,只是为了填充原来的指令被替换掉后留的坑
returnhere: //原来的“mov ,ecx”下面一条指令位置,补丁代码结束后跳到这里
//从这里开始的脚本用于移除该修改
dealloc(newmem) //释放掉为补丁分配的那2KB内存
"game.exe"+F30CF: //在被注入的指令位置
mov ,ecx //恢复这里本来的指令
//这里也可以直接写机器码:db 89 88 B4 04 00 00
你可以直接将这段脚本复制粘贴到你的“自动汇编”窗口里。
修改的基本原理是:先判断偏移454处的星球所属值是不是1,是的话(表示玩家星球)就跳过那条MOV指令,不让人口减少;否则的话让人口正常减少以保证玩家能正常进攻电脑。
为什么要加PUSHFD、POPFD这两条指令?你可以看看被注入的指令前后两条两条指令:
COMxx是比较指令,会根据两个操作数比较结果设置标志位;而Jxx是条件跳转指令,会根据标志位决定是否跳转。这两类指令是天生一对,一般挨在一起配合执行。所以如果对当中的指令注入,那注入的补丁必须保持标志位不变,这就是补丁里PUSHFD、POPFD的作用。懂汇编的人可能又会问了,那为啥这代码非要把一条无关的MOV指令插在当中当电灯泡呢?好吧,这涉及到CPU超标量流水线的优化问题,已经超出本文的范畴了。
最后点选菜单“文件”-->“分配到目前的CT表单”然后关闭窗口,不要去点下面的“运行”按钮:
回到CE主界面,你会发现地址列表里多了一行自动汇编脚本:
现在试着像锁定金钱一样点前面那个方框,修改就激活了。回到游戏里看看是不是敌人再进攻人口就不减了?再试着进攻敌人,看看是不是地方星球人口照减?{:3_111:}
我们的无敌修改基本大功告成了{:3_153:}什么?你还想进攻时一击必杀?喂喂,改得太厉害游戏就没意思了。不过这也简单,只要在刚才的脚本里加一行清零敌方星球人口的指令就行了:
xor ecx,ecx
再激活修改后回到游戏,派一两艘飞船进攻敌人的星球试试,是不是逆天了?{:3_160:}
好,高级修改就讲这么多了。觉得不错就帮忙顶一下哦~{:3_110:}
有时间我再写个生成修改器的教程。。。
自己顶一下,顺便再占一楼 帮顶,顺便膜拜一下,俺以前也试用过一次CE,失败后就木有继续尝试啊:'( 帮你顶一下~~ ofortuna 发表于 2013-1-23 11:50 static/image/common/back.gif
我会说我会心算1.00到1000.00的dh换算麽。。。
一般来说不必考虑哪些1,03,1,07啥的,偶尔可能会遇到游戏 ...
你说的都是定点数吧?定点数在知道倍率前除了低阶搜索外还有什么好办法吗?{:3_140:}
FPE确实是经典,偶从DOS上的3.0用到Windows的FPE2000。。。
另外你说的游戏修改不一定局限于动态修改这点我非常认同,事实上我更倾向于修改规则文件或者通过MOD修改(如果游戏支持的话),感觉更官方一点。。最经典的恐怕就是红警的rules.ini了{:3_174:}
ioncannon 发表于 2013-1-23 16:47 static/image/common/back.gif
你说的都是定点数吧?定点数在知道倍率前除了低阶搜索外还有什么好办法吗?
FPE确实是经典,偶 ...
我心算的才不是整数哦。。。而是1.00,2.00
倍率换算仅仅低阶搜索很难发现规律,比如大航海4的城市规模数据就很奇怪,一个字节表示游戏中一位数字。。。有些游戏也有类似问题,很难说丫到底是十进制表达还是十六进制存储。。。
还有一种事件开关问题,这在处理倭国十八插AVG里很实用,若干事件各占一个比特而非byte,你要心算布尔变量。。。
终于把提高篇更新了,累{:3_123:} 自己顶~ 没人看? 顶一下,拿分走人http://linkee.com/R2b8http://linkee.com/f9Td
http://linkee.com/9bZohttp://linkee.com/bpTm
http://linkee.com/TsHDhttp://linkee.com/ZYz6
http://linkee.com/JBduhttp://buzz.to/f7F3Z
http://linkee.com/qdlEhttp://buzz.to/c5DEk
http://buzz.to/Qx62F
http://linkee.com/4Upchttp://buzz.to/Jr23B
http://linkee.com/ASFZhttp://linkee.com/DrxF
http://linkee.com/Pn58http://linkee.com/MKuH ioncannon 发表于 2013-1-28 14:41 static/image/common/back.gif
没人看?
不是没人看,你没设回复后可见,所以只能手工帮顶。。另外,题目可以写得绚丽一些。毕竟不是paper,有一说一要不得。。
自己再顶 ding~~~ 节后帮顶兼催稿~~:D 写得不错。不过游戏修改我比较喜欢静态修改。因为,毕竟,需要修改的不多。修改得多了游戏没意思了。
正常情况下,修改几次的静态数值比找一个动态数值要快很多。 关注下不错 水平很高啊,值得学习 不错学习了 WQERQWERQWERQWERASDFASDFASD
qwerqwerwerqwerqwerqwerqwe
挖;P;P;P;P;P;P ioncannon 发表于 2013-1-22 18:31
提高篇
上回说到,这游戏光改钱对我这样的菜鸟是不够的。为什么这么说呢?Medium或Hard难度都是有附加条件 ...
大佬,我看只查了一层 “头”地址,这个代码功能是不是不需要找到基地址?
页:
[1]