您的位置首页生活百科

我的世界 vape 是什么原理?

我的世界 vape 是什么原理?

的有关信息介绍如下:

我的世界 vape 是什么原理?

~-- 二更 --

原理在最下面初始答案,

自己尝试做了一个VAPE,使用FMLCorePlugin做的

链接:https://pan.baidu.com/s/1PDzP_RUOuAIEZAfP4kQiEQ 提取码:vd6x

包含成品,源代码。

编译出的 Vapu-1.0.jar 本身是mod,可以直接放入mods文件夹加载,也可以使用 Launch.jar 将其作为代理注入到已经启动的minecraft进程。

顺便说明,对于修改class,正常的FMLCorePlugin在开发环境是修改反混淆后的,比如,类的字段名字是 net/minecraft/client/EntityRenderer/renderHand 这样,而生产环境是 notch 格式,比如,bfk/C,但游戏启动后,注入代理修改class格式又是 srg 格式的,比如,net/minecraft/client/EntityRenderer/field_175074,这样编写 transform 时要考虑3种情况就很头疼,所以此mod修改了tweaker加载顺序,详见 ProductPlugin.java、ModList.java,将 LaunchClassLoader 的 transforms 这个List改成自己的List,保证自己的 ClassTransformer 位于 其他 Transformer 后面,模拟了运行时注入的情况(其他Transformer应该都应用了才轮到自己的ClassTransformer修改class)。这样就不用考虑 bfk/C 这种notch格式的情况了。

-- 一稿答案 ---------

使用了JVM 的 ATTACH 机制和 java agent 功能。

我的世界是JAVA编写的游戏,使用JVM(JAVA虚拟机)运行。而JVM提供ATTACH机制允许在运行时访问JVM并通过Java agent修改加载的class和调用某些方法。

比如,Reach 长臂猿是把加载了的 PlayerControllerMP.class 的 getBlockReachDistance() 方法修改,本来是:

改成:

方块破坏距离就拉长了。

又比如,反隐身是修改 EntityPlayer.class 的 isInvisbleToPlayer(EntityPlayer player),这个实体是否对某 player 不可见:

把这方法体直接改成:

就是反隐身。

至于如何实现修改,Vape是attach上游戏进程后,加载java-agent.jar(文件名可以叫其他),jvm会加载java-agent.jar 中指定的agent类,调用其agentmain方法,传入instrumentation 实例,然后可以通过instrumentation 获取到对应class,比如上方提到的 PlayerControllerMP.class、EntityPlayer.class,使用 ASM 动态修改方法体。

具体细节可以参考:

如果你想简单修改体验一下,可以用arthas、jbe的工具,arthas在上面的文章也有提到。

arthas可以帮你完成attach、dump(获取class文件)、redefine(加载修改后的class文件)。

修改class可以是用jbe(java bytecode editor)、dex2jar等工具。

可以参考: