美味的曲奇
本帖最后由 美味的曲奇 于 2022-2-5 10:47 编辑

如题我根据https://www.spigotmc.org/threads ... data-easily.457784/
进行实体序列化和反序列化***这排版就好不了了***
序列化类 https://pastebin.com/wNXJtuff
测试类 https://pastebin.com/LRrUi2gN

但是执行后并没有出现要反序列化的实体
而name,isDead,location都给出了正常的值
但每次uniqueID都是一样的
这个是哪里有问题导致可以获取到实体,但实体不在游戏中的问题




吕易天
本帖最后由 吕易天 于 2022-2-5 12:27 编辑

反序列化以后还需要调用一下CraftWorld类中的
  1. public <T extends Entity> T addEntity(net.minecraft.server.v1_12_R1.Entity entity, CreatureSpawnEvent.SpawnReason reason) throws IllegalArgumentException
复制代码

方法,在你那个测试代码后面再加
  1. obcClass("CraftWorld").getMethod("addEntity",nmsClass("Entity"),CreatureSpawnEvent.SpawnReason::class.java).invoke(world,entity,CreatureSpawnEvent.SpawnReason.CUSTOM)
复制代码

,还有设置UUID的时候不要只设置一个字段,要么把Entity实例中的uniqueID和ar字段一起改了,要么用里面的public void a(UUID uuid)方法,要么用里面的public void setUUID(UUID uuid)方法,也就是说要把getEntityFromNBT方法中的
  1. entityClass.getField("uniqueID").set(entity,UUID.randomUUID())
复制代码
改成
  1. entityClass.getMethod("setUUID",UUID::class.java).invoke(entity,UUID.randomUUID())
复制代码



美味的曲奇
吕易天 发表于 2022-2-5 11:34
反序列化以后还需要调用一下CraftWorld类中的
方法,在你那个测试代码后面再加
,还有设置UUID的时候不要只 ...

混淆的方法怎么知道意义呀
就像a->serUUID这样的
反射好像要频繁的使用混淆后的方法
但是很难推理出每个方法的意义

吕易天
美味的曲奇 发表于 2022-2-5 19:21
混淆的方法怎么知道意义呀
就像a->serUUID这样的
反射好像要频繁的使用混淆后的方法

看Mojang是怎么写的,我甚至还从服务端主类开始看起过(为了搞清楚Mojang是怎么处理客户端发来的数据包的),那个setUUID是我看CommandEntityData的时候看到里面用了Entity类中的a方法然后我看见bukkit往里面加了一个public void setUUID(UUID uuid){this.a(uuid);}这样的方法看来的

吕易天
美味的曲奇 发表于 2022-2-5 19:21
混淆的方法怎么知道意义呀
就像a->serUUID这样的
反射好像要频繁的使用混淆后的方法

如果是1.14+可以用fabric yarn反混淆映射表反混淆了以后再看,如果是1.17+那么spigot改用了官方反混淆映射表(虽然官方命名质量很一言难尽),所以就基本不存在a、b、c、d这种未反混淆的混淆名了

吕易天
本帖最后由 吕易天 于 2022-2-5 19:34 编辑
美味的曲奇 发表于 2022-2-5 19:21
混淆的方法怎么知道意义呀
就像a->serUUID这样的
反射好像要频繁的使用混淆后的方法

这里再推荐一款带反混淆功能的java反编译器兼字节码编辑器:https://github.com/Col-E/Recaf,你只需要Mojang官方服务端的jar和一个反混淆映射表即可,fabric yarn可以去这里下:https://github.com/FabricMC/yarn,选择对应的版本分支即可,官方映射表去客户端对应版本的json里找就行了,里面有url

第一页 上一页 下一页 最后一页