日服1.2.3

修改可以从返回HP,ATK等数据的URL入手,比如搜索”quests/execute”这样的关键字。因为游戏返回的是json数据,肯定有个解析的过程,跟踪几部后就会发现游戏是使用一个Document类来存放数据,取出数据是使用如document.i(“hp”, 0)形式的代码,所以搜索关键字就能定位到Piece这个类Init函数。
从函数名上就能看出这是初始化数据用的函数,所以可以直接在这里修改,但是由于游戏的MainCharacter(主线人物),Monster(怪物),Unit(玩家的人物)这3个类都是继承于Piece这个类,直接修改的话会导致怪物和人物的值一起修改,原来还想着要不要找其他地方,结果发现在Init函数中官方已经帮忙写了一个判断
QQ截图20150805001501
这下好了,直接在这个else里修改,就只会对自己的人物生效了
首先修改HP,在Init里官方已经展示了HP的存储方法

this.hp = this.maxHp = this.originalHp = (int) (this.document.i("hp", 0) * this.PowerUpRate);

所以就在else里添加一段

this.hp = this.maxHp = this.originalHp = 99999999;

但是实际修改的时候发现这3个变量都是EncryptInt型,官方写的时候是直接用op_Implicit,也就是隐式转换
QQ截图20150805002339
然而这个在Reflexil里没法做到,原本想试试强转,后来翻了下EncryptInt类的代码发现有Value这样一个变量,想都不用想就知道这能控制EncryptInt类中的值,刚好Init里也有一个EncryptInt型的局部变量,所以修改的思路就是先把99999999用Value存进这个局部变量后,再存到hpmaxHporiginalHp里,所以最后修改HP的IL代码就是
QQ截图20150805003338
c#代码

num2.Value = 0x5f5e0ff;
this.originalHp = num2;
this.hp = num2;
this.maxHp = num2;

好了,接下来修改攻击力,攻击力存放的位置是在Piece下的_parameter变量里,跟攻击有关的数值都存放在这里,不过神奇的是,_parameter是一个PieceParameter类型的数组,难道一个人物的攻击力还有多种吗。。。数组大小是由数据包里的formCount控制的,但是我截取了各种数据包也没发现这个值,所以这数组大小就是默认的1,修改攻击力的代码就是这样

this._parameter[0].originalAt = 0x3567e0;

IL代码
QQ截图20150805004344
至此HP和攻击力就修改完了

再扯几个其他的修改方案

Unit类中

LevelUp函数在每次点击人物时调用,可以直接修改成一次30guts

[csharp]base.level += 30;[/csharp]

LoadHpByLevel函数用于载入升guts以后的血量,这里修改其中num的值也可以达到修改血量的效果
LoadStatusByLevel函数用于载入升guts以后的攻击速度,这里可以修改攻击速度

Piece类中
calcDamage函数用于计算我方人物攻击怪物时的伤害,所以直接修改也等于修改攻击力
メルクストーリア对于作弊还是有抓的,目前来看主要是raid和公会战。对于公会战,因为有空气盾的存在,所以只修改HP达到理论伤害是非常稳的一种修改方法
最后丢一个修改好的Assembly-CSharp.dll
hp 99999999
atk 3500000
http://pan.baidu.com/s/1bnFclFh

8 条评论

  1. :wink: 偶然機會看到此帖,然後就一发不可收拾了,看完了所有貼,感謝分享,我玩的遊戲是暗黑繫列的,博主可能不太喜歡,但是這遊戲是il2cpp出來的,通過dnspy找到il2cpp中地址,看不太懂arm彙編,可有好的方法?

欢迎留言

4 + 9 =