用CE脚本进行FGO一键修改局内属性
本帖最后由 loneprison 于 2020-8-10 16:57 编辑最开始,首先,附上最初链接,这个贴吧帖子作者也是我
https://tieba.baidu.com/p/6167397059?pn=2
前言,给点彩蛋
给你们看看最初版本的代码,这段代码的雏形,修改自一个叫梦游电玩的网站的帖子,经过我修改过之后,因为“反正能用”就一直没管过优化过
因为前几天吾爱开放注册才弄到的账号来着。
今天突然想到,因此便搜了一下FGO相关的帖子,于是便找到了这个
https://www.52pojie.cn/thread-985807-1-1.html
这个帖子的回答引申出的方案,解决了我所遇到的最后的一个难题:锁定np为100%需要每次固定,打完一局后解锁,极其麻烦
画就不多说了,直接上成品图和附件吧
--下方有网盘链接,非吾爱会员可去网盘下载
--这个txt里的文字是用来复制粘贴到CE的CT表里的(快捷键Ctrl+Art+L)。。。有个同学搞了半天没搞好结果发现他是直接改后戳导入,希望不会再有类似错误了。。
--于19/7/25 凌晨一点前下载了的6位同学注意下,我自己用了之后稍微另外添加两行关键代码,分别是自动找进程,解决报错的和显示完成的,虽说没用也不影响运行就是了
这三行分别是
openProcess ("NoxVMHandle.exe") --添加在开头,默认夜神模拟器,如果你是雷电mumu模拟器的话,进程名更改成对应的,或者选择注释掉这行然后手动选择进程
if a==nil then print("未能搜寻到值,请确认第一二行填写是否正确或稍后再试") return end --添加在原代码的第14行下方,“while”代码上方,如果不添加的话就是报错英文说“a”是空值不可运算
print(“修改完成”) --结尾处添加以显示修改成功了,不过其实这三行都不影响实际运行就是了
--19/7/28 更新,加了一行代码和一些文字注释
之前下载的同学可以在第20行左右,writeInteger代码处加下面这句即可
writeInteger(a-n+0x4,0) --此项可使路人助战也可使用宝具
https://static.52pojie.cn/static/image/hrline/5.gif
https://static.52pojie.cn/static/image/hrline/line5.png
FGO每次进入战斗以后,运行一下,弹出修改完成的窗口就算完成了,不过打下一局依然需要在运行一次
不过使用之前需要自己确定好需要填的值
要点一:最上方三个数值,需要改几个从者(min的值),以及第一个从者的攻击力和血量(注意只需要输入第一个从者面板即可),请自行输入(理论上如果你不改第一个从者只改第二第三个从者的话也可以选择输入第二个从者的面板)
要点二:第18到第22行请自行修改想要的值
要点三:很多平时其实用不到的值,比如血量啊宝具等级啥的,可以在这一行的前面打一个“--”,这样就可以注释掉这行,不运行这行了,而第24行至第28行(最新版是27至35行),一般用不上,可以再这一小段的开头加“--[[”,结尾加"--]]",或者逐行加"--"来进行注释即可(比如说我已经主动注释掉了修改血量的和锁定血量部分的代码,如果你需要用的话再删除“--”或"--[[""--]]"组合即可)
要点四:(划重点):因未知原因,打输一局以后(如果再输一局可能恢复),下一局的地址就会固定(注意是地址不是数值),并且两个从者之间的地址偏移可能会变动(也可能不会),在此情况下修改多个从者的方案不一定还适用,但是反过来也可以利用这点,特意打输一局(最好是高难,省体力),然后手动搜到地址并锁定。(其实也可以依靠我上方的脚本只修改一个从者的值,然后根据锁定了的HP地址,查看附近内存,然后找到那些关键的地址加入到列表锁定)这样只要你不去商店啊领任务啥的就可以一直爽了,配合模拟器的按键脚本用在无限池超爽的
要点五:你使用了锁定血量的代码,通关一局,进入下一局之前,一定要记得把锁定值的地址给解锁,不然快则下一局,慢则过了几局之后,会出现游戏闪退的现象
要点六:由于0np放宝具原理是修改np上限为0 。。。故np永远不会增加,所以需要用np的技能放不出)))
19/7/26 今日大封禁没有我的名单,目前依然安全
19/8/30 CBA沉了,心态炸了退游,附上最后的礼物
(已失效)
使用方式是先去特意打输一局,下一局进入后修改,然后不去商店不去领取任务一般就不会失效,为了以防万一最好还是把光炮作为主力放在第一位并长期使用比较好
19/11/25
这边出了很多自身问题导致虽然口头答应马上更新但是一直没动身。。比如模拟器打不开fgo,固态坏盘导致换固态重装电脑等。。还有忘记了这个事(划掉),今天弄了下发现是更新版本导致宝具等级的偏移值更改,而原宝具等级地址被更改后会导致无法运行的情况,此外还有更改多个从者的偏移值也发生了变化。其实如果有的人注释掉或者不用宝具等级的话以及只更改一个从者的话,即使不更新脚本也不受影响就是了))
PS:以后更新版本也有可能会出现偏移值更改的情况这种情况可以自己排查下问题,注释掉对应的更改,毕竟我也有可能像这次一样咕很久(划掉)(一般来说两个从者之间的间隔更改的情况会多,,所以推荐劲量单核)
由于贴吧帖子被新上任的骗子sm吧主删除了,因此本日开始此贴开放对路人权限(此前是仅限吾爱已注册用户看帖)
百度网盘链接:https://pan.baidu.com/s/1s3zpsBxiNwztFjDbV2iYgw
提取码:5zcm
20/4/18
更新了偏移值,此次接到评论区反馈后去重新试了下,单个人的修改照常没问题,但多个人的修改问题就很大了,本来1号位2号位3号位4号位...之间的偏移应该是相同的,这次更新后不知为何2号位和3号位之间会相差一个很大的无规律的偏移,因此还是和之前说的一样,推荐劲量使用只修改一个人的方案来保证此脚本正常使用
20/8/10
经过验证,通过游戏失败来保证地址固定的方法已失效,虽然改一局的方法仍然成立但效率极低,如有需求请另外寻找,本帖今日后不再更新脚本
https://static.52pojie.cn/static/image/hrline/4.gif
干货/原理
只是为了游戏爽一爽的用户可以无视下面的信息了,这些是说给想自己研究lua脚本等用户的
最初,我是在一个梦游电玩的网站上找到了用CE的lua脚本进行修改的方法(那个网站未知原因进去很慢很慢所以我早就没去了)
当时我也爽了好一整子没有改过代码
当初的代码原理是,利用脚本自动搜索字节组来定位到地址,再根据地址进行计算,来达到获取其他地址,以达到修改的效果
但是由于其原理寻找地址的方法并非通过偏移去寻找,而是通过计算地址的方法去寻找,因此版本一更新,地址就要重新手动寻找一次,或者是打输过以后,地址也不同了。因此我一直在考虑是否能找到一个通用的方案。
--最初版本方案
local s1_atk = string.format("%X",MyAobScan("D5 2C 00 00 00 00 00 00 00 00 00 00 6B 2D 00 00 6B 2D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E8 03 00 00"))
local v = string.sub(s1_atk,1,5) --找到的地址只取前五位,比如说假设找到一个地址是6EFB3EA0,v的值便只取前五位数,变成了0006EFB3
--然后再根据下一行代码,在尾部插入“ECE”,最终得到的地址便是6EFB3ECE
local s1_Hp=v.."ECE”
后来有一次,我试着提问了下我的C#老师,老师告诉了我一个思路,既然我可以确认一个地址的所在,那么其他的地址皆可以通过偏移得到
所以才有了以下代码
writeInteger(a-n,95423) --修改攻击力
writeInteger(a-n+0x0C,15115) --修改当前血量(一般不用)
writeInteger(a-n+0x10,15115) --修改最大血量(一般不用)
writeInteger(a-n+0x28,0) --0np释放宝具
writeInteger(a-n+0xD0,5) --修改宝具等级
命名为a啊n啊什么的其实并不规范,但是反正已经写完了,能用,也就懒得改了
以攻击力为基准进行偏移,各个重要地址的偏移如下
+0x4 是否好友,这个会影响到助战能不能使用宝具,默认填成“0”的话就可以使用宝具了
+0x0C 当前生命值
+0x10 最大生命值
+0x20 当前np值
+0x28 最大np值
+0xD0 (更新后为+0xD4) 宝具等级
- 0x248(更新后为+0x330)下一个从者的攻击力地址(仅限本次开启游戏没翻车的前提)
而地址偏移的计算啊什么的,就是有点基础的数学逻辑就行了
不过地址偏移倒是好求,问题是应该怎么自动搜索,这一点我搜索相关资料花了很长一段时间
最后我在wiki上成功找到了相关的信息与代码
原文我将放到第二页(有点多),有兴趣的可以参考一下
最终我所根据梦玩原贴修改后的代码则如下(为表谢意,该方法的命名依然是与原贴一致)
function MyAobScan(Bytes)
local Scan = createMemScan();
Scan.OnlyOneResult=true;
Scan.firstScan(soExactValue, vtGrouped, rtTruncated, Bytes, "", 0, 0x00000001ffffffff, "", fsmNotAligned, "", true, false, false, false);
Scan.waitTillDone();
return Scan.getOnlyResult();
end
而意思的话则是,创建一个名为MyAobScan的方法,传入一个字符串自动进行搜索,并返回地址(其实严格来说这个字符串就是你平时普通使用CE时,在如下图所示的地方所填入的数字啊群组啊什么的)
搜索值得问题就算是解决了,而剩下的就都好办了
writeInteger(Address,Value)
将整数Value(或者说4字节的Value),填入地址Address处,而地址其实是可以当场运算偏移的,所以就有了例如
writeInteger(a-n+0x0C,15115)
writeInteger(a-n+0x10,15115)
这样的变体
local addressList = getAddressList()
local a1 = addressList.createMemoryRecord()
a1.setDescription(“命名”)
a1.Address = Address
a1.Active= true
这段在代码结构其实没变过,还是梦玩的原贴代码,相关意思是
第四行:将Address加入到列表中(如下图)
第三行:将描述改为“命名”(其实也可以自行修改成其他的名字,但是记得要打字符串)
第五行:是否锁定该值(true为锁定,false为不锁定)
这样就可以自动将想要锁定的值进行锁定了
应该就到这里没了还有啥的话我会后续更新
(完)
PS:
编写脚本所参考的资料与网站
https://www.runoob.com/lua/lua-tutorial.html
https://wiki.cheatengine.org/index.php?title=Lua
(下一页是MemScan类的相关资料搬运)
(以下中午皆为谷歌浏览器自带的翻译)
MemScan
MemScan类:(继承:对象)
getCurrentMemscan():返回当前内存扫描对象。如果使用选项卡,则当前选项卡的memscan对象
createMemScan(progressbar OPTIONAL):返回一个新的MemScan类对象
属性:
OnScanDone:function(memscan) - 设置扫描完成时要调用的函数
FoundList:FoundList- 当前附加到此memscan对象的
foundlist OnlyOneResult:boolean- 如果设置为true,memscan将在找到第一个结果后停止扫描,并将地址写入“结果”
结果:整数 - 如果使用OnlyOneResult,这将包含扫描完成后的地址
方法:
firstScan(scanoption,vartype,roundingtype,input1,input2,startAddress,stopAddress,protectionflags,alignmenttype,“alignmentparam”,isHexadecimalInput,isNotABinaryString,isunicodescan,iscasesensitive);
是初始扫描。
memscan:使用createMemScan
scanOption 创建的MemScan对象:定义执行的扫描类型。firstscan的有效值为:
soUnknownValue:未知初始值扫描
soExactValue:精确值扫描
soValueBetween:扫描之间的值
soBiggerThan:大于... scan
soSmallerThan:小于... scan
vartype:定义变量类型。有效的变量类型是:
vtByte
vtWord 2个字节
vtDword 4字节
vtQword 8字节
vtSingle float
vtDouble
vtString
vtByteArray
vtGrouped
vtBinary
vtAll (这里原文就没翻译的,大致是指什么变量可以自己搜一下)
roundingtype:定义扫描精确值浮点的方式
rtRounded:正常的舍入扫描。如果精确值=“3”则包括3.0到3.49999999。如果精确值是“3.0”,则它包括3.00到3.0499999999
rtTruncated:截断算法。如果精确值=“3”则包括3.0至3.99999999。如果精确值为“3.0”,则包括3.00至3.099999999
rtExtremerounded:圆形极端。如果精确值=“3”则包括2.0000001至3.99999999。如果精确值为“3.0”,则包括2.900000001至3.099999999
input1:如果scanoption 需要,则为给定变量类型
input2 的字符串:如果
扫描选项需要,则这是辅助输入startAddress:要扫描的起始地址。您希望将其设置为0
stopAddress:扫描应停止的地址。(你想将其设置为0xffffffffffffffff)
protectionflags:请参阅aobscan about protectionflags
alignmenttype:扫描对齐类型。有效选项包括:
fsmNotAligned:无对齐检查
fsmAligned:地址必须可以由alignmentparam中的值分割
fsmLastDigits:地址的最后一位必须以alignmentparam
alignmentparam 提供的数字结尾:包含对齐参数的字符串。
isHexadecimalInput:当为true时,它将输入字段作为十六进制字符串处理其他十进制
isNotABinaryString:当为true且varType为vtBinary时,这将以十进制而不是二进制字符串
isunicodescan 处理输入字段:当为true且vartype为vtString时,这将做一个unicode(utf16)字符串扫描否则正常utf8字符串
iscasesensitive:当为true且vartype为vtString时,检查是否匹配
nextScan(scanoption,roundingtype,input1,input2,isHexadecimalInput,isNotABinaryString,isunicodescan,iscasesensitive,ispercentagescan,savedresultname OPTIONAL);
下一次扫描是基于当前地址列表和先前扫描的值还是已保存扫描
memscan的值:先前已完成第一次扫描扫描选项的MemScan对象
:
soExactValue:精确值扫描
soValueBetween:扫描之间的值
soBiggerThan:大于。 .. scan
soSmallerThan:小于... scan
soIncreasedValue:增加值扫描
soIncreasedValueBy:扫描增加值
soDecreasedValue:减少值扫描
soDecreasedValueBy:扫描减小值
soChanged:更改值扫描
soUnchanged:未更改值扫描
roundingtype:定义扫描精确值浮点的方式
rtRounded:正常舍入扫描。如果精确值=“3”则包括3.0到3.49999999。如果精确值是“3.0”,则它包括3.00到3.0499999999
rtTruncated:截断算法。如果精确值=“3”则包括3.0至3.99999999。如果精确值为“3.0”,则包括3.00至3.099999999
rtExtremerounded:Rounded Extreme。如果精确值=“3”则包括2.0000001至3.99999999。如果精确值为“3.0”,则包括2.900000001至3.099999999
input1:如果scanoption需要,这是给定变量类型
input2 的字符串:如果scanoption需要这是辅助输入
isHexadecimalInput:当为true时,这将以十六进制字符串处理输入字段,否则decimal为
NoNotABinaryString:当为true且为varType是vtBinary这将处理输入字段为十进制而不是二进制字符串
isunicodescan:当为true且vartype为vtString时,这将执行unicode(utf16)字符串扫描,否则正常utf8字符串
iscasesensitive:当为true且vartype为vtString时检查案件是否匹配
ispercentage:当为true且scanoption的类型为soValueBetween时,soIncreasedValueBy或soDecreasedValueBy将导致CE执行precentage扫描而不是正常值scan
savedResultName:String,其中包含应与之比较的已保存结果列表的名称。第一次扫描称为“FIRST”
newScan():清除当前结果
waitTillDone():等待memscan线程完成扫描。始终使用此
saveCurrentResults(名称):将当前扫描结果保存为此memscan的唯一名称。此保存可用于在后续下一次扫描中进行比较
getAttachedFoundlist():如果连接到此扫描结果,则返回FoundList对象。否则返回nil
setOnlyOneResult(state):如果在开始扫描之前设置为true,则会导致扫描程序仅返回一个结果。请注意,它不适用于Foundlist
getOnlyResult():仅当returnOnlyOneResult为true时才有效。如果找不到则返回nil,否则返回找到的地址(整数) win7ce无法修改数据解决方法
麻烦楼主帮忙置顶一下
然而其实改封包的方法还活着......只不过是fgo后来一次更新检测了xp框架,用不了当时论坛大佬发的东西了
并且因为盗版收费过于严重,大佬也没再研究......如果用特殊的fgo版本,稍微调整一下代码其实封包实现每局自动改攻防礼装之类的方法还是可以用的
但是尊重论坛大佬的想法,就不细说了(毕竟源码和方法不是我想出来的.....)
并且因为我懒....早就开始在手机上拿GG用自己写的lua改了....起码相对长的时间不用担心什么版本更新0v0
总之楼主辛苦啦,谢谢分享 年年岁岁复年年 发表于 2020-7-4 19:23
以前我用的GG脚本,最近FGO更新了之后就会崩溃了。过不了检测,一动内存就崩溃,我用的雷电模拟器,大佬有 ...
我很久没碰废狗了,过段时间我看看.. 脚本很好用{:1_893:} wab6234033 发表于 2020-3-13 19:25
大佬,长时间锁定的脚本搜不到数值了啊
具体情况是怎样,一次性和长时间锁定的搜索是通用的,前者能用后者不能用那就是你写错了数值什么的 wab6234033 发表于 2019-11-7 18:28
大——佬——!
fgo更新了,现在锁0NP上限宝具放不出来了,选完宝具卡,攻击的时候,卡在释放宝具前的动 ...
我这边模拟器出了问题连废狗都打不开。。搞定再说
FGO是什么游戏 沙发,厉害了楼主{:300_958:} svvhifhi 发表于 2019-7-24 23:11
FGO是什么游戏
命运冠位指定,半过气骗氪严重的游戏(不),但是老婆和剧情是真的不错))) 虽然不玩了但是老婆依然在心中 大佬牛批 顶 一 个 xieying996 发表于 2019-7-24 23:42
封账号吗o(=·ω·=)m
我大概已经用了大半年时间了并没封,上次大封禁所封的是封包外挂,就是那种游戏都不进都能刷图的那种或者进图结算的那种。不过就算如此,是挂三分险,开挂就得做好觉悟{:1_918:},建议还是不要修改的太过分,比如几十万几百万ATK这种的 所以果然当年的一炮三面还是不能再现了吗 gc95918 发表于 2019-7-25 00:11
所以果然当年的一炮三面还是不能再现了吗
很抱歉本人并没有这个技术==
而且这个官方会查,不管怎么说也要劲量在不封的前提下搞所以 支持顶一个