ioncannon 发表于 2013-3-22 22:31

[100%原创] [3/23更新] 手把手教你《Teleglitch 电子脉冲》CE无敌修改,喜欢这个游戏但觉得难的进~~标题是否可以再长点

本帖最后由 ioncannon 于 2013-3-23 14:09 编辑

3/23更新:今天打到后面发现,装了护甲后原本的无敌竟然失效了{:3_100:}调查后发现,有护甲和木有护甲走的代码是不一样的,于是更新了一下修改脚本,修复了这个问题,并且顺便把护甲也改了{:3_117:}请持续关注的看官儿们注意更新。。。


------------------------------------------------------------------------------------华丽的分割线------------------------------------------------------------------------------------
正文

最近看了逆风笑的《电子脉冲》节操解说,觉得是我喜欢的类型,不过觉得这游戏好难啊,老瞄不准,看了本版的另一篇攻略也不见好转。。唉,本人太菜没办法,不能怪人家攻略写得不好{:3_95:}

只好试试用CE修改一下,改个无敌出来就好办了{:3_192:} 什么?无敌太狠了你只想要无限弹药?好吧个人喜好不同,我就喜欢改大的{:3_143:}

一些基础的东西比如怎么搜索数值、怎么定位指令我就不说了,列位可以参考我以前的帖子:CE修改实战——《行星遭遇攻击》无敌修改,或者本版某位大大的置顶贴。

废话少说,首先当然是搜到生命所在位置。这个游戏生命值是单精度浮点数(Float),用精确查找很容易找到:


然后找到哪里的指令修改了它:


然后咱们首先试试直接把这条指令干掉行不行。选Replace(替换)然后回游戏,看看是不是就无敌了{:3_174:}
。。。
。。。。
。。。。。
。。。。。。
尼玛坑爹了,确实无敌了,而且所有人都无敌了,不会被打死但也打不死怪{:3_91:}
这说明所有人的伤害都共享这一处的写入指令,简单替换掉指令行只会无差别地让所有人无敌。


先把指令还原吧。。。方法是在Advanced Options(高级选项)里刚才的指令上点右键,然后还原原始指令:


现在修改的关键变成了如何区分玩家的生命值和怪的生命值(有道理吧{:3_140:})
这里介绍一个很简单也是比较常用的方法:利用屏幕上显示的玩家数据
具体一点就是,游戏会把玩家的生命值显示在屏幕上,这当然也是靠指令实现的。只要找到这个读取生命值的指令,就能唯一确定玩家生命所在位置了,因为游戏不会在屏幕上显示其他人的生命。于是我们只要在读取玩家生命的地方把生命地址记下来,再在前面找到的写入生命值的指令处判断一下,如果是玩家生命就不要扣减了,其他人照扣不误{:3_139:}甚至直接扣到零以实现一击必杀{:3_111:}

和找写入指令类似,这回我们找是什么指令访问了玩家生命值:


然后切回游戏,只需要看到游戏显示的玩家生命值就好,不需要等它改变。可以看到一堆指令跳出来:

我们看下每条指令前面的表示执行次数的计数值。因为游戏每一帧都要显示玩家生命值,所以可以判断我们要找的指令计数值会很高,在上面的四条指令之中。

但具体是哪一条呢?现在不好判断。不过其实无所谓哪一条,我们只要找一条只会访问玩家生命而不会访问怪的生命的指令就好了。方法简单地说就是找到一个怪的生命值,然后同样找访问那个怪的生命值的指令,再和访问玩家生命的指令对比一下,就能找到哪条或哪些条指令只访问玩家生命了。

看到这里肯定有人问:怪的生命值又没显示在屏幕上,该怎么搜索啊?
其实不用搜索,因为我们已经找到扣血的指令了,而这条指令可以扣玩家的生命也可以扣怪的生命。我们可以找到这条指令都访问了哪些地址:


回游戏,让怪打你一下,你再打怪一下(感觉好暧昧啊{:3_127:})。只打一下哦,打多了怪挂了你就得重来。再进CE你就能看到两个地址:

第一个地址是我们熟悉的玩家生命值(好吧我承认在我打怪前,被怪打了13次{:3_112:}),那第二个地址就是传说中的神秘的怪的生命值(小样血还挺厚)。
然后用同样的方法找到哪些指令访问了怪的生命值:

跟前面访问玩家生命值的指令对比下。。。好吧,可以确定前面4条都是只访问玩家生命的指令{:3_92:}
那咱们在4条里随便选一条,我选了mov指令,因为看着比较特别,跟其它3条长得不一样,一定会带来好运{:3_110:}


接下来就没什么悬念了,按原计划用自动汇编写出修改脚本(代码仅供参考,不同版本的游戏地址可能会不一样,我是6.2的,升级补丁在这里):代码已更新:修复装了护甲后无敌失效的问题


alloc(newmem,2048) //为补丁分配内存
label(patch_health) //声明一堆标签
label(patch_armor)
label(skip_health)
label(skip_armor)
label(get_player)

newmem:
dd 0 //32位变量,用来存玩家生命地址

patch_health: //1号补丁,打在扣减生命值的地方(共有两处)
cmp eax, //检查是不是玩家地址
je skip_health //是玩家,跳过下面的指令
fstp dword ptr //是怪,扣它的血!!!
ret //返回原来的代码
skip_health:
fstp st //平衡浮点寄存器,将本来要扣的玩家生命值丢掉以实现无敌
ret //返回原来的代码

patch_armor: //2号补丁,打在扣减护甲值的地方
cmp eax, //检查是不是玩家地址
je skip_armor //是玩家,跳过下面的指令
fstp dword ptr //是怪,扣它的护甲!!!(话说怪有护甲么?)
ret //返回原来的代码
skip_armor:
fstp st //平衡浮点寄存器,将本来要扣的玩家护甲值丢掉以实现无敌
ret //返回原来的代码

get_player: //3号补丁,打在读取玩家生命值的地方
mov ,ebx //把玩家地址记下来供1号补丁参考
mov eax, //执行本来补丁位置的操作
ret //返回原来的代码

"game.exe"+F37A: //1号补丁打在这里
call patch_health
nop

"game.exe"+F388: //2号补丁打在这里
call patch_armor
nop

"game.exe"+F398: //1号补丁这里再打一次!
call patch_health
nop

"game.exe"+43810: //3号补丁打在这里
call get_player
nop


dealloc(newmem) //释放内存
"game.exe"+F37A: //恢复现场
fstp dword ptr
"game.exe"+F388:
fstp dword ptr
"game.exe"+F398:
fstp dword ptr
"game.exe"+43810:
mov eax,

最后把脚本加到cheat table里:

现在发达了,快打开上帝模式去虐怪吧{:3_94:}

[完]




页: [1]
查看完整版本: [100%原创] [3/23更新] 手把手教你《Teleglitch 电子脉冲》CE无敌修改,喜欢这个游戏但觉得难的进~~标题是否可以再长点